|
 |
|
2011/10/13(Thu) 16:05:03|NO.42335
ウィンドウの透明化に関する質問です
SetLayeredWindowAttributes関数を用いると
アクションフラグによって
・ウィンドウ全体の半透明化
・指定色の完全透明化
は可能です。今回質問したいことは
・背景のみ半透明化
は可能か、可能ならばどのように行えばよいのか ということです。
ウィンドウの半透明化をしてしまうと、半透明にしたくないもの
(ボタンなどのコントロール、mes命令などで表示した文字列等)
まで半透明化されてしまうため見づらくなってしまうのです。
自分で考えた方法としては
①背景となる枠無しウィンドウ(ウィンドウA)を用意し、半透明化する
②ウィンドウAにぴったり重なるようにウィンドウBをつくる
③ウィンドウBの背景を単色で塗りつぶし、その色を完全に透明にする。
この方法だと確かに背景のみ半透明にすることができますが
・ウィンドウの移動処理
・ウィンドウAとウィンドウBの前後関係、どちらを手前に表示するか の処理
など、面倒な点が数多く出てきてしまいました。
単色を完全に透明にしたウィンドウの中に
半透明化したパネルを背景として表示し、その上に通常のボタンなどを配置することを
考えましたが、パネルの設置方法などが検索しても分からなかったためここで質問させていただきます
何か良い方法などありましたらお教えください。
一応以下に自分の作ったものを張っておきます
//関数の登録
#uselib "user32.dll"
#func GetWindowLongA "GetWindowLongA" int , int
#func SetWindowLongA "SetWindowLongA" int , int , int
#func SetLayeredWindowAttributes "SetLayeredWindowAttributes" int , int , int , int
#func SendMessageA "SendMessageA" int , int , int , int
#func PostMessageA "PostMessageA" int , int , int , int
//ウィンドウ初期化
//背景ウィンドウ
bgscr 0, 700, 100, , 100, 100 : hwnd1 = hwnd
cls 4
color 255, 255, 255
pos 10, 10 : button goto "終了する", *LAST
pos 80, 10 : mes "←通常はこのように描画した文字やオブジェクトまで半透明になってしまいます"
//コンポーネントウィンドウ
bgscr 1, 700, 100, , 100, 100 : hwnd2 = hwnd
color 0, 0, 255 : boxf
color 255, 255, 255
pos 10, 40 : button goto "終了する", *LAST
pos 80, 40 : mes "←手前にもう一つウィンドウを作ることで上記の問題を回避しています\n ウィンドウの移動をすると表示がおかしくなります"
//スタイルの追加
GetWindowLongA hwnd1 , -20
SetWindowLongA hwnd1 , -20 , stat | 0x00080000
GetWindowLongA hwnd2 , -20
SetWindowLongA hwnd2 , -20 , stat | 0x00080000
//半透明
SetLayeredWindowAttributes hwnd1, 0x000000, 128, 2
//青色(0x0000FF)を完全に透明に
SetLayeredWindowAttributes hwnd2, 0xFF0000, 255, 1
//WMの処理
gsel 0
oncmd gosub *WM_LBUTTONDOWN , 0x0201
gsel 1
oncmd gosub *WM_LBUTTONDOWN , 0x0201
stop
//左クリックした時ウィンドウ移動
//ウィンドウ1とウィンドウ2の位置がずれるため表示がおかしくなる
*WM_LBUTTONDOWN
PostMessageA hwnd1, 0x0000A1, 0x0002, lparam
PostMessageA hwnd2, 0x0000A1, 0x0002, lparam
return
//終了処理
*LAST
end

| |
|
2011/10/13(Thu) 16:21:34|NO.42336
SetParent hwnd1, hwnd2
で貼り付けて
PostMessageA hwnd1, 0x0000A1, 0x0002, lparam
をコメントアウトするといいかも。
|
|
2011/10/13(Thu) 16:28:55|NO.42337
いや、これじゃ半透明じゃないですね・・・。
|
|
2011/10/13(Thu) 16:55:08|NO.42338
手前のウィンドウのWM_MOVINGを処理して背景用ウィンドウを動かすのはだめですか?
#define WM_MOVING 0x0216
#define SWP_NOSIZE 0x0001
#define SWP_NOZORDER 0x0004
#define SWP_NOACTIVATE 0x0010
gsel 1
oncmd gosub *lb_OnMoving, WM_MOVING
*lb_OnMoving
dupptr rc, lparam, 16
SetWindowPos hwnd1, 0, rc.0, rc.1, 0, 0, SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOSIZE
return
|
|
2011/10/13(Thu) 17:05:01|NO.42339
SWP_NOACTIVATE
SWP_NOZORDER
SWP_NOSIZE
なるほど・・こんなオプションがあったとは・・・
出来ました!ありがとうございました!!
//関数の登録
#uselib "user32.dll"
#func GetWindowLongA "GetWindowLongA" int , int
#func SetWindowLongA "SetWindowLongA" int , int , int
#func SetLayeredWindowAttributes "SetLayeredWindowAttributes" int , int , int , int
#func SendMessageA "SendMessageA" int , int , int , int
#func PostMessageA "PostMessageA" int , int , int , int
#func SetWindowPos "SetWindowPos" int, int, int, int, int, int, int
#define WM_LBUTTONDOWN 0x0201
#define WM_MOVING 0x0216
#define SWP_NOSIZE 0x0001
#define SWP_NOZORDER 0x0004
#define SWP_NOACTIVATE 0x0010
//背景ウィンドウ
bgscr 0, 700, 100, , 100, 100 : hwnd1 = hwnd
cls 4
color 255, 255, 255
//コンポーネントウィンドウ
bgscr 1, 700, 100, , 100, 100 : hwnd2 = hwnd
color 0, 0, 255 : boxf
color 255, 255, 255
pos 10, 40 : button goto "終了する", *LAST
pos 80, 40 : mes "できました! ありがとうございました"
//スタイルの追加
GetWindowLongA hwnd1 , -20
SetWindowLongA hwnd1 , -20 , stat | 0x00080000
GetWindowLongA hwnd2 , -20
SetWindowLongA hwnd2 , -20 , stat | 0x00080000
//半透明
SetLayeredWindowAttributes hwnd1, 0x000000, 128, 2
//青色(0x0000FF)を完全に透明に
SetLayeredWindowAttributes hwnd2, 0xFF0000, 255, 1
//WMの処理
gsel 1
oncmd gosub *LBUTTONDOWN , WM_LBUTTONDOWN
oncmd gosub *MOVING, WM_MOVING
stop
*MOVING
dupptr rc, lparam, 16
SetWindowPos hwnd1, 0, rc.0, rc.1, 0, 0, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE
return
*LBUTTONDOWN
PostMessageA hwnd2, 0x0000A1, 0x0002, lparam
return
*LAST
end

| |
|