CDialog クラス
更新 : 2007 年 11 月
画面上にダイアログ ボックスを表示するための基本クラスです。
class CDialog : public CWnd
解説
ダイアログ ボックスには、モーダル ダイアログ ボックスとモードレス ダイアログ ボックスという 2 つのタイプがあります。モーダル ダイアログ ボックスは、ユーザーがダイアログ ボックスを閉じない限り、アプリケーションを続行できません。モードレス ダイアログ ボックスを使うと、ユーザーはダイアログ ボックスを表示したままで別のタスクに戻ることができます。ダイアログ ボックスはキャンセルも消去もされません。
CDialog オブジェクトは、ダイアログ テンプレートと CDialog からの派生クラスを組み合わせたものです。ダイアログ エディタを使って、ダイアログ テンプレートを作成し、リソースに格納します。その後、クラスの追加ウィザードを使って、CDialog からの派生クラスを作成します。
ダイアログ ボックスは、ほかのウィンドウと同じように Windows からメッセージを受け取ります。ダイアログ ボックス コントロールからの通知メッセージの処理方法に応じて、ユーザーとダイアログ ボックス間の対話方法が決まります。[プロパティ] ウィンドウで処理対象のメッセージを選択すると、適切なメッセージ マップ エントリとメッセージ ハンドラ メンバ関数がクラスに追加されます。アプリケーション作成者は、アプリケーション固有のメッセージ ハンドラ メンバ関数を記述するだけです。
メッセージ マップ エントリとメンバ関数を手動で書き込むこともできます。
多くのダイアログ ボックスでは、ダイアログ ボックス コントロールに入力したデータを格納するため、またはデータを表示するためのメンバ変数を派生ダイアログ クラスに追加します。変数の追加ウィザードを使ってメンバ変数を作成し、コントロールに関連付けることができます。同時に、変数の型や変数の値の範囲も選択できます。コード ウィザードは、定義した派生ダイアログ クラスにメンバ変数を追加します。
メンバ変数とダイアログ ボックス コントロール間のデータ交換を自動的に処理するためのデータ マップが生成されます。データ マップは、ダイアログ ボックスのコントロールを適切な値で初期化したり、データを取得したり、データの妥当性をチェックしたりするための関数が用意されています。
モーダル ダイアログ ボックスを作成するには、まず派生ダイアログ クラスのコンストラクタを使ってスタック上にオブジェクトを構築します。その後 DoModal 関数を呼び出して、ダイアログ ウィンドウとコントロールを作成します。モードレス ダイアログを作成するには、ダイアログ クラスのコンストラクタの中から Create 関数を呼び出します。
Windows SDK に記述されている、DLGTEMPLATE データ構造体を使ってメモリ上にテンプレートを作成することもできます。CDialog オブジェクトを構築すると、CreateIndirect を呼び出してモードレス ダイアログ ボックスを作成できます。InitModalIndirect と DoModal を呼び出すと、モーダル ダイアログ ボックスを作成できます。
新しいダイアログ クラスに追加した CWnd::DoDataExchange のオーバーライドに、データの交換および妥当性検査のためのデータ マップが作成されます。データの交換および妥当性検査の機能の詳細については、「CWnd」の DoDataExchange メンバ関数を参照してください。
プログラマもフレームワークも CWnd::UpdateData 関数を呼び出すことによって、間接的に DoDataExchange を呼び出します。
ユーザーが [OK] をクリックしてモーダル ダイアログ ボックスを閉じると、フレームワークが、UpdateData 関数を呼び出します。[キャンセル] がクリックされたときは、データは取得されません。OnInitDialog の既定の実装でも、コントロールに初期値を設定するときに UpdateData を呼び出します。通常は、OnInitDialog をオーバーライドして、さらにコントロールを初期化します。OnInitDialog は、すべてのダイアログ コントロールが作成された後、ダイアログ ボックスが表示される直前に呼び出されます。
CWnd::UpdateData は、モーダル ダイアログ ボックスまたはモードレス ダイアログ ボックスが実行されている間はいつでも呼び出すことができます。
Visual C++ に組み込まれているツールを使わずにダイアログ ボックスを直接作成するには、自分自身で派生したダイアログ ボックス クラスにメンバ変数を追加し、その変数の値を設定したり、取得したりするメンバ関数を追加する必要があります。
モーダル ダイアログ ボックスは、ユーザーが [OK] または [キャンセル] をクリックするか、EndDialog メンバ関数を呼び出すようにプログラミングされていると、自動的に閉じます。
モードレス ダイアログ ボックスを実装するときは、必ず OnCancel メンバ関数をオーバーライドし、その中から DestroyWindow を呼び出します。基本クラスの CDialog::OnCancel を呼び出さないでください。この関数は EndDialog を呼び出すため、ダイアログ ボックスは破棄されず、非表示になるだけです。モードレス ダイアログ ボックスは通常 new を使って割り当てられるため、this を消去するようにモードレス ダイアログ ボックスの PostNcDestroy もオーバーライドする必要があります。モーダル ダイアログ ボックスは通常フレーム上に構築されるので、PostNcDestroy による後処理は必要ありません。
CDialog の詳細については、以下のトピックを参照してください。
サポート技術情報の「HOWTO: Create a Resizeable Dialog Box with Scroll Bars (Q262954)」を参照してください。
必要条件
ヘッダー : afxwin.h
参照
処理手順
DLGCBR32 サンプル : ダイアログ ボックスへのステータス バーとツール バーの追加
DLGTEMPL サンプル : ダイアログ テンプレートの動的作成