MODELESS サンプル : モードレス ダイアログ ボックスとしての CDialog オブジェクトの使用

更新 : 2007 年 11 月

MODELESS サンプルでは、MFC CDialog オブジェクトをモードレス ダイアログ ボックスとして使用する例を示します。MODELESS は、単純なダイアログ ベースのアプリケーションです。メイン ダイアログ ボックスのリスト ボックスを管理し、メイン ウィンドウのリスト ボックスに文字列を追加するためのモードレス ダイアログ ボックスを提供します。

zhk0y9cw.alert_security(ja-jp,VS.90).gifセキュリティに関するメモ :

このサンプル コードは概念を示す目的で提供されているものです。必ずしも最も安全なコーディング手法に従っているわけではないので、アプリケーションまたは Web サイトでは使用しないでください。Microsoft は、サンプル コードが意図しない目的で使用された場合に、付随的または間接的な損害について責任を負いません。

サンプルとそのインストール手順を取得するには

  • Visual Studio で、[ヘルプ] メニューの [サンプル] をクリックします。

    詳細については、「サンプル ファイルの格納場所」を参照してください。

  • 使用できるサンプルの最新バージョンと完全な一覧については、オンラインの Visual Studio 2008 Samples のページを参照してください。

  • サンプルは、コンピュータのハード ディスク上にもあります。既定では、サンプルおよび Readme ファイルは、\Program Files\Visual Studio 9.0\Samples\ の下のフォルダにコピーされます。Visual Studio Express Edition の場合、すべてのサンプルはオンライン上にあります。

サンプルのビルドと実行

MODELESS サンプルをビルドおよび実行するには

  1. ソリューション modeless.sln を開きます。

  2. [ビルド] メニューの [ビルド] をクリックします。

  3. [デバッグ] メニューの [デバッグなしで開始] をクリックします。

サンプルが開始すると、空のリスト ボックスが表示されます。モードレス ダイアログ ボックスを開くには、[Add] をクリックします。[Modeless Adder] ダイアログ ボックスが開いている場合でも、メイン ダイアログ ボックスにフォーカスを戻すことができます。モードレス ダイアログ ボックスが開いているときは、メイン ダイアログ ボックスの [Add] は使用できないため、ユーザーはモードレス ボックスの複数のインスタンスを作成できません。

メイン ダイアログ ボックスの CMainDlg クラスは、モードレス ダイアログ ボックスへのポインタを管理します。これは単に便宜上であるため、モードレス ダイアログ ボックスはいったん作成した後は管理する必要はありません。独自のアプリケーションで、モードレス ボックスの情報を提供することもできます。このポインタによって、ダイアログ ボックスを管理する C++ オブジェクトにアクセスできるため、これを利用できます。

メイン ダイアログ ボックスの [Add] のコードでは、DoModal 関数ではなく Create 関数を使用して、モードレス ダイアログ ボックスが作成されます。この方法により、ボックスがモードレスになります。Windows では、ボックスのメッセージの処理が異なります。ボックスが破棄されるときは、EndDialog ではなく DestroyWindow が呼び出されます。CDialog オブジェクトの通常のメンバ関数 OnOk および OnCancel は、EndDialog が呼び出します。したがって、モードレス ダイアログ ボックスでは、これらの関数を呼び出さずにこれらをオーバーライドして DestroyWindow を呼び出す必要があります。

通常、モーダル ダイアログ ボックスを作成するときは、DoModal が戻った後にそのダイアログ ボックスを手動で破棄します。モードレス ダイアログ ボックスが表示されている間は、Create から制御が戻りません。ウィンドウに関連付けられている C++ オブジェクトを破棄するための別の方法が必要です。このサンプルでは、単純な方法を使用しています。つまり、PostNcDestroy で delete this を実行します。この関数は、ダイアログ ボックスの非クライアント領域が破棄された後で呼び出されます。

モードレス ダイアログ ボックスは、親ダイアログと 2 種類の方法で通信します。まず、ユーザーが [OK] をクリックすると、モードレス ダイアログ ボックスのエディット コントロールの文字列が、モーダル ダイアログ ボックスのリスト ボックスの内容に追加されます。次に、ユーザーがなんらかの方法でウィンドウを破棄すると、モードレス ボックスからモーダル ウィンドウの BoxDone 関数が呼び出されます。この関数は、モーダル ダイアログ ボックスへのポインタをリセットし、[Add] を再び使用できるようにします。

キーワード

このサンプルでは、次のキーワードを使用します。

AfxGetApp; CDC::DrawIcon; CDC::GetSafeHdc; CDialog::Create; CDialog::DoModal; CDialog::OnCancel; CDialog::OnOK; CListBox::AddString; CMenu::AppendMenu; CMenu::ModifyMenu; CRect::Height; CRect::Width; CString::IsEmpty; CString::LoadString; CWinApp::InitInstance; CWinApp::LoadStdProfileSettings; CWnd::DestroyWindow; CWnd::DoDataExchange; CWnd::EnableWindow; CWnd::GetClientRect; CWnd::GetDlgItem; CWnd::GetWindowText; CWnd::IsIconic; CWnd::OnPaint; CWnd::OnQueryDragIcon; CWnd::OnSysCommand; CWnd::PostNcDestroy; CWnd::SendMessage; CWnd::SetActiveWindow; GetSystemMenu; GetSystemMetrics; LoadIcon

zhk0y9cw.alert_note(ja-jp,VS.90).gifメモ :

このサンプルを含む一部のサンプルには、Visual C++ のウィザード、ライブラリ、およびコンパイラの変更が反映されていませんが、必要なタスクを実行する方法は示されています。

参照

その他の技術情報

MFC サンプル