ウインドウの遷移コードについて

このQ&Aのポイント
  • ウインドウの遷移において、MFCのCDialogを使用する場合はDoModal関数を使い、ボタンが押されるまで処理が止まります。
  • 一方、通常のWindowSDKプログラミングでは、メッセージループを使用してウインドウの遷移を制御します。
  • 具体的なコーディング方法は、ウインドウを表示し、メッセージループを開始してウインドウが閉じられるまで待機し、次のウインドウを表示する、という手順で行います。
回答を見る
  • ベストアンサー

ウインドウ1→ウインドウ2→

Window1表示 ↓ Window1閉じる ↓ Window2表示 ↓ Window2閉じる ↓ Window3表示 ↓ というふうに遷移していくWindowを表示する場合、普通どういうコードになるのでしょうか? たとえばMFCのCDialogならDoModalのようにボタンが押されるまでとまるので ソース的に nRet1 = Dlg1.DoModal(); nRet2 = Dlg2.DoModal(); nRet3 = Dlg3.DoModal(); といった感じになると思いますが、普通のWindowSDKプログラミングだと メッセージループがあると思います。 その場合、どういうコーディングが一般的でしょうか?

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

  • ベストアンサー
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.3

メッセージループの場所が変わっても何の問題もありません。 例えアプリケーション内で1ヶ所にまとめてあったとしても、ダイアログやメッセージボックスを出すたびにWindowsが内部的に持つメッセージループが実行されるので同じことです。

furyfox
質問者

お礼

とても参考になりました。 ご回答有難うございました。

その他の回答 (2)

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.2

リソースファイルを使わないとなると、やり方は2種類しかありません。 1つはCreateWindows等でウィンドウを自前で作成し、その中にコントロールも自前で配置する方法。メッセージループは自分で作成する必要があります。と言っても、大変なのはメッセージループではなくコントロールの自前配置の部分だと思いますが。 もう1つは「ダイアログリソース」互換のバイナリデータ(ダイアログテンプレート)をメモリ上に用意しておいて、CreateDialogIndirectを使う方法です。こちらは通常のダイアログボックス相当なので、メッセージループを自分で書く必要はありません。

furyfox
質問者

お礼

いつもご回答頂き、大変助かります。 CreateDialogIndirectというAPIははじめてききました。そういう方法もあるのですね。 ただ今回はCreateWindowを使って 自分でコントロールも配置していく方針で行こうと思います。 有難うございました。

furyfox
質問者

補足

ところでWinMainの中で // Window1表示 CreateWindow(... ShowWindow(... UpdateWindow( while(  メッセージループ ) // Window2表示 CreateWindow(... ShowWindow(... UpdateWindow( while(  メッセージループ ) ・ ・ ・ return 0; とするのは邪道でしょうか?

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

MFCでCDialog::DoModal()を使用するというのであれば、SDKではCreateDialog系を使ってダイアログを作成するのがちょうどよいでしょう。 その場合、メッセージループはWindowsのシステム内にあるので、自前でメッセージループを作成する必要はありません。 ちなみに、数行のメッセージ+Yes/No程度の選択肢でよいのであれば、さらに規模を小さくしてMessageBoxを使うということも考えられます。MessageBoxの場合はメッセージループだけでなくメッセージ処理もWindowsのシステム内にあるので、ダイアログ表示中の処理は何も書く必要がありません。

furyfox
質問者

お礼

ご回答有難うございます。 ちょっといい忘れてしまいましたが 出来ればリソースファイルが必要なダイアログは 避けたいのです。 メッセージボックスのようなウインドウを CreateWindowで作成する事はできないでしょうか?

