全然更新しないブログ
HSPメモ帳
ウィンドウを透過
「ウィンドウを透過」
HSP Ver2.61で「半透明のウィンドウ作成」でも書きましたが、
HSP Ver3.0でも書いてみます。
- ウィンドウ透過方法
- 1.「SetWindowLongA」関数で、
「WS_EX_LAYERED(0x00080000)」スタイルを追加 - 例)
////////////////////////////////////////////////
//関数の登録
#uselib "user32.dll"
#func GetWindowLongA "GetWindowLongA" int , int
#func SetWindowLongA "SetWindowLongA" int , int , int
////////////////////////////////////////////////
//スタイルの追加
//GWL_EXSTYLE(-20)を取得
GetWindowLongA hwnd , -20
//WS_EX_LAYERED(0x00080000)を追加
SetWindowLongA hwnd , -20 , stat | 0x00080000 - 2.「SetLayeredWindowAttributes」関数でウィンドウ透過
- 第一引数 ウィンドウハンドル
第二引数 透明にする色
例えば、赤64(0x40)緑96(0x60)青128(0x80)の色の場合
「0x806040」となります。(BGRの順)
第三引数 透明率0~255(0が透明になりみえません 255は通常表示)
第四引数 第二引数を有効にする場合「1」第三引数を有効にする場合「2」
例)
////////////////////////////////////////////////
//関数の登録
#uselib "user32.dll"
#func SetLayered "SetLayeredWindowAttributes" int , int , int , int
////////////////////////////////////////////////
//①ウィンドウ全体を50%透明化
SetLayered hwnd , 0 , 50*255/100 , 1
////////////////////////////////////////////////
//②色が青(0xff0000)の部分を透明化
// SetLayered hwnd , 0xff0000 , 0 , 2
0を指定するとまったく見えなくなるので注意が必要です。
下のウィンドウが透けて見えるので何か作業しながら・・・
という場合に使えるかもしれません。
②は、任意の色を指定してその色を完全に透明化します。
使い様によればウィンドウの外形を変更できます。
以下、①と②のサンプルです。
①70%透過ウィンドウ 実行画面 |
![]() |
サンプル ソースコード |
//////////////////////////////////////////////// //関数の登録 #uselib "user32.dll" #func GetWindowLongA "GetWindowLongA" int , int #func SetWindowLongA "SetWindowLongA" int , int , int #func SetLayered "SetLayeredWindowAttributes" int , int , int , int //////////////////////////////////////////////// //ウィンドウ初期化 screen 0 , 300 , 200 title "ウィンドウ 70%透過" //////////////////////////////////////////////// //スタイルの追加 GetWindowLongA hwnd , -20 SetWindowLongA hwnd , -20 , stat | 0x00080000 SetLayered hwnd , 0 , 70*255/100 , 2 //背景色が黒色のほうが見やすいかな color : boxf 0 , 100 , 300 , 200 stop |
②特定色(0x000000)のみ透過 使用画像(FILE:tmp.gif SIZE:150×150) |
![]() |
②実行画面 左クリックドラッグで移動 ESCで終了 |
![]() |
サンプル ソースコード |
//////////////////////////////////////////////// //関数の登録 #uselib "user32.dll" #func GetWindowLongA "GetWindowLongA" int , int #func SetWindowLongA "SetWindowLongA" int , int , int #func SetLayered "SetLayeredWindowAttributes" int , int , int , int #func SendMessageA "SendMessageA" int , int , int , int #func PostMessageA "PostMessageA" int , int , int , int #func SetCapture "SetCapture" int #func ReleaseCapture "ReleaseCapture" //////////////////////////////////////////////// //ウィンドウ初期化 screen 0 , 150 , 150 //////////////////////////////////////////////// //タイトルバーの無いウィンドウに変更 GWL_STYLE(-16) SetWindowLongA hwnd , -16 , 0x90000000 //////////////////////////////////////////////// //スタイルの追加 GetWindowLongA hwnd , -20 SetWindowLongA hwnd , -20 , stat | 0x00080000 //黒色(0x000000)を透過 SetLayered hwnd , 0 , 0 , 1 pos 0,0 : picload "tmp.gif" , 1 //////////////////////////////////////////////// //メッセージ割り込み //クライアントエリアのドラッグでウィンドウ移動 oncmd gosub *WM_LBUTTONDOWN , 0x0201 oncmd gosub *WM_KEYDOWN , 0x0100 stop //////////////////////////////////////////////// //左クリックした時ウィンドウ移動 *WM_LBUTTONDOWN //WM_NCLBUTTONDOWN(0x00a1) HTCAPTION(0x02) PostMessageA hwnd , 0x00a1 , 0x02 , lparam return //////////////////////////////////////////////// //キーが押された時(ESC(0x1b)で終了) *WM_KEYDOWN if wparam == 0x1b{ //WM_CLOSE(0x0010) PostMessageA hwnd , 0x0010 , 0 , 0 } return |
コメント ( 6 ) | Trackback ( 0 )
« プロセス、モ... | ソケットを使... » |
黒色ではない色、例えばRGBで0,125,225のみ透過、といった事もできますでしょうか?
すみません。
この記事の全てのコードはHSP3で書いています。HSP2では、実行できません。
または、この記事のHSP3のコードをHSP2に変換したものがあるのか?ということでしょうか。
この記事をHSP2で書いたものはありませんが、「SetLayeredWindowAttributes」を使ったHSP2の記事ならあります。
半透明のウィンドウ作成 - HSP2.61
http://blog.goo.ne.jp/hiro239415/e/a1a0d04634a3709204c9a41cc4f625bd
Error 13のダイアログが出る場合、
指定のファイル(tmp.gif)を用意する必要があります。
画像を使用しないで動作確認だけする場合、29行の
pos 0,0 : picload "tmp.gif" , 1
を、下記のように描画命令に置き換えることで可能です。
color : boxf : color 0, 64, 192 : circle 30, 30, 120, 120, 1
ウィンドウ枠が表示される等の問題は、15行以下の
screen 0 , 150 , 150
SetWindowLongA hwnd , -16 , 0x90000000
を、
bgscr 0, 150, 150
に変更することで改善できる場合があります。