MFCコントロール - コントロールの更新

提供:MochiuWiki : SUSE, EC, PCB
2025年1月13日 (月) 00:13時点におけるWiki (トーク | 投稿記録)による版
ナビゲーションに移動 検索に移動

概要

DDX (Dialog Data Exchange) は、MFCにおけるユーザインターフェースとソースコード間のデータ交換を自動化する機能である。

DDXの基本的な仕組みとしては、ユーザインターフェースのコントロールとクラスのメンバ変数を紐づけ、その間でのデータ交換を自動的に行う。
この仕組みにより、開発者は手動でのデータ変換やフォーマット処理を記述する必要がなく、効率的な開発が可能になる。

データ交換の方向性については、CWnd::UpdateDataメソッドの引数で制御する。
UpdateData(TRUE)を指定した場合はコントロールに入力された値からメンバ変数へ、UpdateData(FALSE)を指定した場合はメンバ変数に格納された値をコントロールへとデータが移動する。
例えば、ユーザが入力したテキストを取得する場合は、UpdateData(TRUE)を実行して、計算結果をコントロールに表示する場合はUpdateData(FALSE)を使用する。

DDXの具体的な実装方法としては、DoDataExchange関数内でDDX_TextやDDX_Int等のマクロを使用して、コントロールIDとメンバ変数の関連付けを行う。

 void CMyDialog::DoDataExchange(CDataExchange *pDX)
 {
    CDialog::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_EDIT1, m_strName);    // 文字列用
    DDX_Int(pDX, IDC_EDIT2, m_nAge);        // 整数用
    DDX_Check(pDX, IDC_CHECK1, m_bActive);  // チェックボックス用
 }


DDXのメリットとして、データ型の自動変換や値の検証 (バリデーション) 機能が組み込まれていることが挙げられる。
例えば、テキストボックスに入力された文字列を整数型のメンバ変数に変換する場合、自動的に型変換が行われて、無効な入力があった場合はエラーメッセージが表示される。

また、DDXと組み合わせてDDV (Dialog Data Validation) を使用することにより、高度な入力値の検証が可能となる。
例えば、数値の範囲チェックや必須入力チェック等を実装することができる。


サンプルコード

以下の例では、ボタンを押下した時、UpdateData()でIDC_EDIT1に入力された文字列を変数m_xvEdit1に格納している。
次に、変数m_xvEdit1の文字列を変数m_xvEdit2にコピーして、UpdateData(FALSE)で変数m_xvEdit2の文字列をIDC_EDIT2に反映させている。

UpdateData 01.png


 // CMyDialog.hファイル
 class CMyDialog : public CDialogEx
 {
 // ...
 
 private:
    CString m_xvEdit1;
    CString m_xvEdit2;
 
 // ...
 };


 // CMyDialog.cppファイル
 
 CMyDialog::CMyDialog(CWnd* pParent /*=NULL*/) : CDialog(CMyDialog::IDD, pParent), m_xvEdit1(_T("")), m_xvEdit2(_T(""))
 {
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
 }
 
 void CMyDialog::DoDataExchange(CDataExchange *pDX)
 {
    CDialog::DoDataExchange(pDX);
 
    DDX_Text(pDX, IDC_EDIT1, m_xvEdit1);
    DDX_Text(pDX, IDC_EDIT2, m_xvEdit2);
 }
 
 void CMyDialog::OnBnClickedButton()
 {
    // UpdateData(TRUE)でDDX変数を更新
    UpdateData();
 
    // m_xvEdit1の内容をm_xvEdit2に代入
    m_xvEdit2 = m_xvEdit1;
 
    // UpdateData(FALSE)でDDX変数の内容をコントロールに反映
    UpdateData(FALSE);
 }


下図に、上記のサンプルコードの実行例を示す。
IDC_EDIT1にABCDEを入力し、Button1を押すと、IDC_EDIT2に反映される。

UpdateData 02.png


UpdateData 03.png