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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0329
(´ω`)描画が終わるまで待ちたい……3解決


(´ω`)

リンク

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が一瞬でも表示されてしまってるから、それを消して
直後にキャプチャすれば必然的に画面の描画途中になってしまう、と!
おっしゃるとおりに直したらウェイトなしでキレイにいけました!なるほど!

>てれてれ さま

ああん!(*゚ω゚*)最初から黒の半透明ウィンドウにすれば、キャプチャする
必要すらないと!もうなんか、オレなにやってんだという!


大変勉強になりました。
お二人ともに、激しく感謝であります……(*´ω`*)



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