モードレス サンプル:モードレス ダイアログ ボックスとして、CDialog オブジェクトを使用します。
MODELESS サンプルでは、MFC CDialog オブジェクトをモードレス ダイアログ ボックスとして使用する例を示します。 MODELESS は、単純なダイアログ ベースのアプリケーションです。メイン ダイアログ ボックスのリスト ボックスを管理し、メイン ウィンドウのリスト ボックスに文字列を追加するためのモードレス ダイアログ ボックスを提供します。
セキュリティに関するメモ |
---|
このサンプル コードは概念を示すためのものであり、その概念に関連するコードのみを示しています。特定の環境について必ずしもセキュリティ要件を満たしていませんので、そのまま使用しないでください。セキュリティおよびエラー処理コードを追加して、プロジェクトをより安全かつ堅牢にすることをお勧めします。これらのサンプル コードは、現状有姿のままで提供されるものであり、一切保証されていません。 |
サンプルとそのインストール手順を取得するには
Visual Studio のサンプルにアクセスするには
[ヘルプ] メニューの [サンプル] をクリックします。
既定では、これらのサンプルは drive:\Program Files\Microsoft Visual Studio 10.0\Samples\ にインストールされています。
サンプルのビルドと実行
MODELESS サンプルをビルドおよび実行するには
ソリューション modeless.sln を開きます。
[ビルド] メニューの [ビルド] をクリックします。
でデバッグ メニューの、[デバッグなしで開始 をクリックします。
サンプルが開始すると、空のリスト ボックスが表示されます。 の追加をクリック して、モードレス ダイアログ ボックスを開くことができます。 でも、モードレス Adder ダイアログ ボックスが開いているときは、[メイン] ダイアログ ボックスに戻るフォーカスことができます。 ユーザーが [モードレス] ボックスの 1 つ以上のインスタンスを作成できないように、モードレス ダイアログ ボックスが開いている場合、追加 ボタン [メイン] ダイアログ ボックスは使用不可になります。
メイン ダイアログ ボックスの CMainDlg クラスは、モードレス ダイアログ ボックスへのポインターを管理します。 これは単に便宜上であるため、モードレス ダイアログ ボックスはいったん作成した後は管理する必要はありません。 独自のアプリケーションで、モードレス ボックスの情報を提供することもできます。このポインターによって、ダイアログ ボックスを管理する C++ オブジェクトにアクセスできるため、これを利用できます。
追加 [メイン] ダイアログ ボックスのコードで呼び出す代わりに CreateDoModal 関数を使用して、モードレス ダイアログ ボックスを作成します。 この方法により、ボックスがモードレスになります。Windows では、ボックスのメッセージの処理が異なります。 ボックスが破棄されるときは、EndDialog ではなく DestroyWindow が呼び出されます。 OnOk OnCancel オブジェクトのメンバー関数と通常 CDialogEndDialog呼び出すため、モードレス ダイアログ ボックスこれらの関数を 、オーバーライド代わりに、 DestroyWindow を呼び出すことを確認します。
通常、モーダル ダイアログ ボックスを作成するときは、DoModal が戻った後にそのダイアログ ボックスを手動で破棄します。 モードレス ダイアログ ボックスの表示中に戻るには、Create を待つことができませんので、その他のメカニズムは、ウィンドウに関連付けられた C++ オブジェクトを破棄する必要があります。 このサンプルでは、非常に単純なメカニズムを使用します。delete this 実行で PostNcDestroy などのボックスの非クライアント領域が破棄された後に呼び出される関数。
モードレス ダイアログ ボックスは、親ダイアログと 2 種類の方法で通信します。 まず、ユーザーが [OK] をクリックすると、モードレス ダイアログ ボックスのエディット コントロールの文字列が、モーダル ダイアログ ボックスのリスト ボックスの内容に追加されます。 もう 1 つは、ユーザーがどのような手段で、ウィンドウを破棄すると、ウィンドウのモーダル BoxDone 関数 [モードレス] ボックスを呼び出します。 この関数は、モーダル ダイアログ ボックスへのポインターをリセットし、[Add] を再び使用できるようにします。
Keywords
このサンプルでは、次のキーワードを使用します。
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
注意
このサンプルを含む一部のサンプルには、Visual C++ のウィザード、ライブラリ、およびコンパイラの変更が反映されていませんが、必要なタスクを実行する方法は示されています。