ダイアログ データ エクスチェンジ
ダイアログ データ エクスチェンジ (DDX: Dialog Data Exchange) 機構を使用する場合は、ダイアログ オブジェクトのメンバー変数の初期値を設定します。通常、OnInitDialog ハンドラーまたはダイアログ コンストラクターで行います。 ダイアログ ボックスが表示される直前に、フレームワークの DDX 機構によって、メンバー変数の値がダイアログ ボックスのコントロールに転送されます。転送された値は、DoModal または Create に応答してダイアログ ボックスが表示されたときに、それらのコントロールで表示されます。 CDialog の OnInitDialog の既定の実装は、CWnd クラスの UpdateData メンバー関数を呼び出して、ダイアログ ボックスのコントロールを初期化します。
この機構では、[OK] ボタンがクリックされたとき、または引数を TRUE にして UpdateData メンバー関数が呼び出されたときに、コントロールからメンバー変数に値が転送されます。 ダイアログ データ バリデーション (DDV: Dialog Data Validation) 機構では、入力規則が指定されているデータ項目の妥当性がチェックされます。
ダイアログ データ エクスチェンジの機能を次の図に示します。
ダイアログ データ エクスチェンジ
UpdateData は、渡された BOOL パラメーターによって指定されたとおりに双方向で機能します。 データ交換を実行するために、UpdateData では CDataExchange オブジェクトをセットアップし、ダイアログ クラスでオーバーライドされた CDialog の DoDataExchange メンバー関数を呼び出します。 DoDataExchange は、CDataExchange 型の引数を使用します。 UpdateData に渡される CDataExchange オブジェクトは、交換の方向などの情報を定義して交換のコンテキストを表します。
DoDataExchange をオーバーライドすると、データ メンバー (コントロール) ごとに 1 つの DDX 関数の呼び出しを指定できます。 各 DDX 関数では、UpdateData によって DoDataExchange に渡された CDataExchange 引数のコンテキストに基づいて、双方向でデータを交換する方法があります。
MFC では、種類の異なるデータ交換のために、多くの DDX 関数が用意されています。 2 つの DDX 関数と 1 つの DDV 関数が呼び出される DoDataExchange のオーバーライドの例は、次のとおりです。
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 値を返します。 その場合、ダイアログ ボックスとダイアログ オブジェクトの間でデータは交換されません。