Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
  • ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ダイアログのボタンが押された時に、その「ボタン」のあるダイアログと、すでに表示されている他のダイアログを消したいです)

ダイアログのボタンが押された時に、ダイアログを消す方法

このQ&Aのポイント
  • Win2000/MFC/ダイアログベースで作業しており、初心者です。Aというダイアログで「あるボタンa」を押してDoModalでBというダイアログを表示させ、Bダイアログで「あるボタンb」を押してDoModalでCというダイアログを表示させ、Cダイアログで「あるボタンc」を押すとBダイアログとCダイアログを閉じたいのですが、EndDialogではうまく閉じることができません。
  • DoModalの戻り値をret_b,ret_cとして、EndDialog(ret_c); EndDialog(ret_b);と試しましたが、うまくいきません。どのようにすればダイアログを閉じることができるでしょうか。
  • 初心者にもわかりやすい方法でお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • uoot
  • ベストアンサー率75% (6/8)
回答No.1

各ダイアログボックスを CDialog の派生クラスとして次のように定義したとします。 CDlgA --- A というダイアログボックス CDlgB --- B というダイアログボックス CDlgC --- C というダイアログボックス CDlgA のあるメンバ関数から CDlgB::DoModal() でダイアログボックス B を表示させます。 CDlgB のあるメンバ関数で EndDialog() を実行すればダイアログボックス B を閉じることができます。ここで、 CDialog::EndDialog() は引数として INT 型の値をひとつ渡すことができますが、その値が先の CDlgB::DoModal() の戻り値となります。 戻り値がある特定の値だったとき、つまり、質問の例ではダイアログボックス B で EndDialog(ret_b) が実行されたことが特定できたときに CDlgA も EndDialog() を実行すれば連鎖してダイアログボックスを閉じることができます。 ダイアログボックス C についても同様です。 実際のコーディングでは次のようになると思います。 ただし、ダイアログボックス A もモードレスで表示されていると仮定しています。 #define ret_b (-1) // 特定の値 #define ret_c (-1) // ID_OK や ID_CANCEL と重ならないように注意 ... (CDlgA の実装) void CDlgA::OnButtonA() // あるボタン a が押されたときの処理 { CDlgB dlg; // ダイアログボックス B if (dlg.DoModal() == ret_b) // モードレスで表示して、戻り値をチェック EndDialog(-1); // ダイアログボックス A を閉じる } ... (CDlgB の実装) void CDlgB::OnButtonB() // あるボタン b が押されたときの処理 { CDlgC dlg; // ダイアログボックス C if (dlg.DoModal() == ret_c) // モードレスで表示して、戻り値をチェック EndDialog(ret_b); // ダイアログボックス B を閉じる } ... (CDlgC の実装) void CDlgC::OnButtonC() // あるボタン c が押されたときの処理 { EndDialog(ret_c); // ダイアログボックス C を閉じる }

yama_natu
質問者

お礼

ありがとう御座いました。 できました!

すると、全ての回答が全文表示されます。

関連するQ&A