goo

ウィンドウを透過

◆一覧リスト
HSP Ver3.0
HSP Ver2.61
ブログ関連
その他
★人気blogランキング

「ウィンドウを透過」
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 )
« プロセス、モ... ソケットを使... »
 
コメント
 
 
 
透過色の指定方法 (通りすがり)
2012-11-23 10:04:07
ここで特定色を透過するサンプルを掲載されていますが、
黒色ではない色、例えばRGBで0,125,225のみ透過、といった事もできますでしょうか?
 
 
 
Unknown (通りすがり)
2012-11-23 13:46:28
先ほどの件、自己解決しました。
すみません。
 
 
 
これは (おいおい)
2014-02-22 15:07:14
これ、HSP2でやっていませんか?
 
 
 
Re:これは (hiro)
2014-02-23 23:31:24
この記事が、HSP2で書かれているのか?ということでしょうか。
この記事の全てのコードはHSP3で書いています。HSP2では、実行できません。

または、この記事のHSP3のコードをHSP2に変換したものがあるのか?ということでしょうか。
この記事をHSP2で書いたものはありませんが、「SetLayeredWindowAttributes」を使ったHSP2の記事ならあります。

半透明のウィンドウ作成 - HSP2.61
http://blog.goo.ne.jp/hiro239415/e/a1a0d04634a3709204c9a41cc4f625bd
 
 
 
Unknown (Unknown)
2016-06-08 20:54:20
出来ねぇぞ。特に下の色指定透明。
 
 
 
Unknown (hiro)
2016-06-11 23:03:25
2番目のサンプルソースコードは、画像ファイルを使います。
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
に変更することで改善できる場合があります。
 
コメントを投稿する
 
名前
タイトル
URL
コメント
コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。