ダイアログ データ エクスチェンジ

DDX メカニズムを使用する場合、ダイアログ オブジェクトのメンバー変数の初期値は、通常、OnInitDialog ハンドラーまたはダイアログのコンストラクターで設定します。 ダイアログが表示される直前に、フレームワークの DDX メカニズムによって、メンバー変数の値がダイアログ ボックスの各コントロールに転送され、DoModal または Create への反応としてダイアログ ボックス自体が表示されるタイミングで表示されます。 CDialog に既定で実装されている OnInitDialog は、CWnd クラスの UpdateData メンバー関数を呼び出すことで、ダイアログ ボックス内の各コントロールを初期化します。

ユーザーが [OK] ボタンをクリックしたとき (または、引数に TRUE を指定して UpdateData メンバー関数を呼び出したとき) も、同じメカニズムでコントロールの値がメンバー変数に転送されます。 入力規則が指定されているデータ項目は、ダイアログ データ検証メカニズムによって検証されます。

次の図は、ダイアログ データが交換されるようすを示したものです。

Diagram of data model and on screen dialog box data exchange.
ダイアログ データ エクスチェンジ

UpdateData は、受け取った BOOL パラメーターの指定に応じて双方向で機能します。 データ交換を実行するために、UpdateDataCDataExchange オブジェクトをセットアップし、独自のダイアログ クラスのオーバーライド、つまり CDialog のメンバー関数 DoDataExchange のオーバーライドを呼び出します。 DoDataExchangeCDataExchange 型の引数を受け取ります。 UpdateData に渡される CDataExchange オブジェクトは交換のコンテキストを表し、交換の方向などの情報を定義します。

開発者 (またはコード ウィザード) は、DoDataExchange をオーバーライドするときに、各データ メンバー (コントロール) につき 1 つの DDX 関数の呼び出しを指定します。 それぞれの DDX 関数は、UpdateData によって DoDataExchange に渡された CDataExchange 引数で指定されたコンテキストに基づいて、データを双方向で交換する方法を認識します。

MFC には、各種のデータ交換に対応したさまざまな DDX 関数が用意されています。 次に示したのは、DoDataExchange のオーバーライドの例です。オーバーライドの中で、2 つの DDX 関数と 1 つの DDV 関数が呼び出されています。

void CTestDialog::DoDataExchange(CDataExchange* pDX)
{
   CDialog::DoDataExchange(pDX);
   DDX_Check(pDX, IDC_MY_CHECKBOX, m_bVal);
   DDX_Text(pDX, IDC_MY_TEXTBOX, m_strName);
   DDV_MaxChars(pDX, m_strName, 20);
}

DDX_ 行と DDV_ 行は、データ マップです。 ここに示したサンプルの DDX 関数と DDV 関数は、それぞれチェック ボックス コントロールとエディット ボックス コントロールに使用されます。

ユーザーがモーダル ダイアログ ボックスをキャンセルした場合、OnCancel メンバー関数によってダイアログ ボックスが終了され、DoModal から値 IDCANCEL が返されます。 その場合、ダイアログ ボックスとダイアログ オブジェクトとの間のデータ交換は実行されません。

関連項目

ダイアログ データ エクスチェンジとダイアログ データ検証
MFC でのダイアログ ボックスの操作
ダイアログ データ検証