描画が終わるまで待ちたい……
(´ω`) 2013/3/29(Fri) 18:40:34|NO.53331
最前面に表示され、なにか選択項目を選ばない限り他ウィンドウをクリックできない、
というもの(ダイアログもどきですね)を作ろうかと思い、色々ググって作りかけて
みたわけです。
画面全体にシャドウをかけたような感じが実現でき、これはカコイイと自画自賛してた
のですが……
#uselib "gdi32.dll"
#cfunc CreateDC "CreateDCA" sptr,sptr,sptr,int
#func DeleteDC "DeleteDC" int
#func BitBlt "BitBlt" int,int,int,int,int,int,int,int,int
#define NULL 0
#define SRCCOPY 0x00CC0020
#define CAPTUREBLT 0x40000000
#include "user32.as"
// setwindowlong
#const WS_EX_NOACTIVATE $08000000 // クリックしてもアクティブにならない タスクバーに表示されなくなる。
#const GWL_EXSTYLE $FFFFFFEC // EXSTYLEに設定する
// setwindowpos
#const HWND_TOPMOST $FFFFFFFF // 最前面に設定する
#const SWP_NOMOVE $00000002 // サイズ変更無効
#const SWP_NOSIZE $00000001
#const SWP_FRAMECHANGED $00000020
#define SWP_SHOWWINDOW $00000040
// 非表示でウィンドウを作成
// 画面全体をキャプチャし擬似的に半透明っぽく見せる
dtX = ginfo_dispX : dtY = ginfo_dispY
bgscr 0, dtX, dtY, 2, 0, 0 : cls 4
bgscr 1, dtX, dtY : gsel 1, -1 : wait 10 ; ← こいつ
; デスクトップ画面のデバイスコンテキスト取得
hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL)
; デスクトップ画面の画像をコピー
BitBlt hdc, 0, 0, dtX, dtY, hdcScreen, 0, 0, SRCCOPY | CAPTUREBLT
; デバイスコンテキスト削除
DeleteDC hdcScreen
; バッファを半透明でコピー
gmode gmode_alpha, dtX, dtY, 128
gcopy 0, 0, 0
// Styleを追加。
GetWindowLong hwnd,GWL_EXSTYLE
SetWindowLong hwnd,GWL_EXSTYLE,stat|WS_EX_NOACTIVATE
// 最前面化 ウィンドウ表示 Styleの更新を行う。
SetWindowPos hwnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_FRAMECHANGED|SWP_SHOWWINDOW
gsel 1, 1
dialog "どうね"
end
27行目の「← こいつ」で示したウェイトを入れないと、画面の描画途中の
キャプチャになってしまいすっごくダサくなってしまう。しかしこのウェイト値、
0.1秒近くも待つ必要はないだろという気もするのです。
ていうか、キャプチャするときって描画完了を待てないのかなあと。
HSPの質問ってわけではないのですが、もしよろしければヒントでもご教示いただければ。
よろしくお願いいたします。(u´ω`)
暇人 2013/3/29(Fri) 20:03:17|NO.53334
> bgscr 1, dtX, dtY : gsel 1, -1 : wait 10 ; ← こいつ
ここで一度見えるウィンドウが画面全体に出てる
直ぐにgsel 1, -1しても消えるまでは時間がかかる
最初から非表示で作れば良い
それでもエディタからの起動だとスクリーン0が写りこむ事があるが
最初に #packopt hide 1 書いて実行ファイルにすればで非表示にできる
てれてれ 2013/3/29(Fri) 20:49:10|NO.53336
擬似的というかそのまんま半透明にする方法があります。
#uselib "gdi32.dll"
#cfunc CreateDC "CreateDCA" sptr,sptr,sptr,int
#func DeleteDC "DeleteDC" int
#func BitBlt "BitBlt" int,int,int,int,int,int,int,int,int
#define NULL 0
#define SRCCOPY 0x00CC0020
#define CAPTUREBLT 0x40000000
#include "user32.as"
// setwindowlong
#const WS_EX_NOACTIVATE $08000000 // クリックしてもアクティブにならない タスクバーに表示されなくなる。
#const GWL_EXSTYLE $FFFFFFEC // EXSTYLEに設定する
#define WS_EX_LAYERED 0x80000 // レイヤードウィンドウ
#define LWA_ALPHA 0x2
// setwindowpos
#const HWND_TOPMOST $FFFFFFFF // 最前面に設定する
#const SWP_NOMOVE $00000002 // サイズ変更無効
#const SWP_NOSIZE $00000001
#const SWP_FRAMECHANGED $00000020
#define SWP_SHOWWINDOW $00000040
// 非表示でウィンドウを作成
// 画面全体をキャプチャし擬似的に半透明っぽく見せる
dtX = ginfo_dispX : dtY = ginfo_dispY
bgscr 1, dtX, dtY : boxf //黒く塗りつぶしておく
// Styleを追加。
GetWindowLong hwnd,GWL_EXSTYLE
SetWindowLong hwnd,GWL_EXSTYLE,stat | WS_EX_LAYERED | WS_EX_NOACTIVATE
// 最前面化 ウィンドウ表示 Styleの更新を行う。
SetWindowPos hwnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_FRAMECHANGED|SWP_SHOWWINDOW
SetLayeredWindowAttributes hwnd, 0, 128, 2 //ウィンドウそのものを半透明に(Windows 2000以降でのみ動作)
//SetLayeredWindowAttributesの第三パラメータをいじることで透明度を変更出来ます。(0-255)
gsel 1, 1
dialog "どうね"
end
(´ω`) 2013/3/29(Fri) 21:06:23|NO.53337
>暇人 さま
ああ!( ゜ω゜ )screen1が一瞬でも表示されてしまってるから、それを消して
直後にキャプチャすれば必然的に画面の描画途中になってしまう、と!
おっしゃるとおりに直したらウェイトなしでキレイにいけました!なるほど!
>てれてれ さま
ああん!(*゜ω゜*)最初から黒の半透明ウィンドウにすれば、キャプチャする
必要すらないと!もうなんか、オレなにやってんだという!
大変勉強になりました。
お二人ともに、激しく感謝であります……(*´ω`*)