モーダルダイアログ表示中に親ウィンドウを一時的に隠したい – プログラミング – Home

モーダルダイアログ表示中に親ウィンドウ...
 
通知
すべてクリア

[解決済] モーダルダイアログ表示中に親ウィンドウを一時的に隠したい


いしだ
 いしだ
(@いしだ)
ゲスト
結合: 17年前
投稿: 53
Topic starter  

CMainFrameを親としたモーダルダイアログを出している最中、
CMainFrame自体を見えなくする方法は無いかと調査しています。

それに近いことをやっているのがSpy++です。
ウィンドウ検索のモーダルダイアログを出している最中、
「Spy++を非表示」のチェックボックスをオンにすると
メインウィンドウが非表示なります。

ただし、Spy++はタスクバーからも消えてしまいます。
タスクバーにはアプリケーション自身は残し、
それをクリックすると、CMainFrameが表示されていると同じように、
モーダルダイアログ自体がアクティブになるようにしたいです。

一時的にCMainFrameのサイズを
MovwWindowなどでゼロにすればよいかなとは思ったのですが、
どうやってもゼロにできませんでした。
タイトルバーがあると一定サイズ以下にはできず、
とりあえずタイトルバーを外してみても、1~2ピクセルは見えてしまうようです。

なにかよい方法はありませんでしょうか。


引用未解決
トピックタグ
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

さて、困ったものですね。
一見アイコン化すれば行けるのでは思ってしまいますが、
親をアイコン化(SC_MINIMIZE)すると、DLGも見えなくなってしまいます(vv;)。

親を非表示(SW_HIDE)すると確かに消えますが、おっしゃる通り
タスクバーからも消えてしまいます(笑)。

正解は「デスクトップ範囲外に追い出す」ですね。
左側でも、右側でも結構ですよ。
この状態のときに「アイコン化」のWM_SIZEがきたら、
リストア相当の動作をさせましょう。


返信引用
kinoko
 kinoko
(@kinoko)
ゲスト
結合: 13年前
投稿: 4
 

ウインドウをデスクトップの外に移動させる手法はよく使いますね。
他には、リージョンを設定する方法もあります。

SetWindowRgn( hWnd, CreateRectRgn( 0, 0, 0, 0 ), TRUE );// ウィンドウを消す
SetWindowRgn( hWnd, NULL, TRUE );// ウィンドウを戻す

その他、少し面倒ですが、動作環境をwin2k以降に限定できるなら、
SetLayeredWindowAttributesを使ってアルファ値を0にしてしまう方法も考えられます。

ただし、この方法は他の方法に比べて反応が遅い上、LoadLibraryやFreeLibraryが必要にな
り、
さらにウィンドウに対して、アルファ指定の有効の有無を指定する必要があります。

SetWindowLongPtr( hWnd, GWL_EXSTYLE, GetWindowLongPtr( hWnd, GWL_EXSTYLE ) |
WS_EX_LAYERED );// アルファ指定を有効にする
SetWindowLongPtr( hWnd, GWL_EXSTYLE, GetWindowLongPtr( hWnd, GWL_EXSTYLE ) &
~WS_EX_LAYERED );// アルファ指定を無効にする

ご参考まで。


返信引用
いしだ
 いしだ
(@いしだ)
ゲスト
結合: 17年前
投稿: 53
Topic starter  

お二方ありがとうございます。
リージョンの方法は、ダイアログをDoModalする前後に1行ずつ入れるだけで、
なにも憶えておくべき値が無くて楽ですね。

デスクトップの外に表示させる方法も確認させていただいたのですが、
モーダルダイアログ表示前にCMainFrame自身で移動させてしまうと、
ダイアログが当初の位置(フレームウィンドウの中央)に初期表示されず、
また、「デスクトップ外の領域」の値というものも
ユーザの環境によっていろいろなケースが出てきそうなので、
今回はリージョンの方法でやってみようかと思います。

(上記の自分が調べきれなかった部分も、「こんなに簡単だよ」なことであれば、
参考までに解説いただければ大いに参考にさせていただきます)


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました