DialogBox()の親に指定するウィンドウについて

[戻る]
初心者 2006/06/29(木) 16:32:14
初歩的名質問だと思いますがよろしくお願いします。
MFC未使用のプロジェクトです。

DialogBoxやMessageBoxの引数の親ウィンドウハンドル(hParent)にはどんな値を指定すればよい
のでしょうか?
この際のダイアログはポップアップタイプです(通常)

例えばメインウィンドウ(A)の上に子ウィンドウ(B)が乗っていて、子ウィンドウ内のボタン
(C)を押した際に、ダイアログ作成される場合その親には、ABCどのウィンドウを指定するのが
適切なのでしょうか?

また、MessageBoxにはNULLを指定したりするのもたまに見かけますが、メインウィンドウや他の
ウィンドウを親にしたのとやはり動作がなにか違うのでしょうか?

よろしくお願いします。

Kerry 2006/06/29(木) 19:44:46
MessageBox()のヘルプによると、

> ダイアログボックスが表示されている場合にメッセージボックスを作成
> するときは、hWnd パラメータにダイアログボックスのハンドルを指定
> してください。hWnd パラメータで、ダイアログボックス内のコントロ
> ールなどの子ウィンドウを指定するべきではありません。

とあるので、オーナーウィンドウにはトップレベルのウィンドウを指定
すべきでしょう。
すなわち(A)を指定します。

また、MessageBox()のオーナーにNULLを指定した場合は、オーナーを
持たないので、アプリケーションのウィンドウとは独立したウィンドウ
になります。
つまり、メッセージボックスが表示されている間でも他のウィンドウを
操作することができます。

ただし、処理はあくまでモーダルであり、メッセージボックスが表示
されている間は、メインのメッセージループではなく、メッセージ
ボックスのメッセージループが回ることになります。

初心者 2006/06/30(金) 13:54:27
kerryさんどうもです。

> すなわち(A)を指定します。
なるほど、最初に作成したウィンドウですか。

現在の自分のプロジェクトだと、ボタンを押した処理部分から最初に作成したウィンドウにアクセス
するのが大変だったのですが、調べてたらこんなのを見つけました。
GetAncestor( hWnd, GA_ROOT )
いいのか悪いのかわかりませんが、とりあえず最初のウィンドウが取得できてるっぽいので使いたい
と思います。

ありがとうございました。

また、MessageBoxにNullを指定した場合の動作の件に関してもなんとなくわかった気がします。
一応プロジェクト全体のエラー表示に
MessageBox( NULL, "xxxxxエラーです", "ErrorBox", MB_OK );
みたいなのを使っていて不安があったのですが、あんまり問題ないようですね。

古いスレッドには追加発言できません。