関連するQ&A

  • VC++.NET DLLからのダイアログの表示

    こんばんは。 VC++.NETでDLLを作成しました。 内容はダイアログを表示させるだけの単純なもので DLLの種類はMFC拡張DLLで作成しました。 (CDIALOGを継承したクラスTESTDIALOGのコンストラクタ、デストラクタがあるだけのもの) これをテスト用の単純なMFCアプリケーションで呼び出したところ ダイアログを表示させることができましたが 別の複雑なアプリケーション(DLLからDLLを呼ぶなどしている)で 呼び出したところダイアログが表示されません。 コンパイルエラーなどもでないし 何がいけないのか分かりません。 呼び出し側ではメニューにイベントハンドラを作ってそこで TESTDIALOG dlg; dlg.DoModal(); としているだけなのですが・・・ (デバッガで追ったところMFCのdlgcore.cppのCDialog::DoModalの m_lpDialogTemplateNameが不適切なptrとなる辺りに原因はありそうなのですが何故そうなるのかわかりません。) どなたかダイアログが表示されない原因がお分かりになる方 よろしくお願いします。

  • SendMessage();の使い方

    よろしくお願いします。 <環境> WIN98 VC++6.0 MFC SDIにてウィンドウをクリックすると、モードレスダイアログ1とモーダルダイア ログ2が開くようにしました。 void CMy222View::OnLButtonDown(UINT nFlags, CPoint point) { CDlg1 *dlg; dlg = new CDlg1; dlg->Create(IDD_DIALOG1); dlg->ShowWindow(SW_SHOW); CDlg2 dlg2; dlg2.DoModal(); CView::OnLButtonDown(nFlags, point); } ダイアログ2のボタン押し下げにてダイアログ1のボタン1を押し下げたいのですが 、どのようにすれば実現できるのでしょうか? void CDlg2::OnButton2() { SendMessage(); //■ここの書き方が分かりません CDialog::OnOK(); } 宜しくお願いいたします。

  • 親ウィンドウの変数の変更

    以下のようにクライアント領域をダブルクリックして、モーダルダイアログを表示し ダイアログからCPPPViewのメンバ変数flgを変更しましたが、 CPPPView内では変更結果が反映させていません。 どうしてなのでしょうか? またどうすれば変更されるようになりますか? void CPPPView::OnLButtonDblClk(UINT nFlags, CPoint point) {    CHenkouDlg dlg;    dlg.DoModal();           //  ここではflgが99になっていない    CView::OnLButtonDblClk(nFlags, point); } void CHenkouDlg::OnOK() {    CPPPView* my = (CPPPView*)GetParent();    my->flg=99;    CDialog::OnOK(); }

  • ダイアログを終了させてもハンドルが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++6.0を使用しています。 以下のようなコードでダイアログを連続して表示しようと思っています。1番目のダイアログを表示してOKボタンを押下後(このときこのダイアログは消えて)、2番目のダイアログを表示したいと思っているのですが2番目が表示できません。(1番目のところをコメントにすれば2番目は表示できます。)どうして2番目のダイアログが表示できないのでしょうか? // 1番目のダイアログ   CTest1Dlg dlg;   m_pMainWnd = &dlg;   int nResponse1 =dlg.DoModal(); // 2番目のダイアログ   CTest2Dlg dlg;   m_pMainWnd = &dlg;   int nResponse2 =dlg.DoModal(); //   if (nResponse1 == IDOK) {   :以下省略 これだけの情報でアドバイスができますでしょうか? すみません。よろしくお願い致します。

  • DLLでダイアログ

    VC++6.0にてMFCを使うDLLを作成しています。 関連HPを参考になんとかDLLを作ることが出来ました。 そこで今度はDLL側でダイアログボックスを作成して表示させようとしたところうまくいきません。 エラーも無くスルーされてしまいます。 こういう使い方は出来ないのでしょうか。 ↓DLL関数のソースファイルです。 ---------------------------------------------- #include "StdAfx.h" #include "Defs.h" #include "Func.h" #include "resource.h" #include "testdlg.h" #include "dlg2.h" int WINAPI DllFunc( CString &p_rcStr, CWnd *p_pcWnd ) { TestDlg dlg; Cdlg2 dlg2; dlg.ps = p_rcStr; dlg2.DoModal();//なにも出ない AfxMessageBox(p_rcStr);//コレはOK dlg.DoModal();//何もでない return TRUE; } --------------------------------------------

  • VC++6.0で新しいウィンドウを表示したい

    VC++6.0のダイアログベースでプログラミングを行っています。 IDC_BOTTOB6が押されたら、IDD_ABOUTBOXを表示するようにしたいのですが、 うまくいきません。 // // DialogProc - ダイアログボックス プローシジャ // LRESULT CALLBACK DlgProc(HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam) { switch (uMessage) { case WM_COMMAND: switch(LOWORD(wParam)){ case IDCANCEL: TermApp(hDlg); if (hDll != NULL) // DLLロード済み? { FreeLibrary(hDll); // DLLのハンドラ開放 } DestroyWindow(hDlg); break; case IDC_BUTTON6: { CDialog aboutDlg(IDD_ABOUTBOX); INT_PTR nRet = -1; nRet = aboutDlg.DoModal(); // Handle the return value from DoModal switch ( nRet ) { case -1: { MessageBox(NULL,"Dialog box could not be created!", NULL, MB_OK); } break; case IDABORT: // Do something break; case IDOK:{ // Do something } break; default:{ // Do something } break;                 };                } 上記のようにプログラムしていますが、コンパイルは通るのですが、実行するとエラーで落ちます。 Debug Assertion Failed Program: C:/.....test.exe File: afxwin1.inl Line: 22 何か原因が分かりましたら、ご教授頂けると幸いです。 以上、宜しくお願いします。

  • MFC、ダイアログベースでのモードレス作成

    現在、MFCで検索プログラムを作成しています。 始めはDoModalで作成していたのですが、ダイアログを閉じずに、ダイアログを複数並べて見たいという意見が出た為、モードレスで作成し直そうとしたところ、ダイアログが現れてくれません。 インターネットで見つけたソースを試してみたのですが、上手くいきません。 どなたか教えて頂けますか? =ダイアログに移るボタンコードに= CDlg1 dlg; dlg.Create(IDD_DIALOG1, this); dlg.ShowWindow(SW_SHOW); (dlg.DestroyWindow();は他に記述) 1. 上記では、ShowWindowに0が返ってしまい、一瞬ダイアログが映って 消えてしまいます。Createは1が返ってるのでいいかと思いますが…。 2. あと、違うソースで試したところ、ダイアログは表示できるものの、 一回消してしまうと、もう一度ボタンを押しても再度は表示されません。 しかも、Destroy()を設定したOKボタンでは強制終了となってしまいます。 モードレスで作成すると、一回そのダイアログを消してしまうと再度表示ができないのでしょうか? モードレスってただ他の処理ができるというだけで、そのダイアログを何枚も表示させておくことはできないのでしょうか? 3. このダイアログにjpegファイルを表示させているのですが、ダイアログベース・htmlView以外で表示させれる方法がありましたら教えて下さい。 よろしくお願いします。

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

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

  • errorC2228 CColorDialog

    開発環境はVS2008です。VC6で作成したプロジェクトをVS2008に移行中です。 そこで、下記のようなエラーがでます。 : error C2228: '.DoModal' の左側はクラス、構造体、共用体でなければなりません //下記はソースコード switch(R) { case kColor: { CColorDialog dlg(__variant(GetValue())); if (dlg.DoModal()) { ← ここででています。 SetValue(__variant(dlg.GetColor()));← ここでもでます。 } break; } case kFile: 以下、省略 なぜでしょうか?初期値の代入がおかしいのですか?VC6ではうまいこといっています。