MODELESS サンプル : モードレス ダイアログ ボックスとしての CDialog オブジェクトの使用
更新 : 2007 年 11 月
MODELESS サンプルでは、MFC CDialog オブジェクトをモードレス ダイアログ ボックスとして使用する例を示します。MODELESS は、単純なダイアログ ベースのアプリケーションです。メイン ダイアログ ボックスのリスト ボックスを管理し、メイン ウィンドウのリスト ボックスに文字列を追加するためのモードレス ダイアログ ボックスを提供します。
セキュリティに関するメモ : |
---|
このサンプル コードは概念を示す目的で提供されているものです。必ずしも最も安全なコーディング手法に従っているわけではないので、アプリケーションまたは Web サイトでは使用しないでください。Microsoft は、サンプル コードが意図しない目的で使用された場合に、付随的または間接的な損害について責任を負いません。 |
サンプルとそのインストール手順を取得するには
Visual Studio で、[ヘルプ] メニューの [サンプル] をクリックします。
詳細については、「サンプル ファイルの格納場所」を参照してください。
使用できるサンプルの最新バージョンと完全な一覧については、オンラインの Visual Studio 2008 Samples のページを参照してください。
サンプルは、コンピュータのハード ディスク上にもあります。既定では、サンプルおよび Readme ファイルは、\Program Files\Visual Studio 9.0\Samples\ の下のフォルダにコピーされます。Visual Studio Express Edition の場合、すべてのサンプルはオンライン上にあります。
サンプルのビルドと実行
MODELESS サンプルをビルドおよび実行するには
ソリューション modeless.sln を開きます。
[ビルド] メニューの [ビルド] をクリックします。
[デバッグ] メニューの [デバッグなしで開始] をクリックします。
サンプルが開始すると、空のリスト ボックスが表示されます。モードレス ダイアログ ボックスを開くには、[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
メモ : |
---|
このサンプルを含む一部のサンプルには、Visual C++ のウィザード、ライブラリ、およびコンパイラの変更が反映されていませんが、必要なタスクを実行する方法は示されています。 |