HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0615
tree額縁のような縁のあるbgscr9解決


tree

リンク

2011/6/15(Wed) 19:05:45|NO.39673

screen では薄い灰色で縁取りされて見えます。
bgscr では縁取りない四角形です。
この bgscr に色(赤、黒、任意)の付いた縁をつけたい、その幅
を任意に決めたいと思います。

簡単に言うと、色付きの額縁のような bgscr を作りたいのです。
よろしくお願い申し上げます。



この記事に返信する


たんす

リンク

2011/6/15(Wed) 19:43:43|NO.39674

このような感じでしょうか。

#define margX 5//横方向余白 #define margY 5//縦方向余白 #define scrX 600//枠内横幅 #define scrY 400//枠内縦幅 bgscr 0,2*margX+scrX,2*margY+scrY color 255,0,0 :boxf//外枠色で画面全体を塗りつぶす color 0,0,0 :boxf margX,margY,margX+scrX,margY+scrY//枠の内側だけを基準の色で塗りつぶす
縦横の余白分bgscrの初期化サイズを拡げて、余白部分を塗りつぶしました。
以降、余白分を気にしながら座標管理しなければならないのが難点ですが。



tree

リンク

2011/6/15(Wed) 20:23:59|NO.39676

最初の質問の文章が言い足りなくて、すみません。

額縁のbgscrを作ってから、

#include "user32.as"
#func SetLayered "SetLayeredWindowAttributes" int , int , int , int

bgscr 0,ginfo(20), ginfo(21)
GetWindowLong hwnd, -16 // 移動
SetWindowLong hwnd, -16, stat | $10000 | $40000
このようなウィンドウスタイルの変更文を加えて、
可変サイズbgscrを目指しております。

それを言わなくて申し訳ありません。
提示いただいたようなことは試みておりました。サイズを変えると
ばらばらになります。

何とかなりますでしょうか?



whoさん

リンク

2011/6/15(Wed) 21:04:15|NO.39678

普通のウィンドウからタイトルバーを消すのはどうですか?



たんす

リンク

2011/6/15(Wed) 22:01:23|NO.39679

返信を頂いてから、
「タイトルバーを消して、枠色を変更すれば」と思い探していましたが
枠色の変更方法を見つけられませんでした。


「メインウィンドウ(bgscr)の裏に枠の分だけ広いウィンドウを置いて、
メインウィンドウのサイズ変更に追従する」という方法はいかがでしょうか。



whoさん

リンク

2011/6/15(Wed) 22:12:00|NO.39680

枠の色は変えられないはずでは?



GENKI

リンク

2011/6/15(Wed) 23:50:20|NO.39682

> screen では薄い灰色で縁取りされて見えます。

水色ベースのグラデーションに見えます。Vistaでは。多分7でも。
この部分はOSに任されている部分なのでどうしようもないかと思います。
デスクトップのテーマを変更すればいいのかな?でも勝手にそんなことしたらユーザーに怒られますが。
もしかしたら何か方法があるのかもしれませんが、とりあえず思いつかないのでたんすさんベースで書いてみました。

#include "user32.as" #func SetLayered "SetLayeredWindowAttributes" int , int , int , int #define margX 5//横方向余白 #define margY 5//縦方向余白 #define scrX 600//枠内横幅 #define scrY 400//枠内縦幅 bgscr 0,2*margX+scrX,2*margY+scrY GetWindowLong hwnd, -16 // 移動 SetWindowLong hwnd, -16, stat | $10000 | $40000 ;Windowsメッセージ割り込み #define WM_SIZE $5 ;ウィンドウのサイズが変更されたウィンドウに送られる oncmd gosub *On_WM_SIZE, WM_SIZE ;ウィンドウのサイズ変更 wait 0 : width ginfo_winx,ginfo_winy stop *On_WM_SIZE l = lparam<<16>>16 ; 下位ワード サイズ変更後のクライアント領域のウィンドウ幅 h = lparam>>16 ; 上位ワード サイズ変更後のクライアント領域のウィンドウ高さ color 255,0,0 :boxf//外枠色で画面全体を塗りつぶす color 0,0,0 :boxf margX,margY, l-margX,h-margY//枠の内側だけを基準の色で塗りつぶす color 0,255 return
解説は入れてないので自分で調べてね。

あ、一つ思いつきました。
ウィンドウリサイズをOSに任せないで自前でマウス操作取得して、widthでリサイズすればご希望のものが出来ると思います。とってもめんどくさいですが。



木村

リンク

2011/6/16(Thu) 06:34:29|NO.39689

 whoさんに同じく枠の色を変える事はできない、というよりWindows全体で同じ枠の色を共有してしまっている気がします。
 理由としては、ウィンドウの枠の色が取得できると思われるgetsyscolor関数なる物があるのですが、このgetsyscolor関数はハンドル値を引数に取らないのです。普通、ハンドル毎に別々の値を持つようなデータを取得する関数には、大概ハンドル値が引数に指定されています。
 ですので、システムの段階で枠の色を変えるのは諦めて、小手先の技術で枠っぽい物を作るしかないかと思います。

 一応、screen命令のウィンドウをベースに、透明なbgscr命令製のウィンドウを重ねるスクリプトを作ってみました。以下は一例

