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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
1013
GetName()ウィンドウの半透明化について4解決


GetName()

リンク

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



この記事に返信する


pizza

リンク

2011/10/13(Thu) 16:21:34|NO.42336

SetParent hwnd1, hwnd2
で貼り付けて
PostMessageA hwnd1, 0x0000A1, 0x0002, lparam
をコメントアウトするといいかも。



pizza

リンク

2011/10/13(Thu) 16:28:55|NO.42337

いや、これじゃ半透明じゃないですね・・・。



pizza

リンク

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



GetName()

リンク

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



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