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

この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);と試しましたが、うまくいきません。どのようにすればダイアログを閉じることができるでしょうか。
  • 初心者にもわかりやすい方法でお願いします。
回答を見る
  • ベストアンサー

ダイアログのボタンが押された時に、その「ボタン」のあるダイアログと、すでに表示されている他のダイアログを消したいです

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

  • フォームの再表示について

    VC++初心者です。 ダイアログベースのアプリケーションをつくったんですが、その後ボタンクリックでモーダルダイアログを2つ順番に表示したいと思っています。 void CMFC_testDlg::OnBnClickedButton1() {   CmyDialog myDL;   ret1 = myDL.DoModal(); } で一つ目を表示 void CmyDialog::OnBnClickedOk() {   this->ShowWindow(SW_HIDE);   CmyDialog02 myDL02;   myDL02.DoModal(); } で一つ目を隠して、2つ目を表示 さらに2つ目のダイアログのボタンを押した時、2つ目を閉じて1つ目を再表示したいと思います。 void CmyDialog02::OnBnClickedOk() {   EndDialog(-1);   CmyDialog::ShowWindow(SW_SHOW); } と書いた所エラーになります。 どこがまずいんでしょうか。 エラーメッセージ:静的でないメンバ関数の呼び出しが正しくありません VBになれてしまっているため、C++の文法でどう書いていいのかわかりません。 どなたかお教えください。

  • ダイアログ最前面表示時の後ろの画面操作について

    はじめまして。 お世話になります。 開発環境:WindowsXP VC++6.0 MFC使用 ダイアログベースで画面を作成(A.exe CDialogベース)し、その画面でボタンを押下し 子画面(A_Child)を表示させます。表示方法はDoModal()で。 そのA_ChildはCDialogベースです。 A_Childダイアログが表示されている間(最前面)は、デスクトップ上の操作を 何も出来ない様にしたいのですが、方法はありますでしょうか? (例:スタート→ログオフでダイアログが表示しますよね。 その時ってそのダイアログ以外は触れないですよね。) せめて、自分たちが作成したアプリだけでも操作不可能にしたいのです。 SetWindowPos()、ModifyStyle()、色々試しましたが上手くいきません。 DoModalで表示させるのがそもそもまちがいののでしょうか? 何か方法が有りましたらよろしくお願いします。 説明が下手ですみません。

  • ダイアログの表示について

    Cで(MFCを使用しない)Window画面をつくっているのですが まずCreateWindowでベースを作り チャイルドでCreateDialogをして 上に貼り付けています そのダイアログからボタンが押され またちいさなダイアログを表示したいのですが 新たなCreateDialogをしても表示されません どうしたらよいのでしょうか? C(MFCを使用しない)指定です。

    • 締切済み
    • CGI
  • VC++でダイアログ表示について

    VC++初心者です。 MFCアプリケーションでダイアログベースのアプリケーションを作ったのですが、ボタンクリック時にもう一つダイアログを表示しようと思っています。 以下のコードだと、うまく表示されずに画面がフリーズしてしまいます。どこを直したらいいのでしょうか。ご教授願います。 環境は、xp、Visual Studio.net 2003です。 void CMFCtestDlg::OnBnClickedButton1() {   //   CmyDialog myDL;   myDL.DoModal(); } MFCtestDlg.cpp内、#include "myDialog.h" は記述してあります。 VBの経験はあるのですが、VC++はまったくわかりません。 よろしくお願いします。

  • ダイアログの表示、非表示の切り替えについて

    環境 WIN98 VC++6.0 MFC SDIにて 1.ポップアップメニューの”ダイアログ作成”をクリックすると、 void CMainFrame::OnKNew() { CInput dlg; int iID = dlg.DoModal(); } として、ダイアログを作成します。 2.次に、ダイアログのボタン押し下げにてダイアログを非表示にします。 void CInput::OnButton1() { ShowWindow(SW_HIDE); } このようなコードにおいて、非表示状態での”ダイアログ作成”クリックでは非表示から表示に切り替えることを実現するにはどのようにすれば良いのでしょうか? よろしくお願いいたします。

  • ダイアログを自分の好きな位置に表示したい

    VCで簡単なプログラムを造っています。 ダイアログベースです。 EXE を実行した時に表示されるダイアログを、自分の指定した位置に 表示させる方法はあるでしょうか。 また、そのダイアログから DoModal関数で別のダイアログを表示する場合、 同様に、自分の指定した位置に表示させる方法はあるでしょうか。 デフォルトのままだと、1つ目のダイアログは画面の中央に、 DoModal関数で表示させたダイアログは、1つ目のダイアログの上に なります。

  • ダイアログのボタンが押せない

    環境:WinXP+VC6(SP5)+MFC アプリケーションクラスで、ダイアログを次のように表示しています。 BOOL CXXXXApp::InitInstance() { ・・・・ CXXXXDlg dlg(AfxGetMainWnd()->GetDesktopWindow()); dlg.DoModal(); ・・・・ } で、ダイアログは表示されるのですが、クリックできません。 (ディスクトップもクリックできません。) Enterなどキーイベントは問題なく処理されます。 どうすれば、クリックできるようになるでしょうか? おかしな質問で申し訳ありませんが、よろしくお願いします。

  • ダイアログを終了させてもハンドルが1つ増加したまま。。。

    VC++のMFCを使ってダイアログベースのEXEを造っています。 ハンドルのリークが発生し、困っています。 <動作内容> メインのダイアログで、ボタン押下により別のダイアログを表示します。 DoModal()でモーダルダイアログを作成します。 別のプロセスからブロードキャストされるメッセージを処理したいため、 ボタン押下のルーチンで DoModal() せずに、スレッドを作成し、 そのスレッドで DoModal() を実行しています。 スレッド作成は AfxBeginThread() を使用しています。 <サンプルソース> ●メインダイアログ // ボタン押下のルーチン void CTestModalDlg::OnButton1() { AfxBeginThread( TestDlgThread, (LPVOID)this, THREAD_PRIORITY_NORMAL ); } // スレッド static UINT TestDlgThread(LPVOID pThis) { CTestDlg1 Dlg; Dlg.DoModal(); } ●DoModal() で表示されるダイアログ 何も手を加えてない、デフォルトのまま。 <結果> DoModal() で表示されたダイアログを CDialog::OnCancel() で終了させ、 メインのスレッドが終了しても、ハンドルカウントが1つ増加しています。 Sleep() を入れて値をみてみると、 ・スレッド作成:2増加 ・DoModal() でダイアログ表示:1増加 ・OnCancel() で終了:増減なし ・スレッド終了:2減少 =>結果、1増加となっていました。 以下のパターンでは問題ありませんでした。 ・スレッドを作成+終了(ダイアログ表示しない) ・スレッドを作成せずに、ボタン押下ルーチンから DoModal() でダイアログ表示+終了 ということで、AfxBeginThread()、DoModal() 自体は問題ないのですが、 スレッドを作成して DoModal() するとリークが発生します。 識者の方、原因、対策など、ご教授願います。

  • ダイアログ、ボタンについて

    VC++でプログラミングしています。 MFC AppWizard(exe) でダイアログベースで造っています。 以下の方法を教えてください。 ・EXE起動時、ダイアログのサイズを変更したい。 起動時に画面サイズをチェックして、画面いっぱいの大きさにしたいため。 ・EXE起動後、ボタンに表示している文字列を変更したい。 識者の方、ご教授願います。

  • MFCでSDIからダイアログの呼び出し

    現在MFCでプログラムを作っているのですが、 SDIベースで作成しており、 MENUバーからMENUを選択したときに 新規(リソースに作成済み)のダイアログを 表示したいのですが、どのようにしたら よろしいのでしょうか? ヒントだけでもお願いいたします。 DoModal()とか、newを使ったら、良いのではないかという 見当だけはつけてみたのですが。 よろしくお願いいたします。