#include "user32.as" //kernelとの住み分けが分からない #define WM_SIZE 0x0005 //ウィンドウの大きさを変えると届くメッセージ #define WM_MOVE 0x0003 //ウィンドウの位置を動かすと届くメッセージ #define WM_LBUTTONDOWN 0x0201 //左クリックすると届くメッセージ #define WM_LBUTTONUP 0x0202 //左クリックを解除すると届くメッセージ #define SIZE_RESTORED 0 //ウィンドウの大きさが変わったフラグ #define SIZE_MINIMIZED 1 //ウィンドウが最小化されたフラグ #define SIZE_MAXIMIZED 2 //ウィンドウが最大化されたフラグ #define SIZE_MAXSHOW 3 //無用 #define SIZE_MAXHIDE 4 //同上 #define argb(%1) /*ARGB型の整数値からcolor命令を作るマクロ*/ \ color ((%1)&$00ff0000)>>16, ((%1)&$0000ff00)>>8, (%1)&$000000ff #define BASE_WINDOW 1 #define FRAME_WINDOW 2 #define ISX 640 #define ISY 480 #define RSX 320 #define RSY 240 #define BLACK $000000 #define SCARLET $FF0020 //ID0番のウィンドウはサイズ固定なので消去 screen 0, , , 2 //ID1番のウィンドウを作成 screen BASE_WINDOW, ISX, ISY, 0, , , RSX, RSY //こちらが本題 oncmd goto *サイズ, WM_SIZE oncmd goto *ムーヴ, WM_MOVE gosub *四尺測定 //4つの変数を測定する mouse wx1+100, wy1+100 wait 3 rsxl = ginfo_mx-mousex-wx1 //ID1番の左の枠余白 rsxr = sizex-320-rsxl //ID1番の右の枠余白 rsyu = ginfo_my-mousey-wy1 //ID1番の上の枠余白 rsyd = sizey-240-rsyu //ID1番の下の枠余白 handle = hwnd //ID1番のハンドル値 gosub *ID2番作成 //これは他の場所でも使うのでサブルーチンに stop //擬似的な枠となるID2番のウィンドウを作成するサブルーチン *ID2番作成 bgscr FRAME_WINDOW, sizex, sizey-rsyu+rsyd, 8, wx1, wy1+rsyu-rsyd gsel FRAME_WINDOW, 2 //ID2番の表示順位を最大に GetWindowLong hwnd,-20 SetWindowLong hwnd,-20,stat|$80000 SetLayeredWindowAttributes hwnd, BLACK, 255, 3 //黒を透明色に argb BLACK boxf argb SCARLET boxf 2, 2, sizex-3, sizey-rsyu+rsyd-3 argb BLACK boxf rsxl, rsyd, sizex-rsxr, sizey-rsyu //拡大縮小ができるように、左クリックの入力と解放をID1番の //ウィンドウに送るような仕組みにしたつもりだが上手く動かず oncmd *左クリック入力, WM_LBUTTONDOWN oncmd *左クリック解放, WM_LBUTTONUP return //wx1,wy1,sizex,sizeyの4変数の値を取得するサブルーチン *四尺測定 gsel BASE_WINDOW wx1 = ginfo_wx1 wy1 = ginfo_wy1 sizex = ginfo_sizex sizey = ginfo_sizey return //サイズ変更時に飛んでくるラベル *サイズ if (wparam=SIZE_MAXSHOW) | (wparam=SIZE_MAXHIDE) : stop gosub *四尺測定 gosub *ID2番作成 stop //ウィンドウ移動時に飛んでくるラベル *ムーヴ gsel FRAME_WINDOW width , , (lparam&$FFFF)-rsxl, ((lparam>>16)&$FFFF)-rsyd stop //左クリックした時に飛んでくるラベル *左クリック入力 sendmsg handle, WM_LBUTTONDOWN, wparam, lparam stop //左クリックを解除した時に飛んでくるラベル *左クリック解放 sendmsg handle, WM_LBUTTONUP, wparam, lparam stop



tree

リンク

2011/6/16(Thu) 21:15:34|NO.39692

木村さん
> whoさんに同じく枠の色を変える事はできない
> getsyscolor関数はハンドル値を引数に取らないのです

基本的には Widnows では出来ないことですか。うんー、いくら
探しても見つからないわけでした。

擬似的には見事に出来るのでびっくりし、
勉強させていただきました。
ありがとうございます。



tree

リンク

2011/6/16(Thu) 21:49:35|NO.39693

GENKIさんに返事が遅れて申し訳ありません。

プログラムを動かしてみたのですが、うまく私のところで動かなくて、
検討しておりました。

bgscr 0,2*margX+scrX,2*margY+scrY
GetWindowLong hwnd, -16 // 移動
SetWindowLong hwnd, -16, stat | $10000 | $40000

この部分を、以下のように変更して

bgscr 0, ginfo(20), ginfo(21)
GetWindowLong hwnd, -16 // 移動
SetWindowLong hwnd, -16, stat | $10000 | $40000
width 2*margX+scrX,2*margY+scrY

無事動きました。

これもすばらしいです。勉強になりました。

皆さん、ありがとうございます。



ONION software Copyright 1997-2023(c) All rights reserved.