実現したい内容は以下のとおりです。
あるメニューを選択したらモードレスダイアログAが表示され、ダイアログA上の閉じる
ボタンが押されたらダイアログAが閉じて、モードレスダイアログBが表示されるように
したいのですが、今は2つとも表示されていまいます。
ソースは以下のとおりです、よろしくお願いします。
void Menu1()
{
CDlgA *pdlg = new CDlgA();
pdlg->Create(CDlgA::IDD);
CDlgB *pdlg2 = new CDlgB();
pdlg2->Create(CDlgB::IDD);
}
モードレスダイアログは、リソース側に可視の指定がある場合、Createしたらすぐに
表示されます。しかもモードダルと違って閉じるまでCreateから帰ってこないということは
ありません。作成が出来たらすぐに戻ってきます。
ですから、今のプログラムでは二つとも表示されて当然なのです。
モードレスにする必要がどうしてあるのかが良くわかりませんが、
モードレスダイアログに言われているような事がしたいのであれば、
Menu1では、ダイアログAだけをCreateするようにして
ダイアログAが終わる時にメインウインドウに自分が終了する事を伝えて
メインウインドウはその通知を受けてダイアログBを出すようにしないと
無理ではないかと思います。
ところで、ここでnewしたダイアログのインスタンスはきちんとdeleteされていますか?
deleteしていないとメモリリークしそうですけれど。
(T-T)誤字がー。
誤)
表示されます。しかもモードダルと違って閉じるまでCreateから帰ってこないということは
正)
表示されます。しかもモーダルと違って閉じるまでCreateから帰ってこないということは
誤)
モードレスダイアログに言われているような事がしたいのであれば、
正)
モードレスダイアログで言われているような事がしたいのであれば、
> 今は2つとも表示されていまいます。
というか、提示されているコードは、そのような動作になるコードそのものなので、
当然の結果かと。
ダイアログAの閉じるボタンが押されたときに、親(メインフレームなど)にメッセージを投
げ、
メインフレーム側でそのメッセージを受けた場合に、ダイアログを開くようにしてはどうでしょ
うか?
#はずしていたらごめんなさい。
#pDlgAはnewされているけど、deleteってできているのだろうか?
#なんとなく、メモリリークしていきそうな気が。
さっそくのお返事ありがとうございました。
やはり呼ぶ側からなんらかの制御をしないと無理ですよね。
2つのダイアログは共通で他からも呼ばれると云う仕様だったのでうなされておりました
が、CDlgAの中でCDlgBを呼ぶ仕様でかまわないということになったのでその方法を取らせ
ていただきました。
ちょっと気になったので一言。
> CDlgAの中でCDlgBを呼ぶ仕様でかまわないということになったので
この方法の場合、CDlgBのインスタンスは何処で持つのでしょう?
CDlgAの中で持つという事になるとCDlgBが不要になるまで呼び出し元のCDlgAの
インスタンスも存続している必要があると思いますけれど。
モードレスダイアログのインスタンスがウインドウが破棄されるときに自殺する構造なら
良いと思いますけれど、そうでない場合は注意が必要です。
Webで紹介されているモードレスダイアログは自殺クラスになっている事が多いようなので
多分、大丈夫なんでしょうけれども。