掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
MessageBoxが出ているのにビューに触れてしまうのをなくすには? (ID:71250)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> 何故このような問題が起きているのかもよく分かりません。 MessageBox って特殊用途のモーダルダイアログに過ぎない。 となると、恐らく内部では DialogBox() を使っている(少なくとも似た実装になっている)筈。 http://msdn.microsoft.com/ja-jp/library/cc410759.aspx の解説にモーダルダイアログ構築/消滅時の動作が載っている。 これを元にMessageBox()の動作を推測/コード化すると以下の感じ? int MessageBox(HWND owner, ...) { DialogBox(...) { MessageBox構築(); モーダルループ(); // [1] } } DialogBoxプロシージャBase(UINT msg, ...) { static BOOL ownerEnabled; switch (msg) { case WM_CREATE相当: ownerEnabled = IsWindowEnabled(owner, wnd); EnableWindow(owner, FALSE); break; case WM_DESTROY相当: EnableWindow(owner, ownerEnabled); // [2] Postモーダルループ終了通知(); // [3] break; } } Gignさんの操作を追いかけてみる。 > BViewでMessageBoxやモーダルダイアログを出す MessageBox(α)を構築。 上記コードの [1] まで進んでモーダルループ(a)に入る。 ownerEnabled変数 は(特殊なケースを除き)TRUE が設定されるハズ。 > SendMessageによるMessageBox MessageBox(β)を構築。 モーダルループ(a)内でメッセージが処理されて MessageBox() 関数が再度呼ばれる。 [1] まで進んでモーダルループ(b)に入る。 モーダルループ(a)と(b)はこんな関係。 主メッセージループ() { モーダルループ(a)() { モーダルループ(b)() { } } } > BViewで出していたダイアログを先に閉じると (α)の [2] でオーナーウィンドウが有効化される。 加えて、(α)の [3] でモーダルループ(a)を抜ける事を意図する(プライベート?)メッセージが投げられる。 が、現在の進行位置はモーダルループ(b)な為、結果モーダルループ(b)を抜けてモーダルループ(a)に戻る。 ↓ (β)の [3] が処理された時点でモーダルループ(a)も抜け、主メッセージループに戻る。 という感じに動いていると俺は予想する。 > MessageBoxを消すまで他には触れないようにしたい 最初のモーダルダイアログを表示する際に const BOOL enabled = IsWindowEnabled(); EnableWindow(FALSE); モーダルダイアログ表示(); EnableWindow(enabled); とでもしてやればいけるのか。 主観だが、モーダルダイアログを表示中に其れ(若しくはその子孫)以外のウィンドウをオーナとして 新たなモーダルダイアログが表示される事は仕様上想定されていない感じがする。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.