|
DDXの基本1
MFCの強力な機能の一つに、DDX(Dialog Data Exchange)というものがあります。これは、一言で言えば、ダイアログ上のコントロールの状態をメンバ変数に割り当てることができる機能です。
この機能は非常に強力です。これを知っているのと知らないのでは、MFCプログラムの作成効率に雲泥の差がでます。まずは百聞は一見にしかずで、実際の例を見てみましょう。
次のように、"取得"ボタンを押すと、チェックボックスとラジオボタンから状態を取得して、エディットボックスに表示するプログラムを作ってみます。

まず、DDXを使用しない場合です。"取得"ボタンを押下したときのイベントハンドラの実装例は次のようになります。細かい内容は今は気にしなくて良いですが、これだけのコードを書かないといけないということに注目してください。
// "取得"ボタン押下(非DDX版)
void CDDXDlg::OnBnClickedGet()
{
int kind = -1;
CString str;
int err = 0;
kind = GetCheckedRadioButton(IDC_RADIO_IMAGE, IDC_RADIO_IM_TX);
str = (kind == IDC_RADIO_IMAGE) ? _T("画像") :
(kind == IDC_RADIO_TEXT) ? _T("テキスト") : _T("画像とテキスト");
str = str +_T("が表示") +((IsDlgButtonChecked(IDC_CHK_DISP)) ?
_T("されます。") : _T("されません。"));
SetDlgItemText(IDC_EDIT, str);
return;
}
|
では、全く同じことをDDXを使って実装してみます。すると、次のようなコードになります。
// "取得"ボタン押下(DDX版)
void CDDXDlg::OnBnClickedGet()
{
UpdateData();
m_xvEdit = (m_xvRadioKind == 0) ? _T("画像") :
(m_xvRadioKind == 1) ? _T("テキスト") : _T("画像とテキスト");
m_xvEdit = m_xvEdit +_T("が表示") +(m_xvChkDisp ? _T("されます。") : _T("されません。"));
UpdateData(FALSE);
return;
}
|
どうでしょうか。DDXを使うと、DDX変数を読み書きすることによってコントロールを操作することができます。このほうがプログラムが単純になりますよね。
これは、はっきり言ってDDXを使わないと損です。MFCの機能は、プログラマが楽をするために用意されていると言ってもいいでしょう。DDXはその中でも特に使いでがあります。
では、DDXについてもう少し詳しく見ていくことにしましょう。まず、上のプログラムを見てもわかる通り、コントロールの状態がダイアログクラスのメンバ変数に割り当てられています。この変数を介してダイアログ上のコントロールの状態を取得したり、設定したりできるわけです。今回作ったダイアログクラスは次のような定義になっています。
// CDDXDlg ダイアログ
class CDDXDlg : public CDialog
{
// コンストラクション
public:
CDDXDlg(CWnd* pParent = NULL); // 標準コンストラクタ
// ダイアログ データ
enum { IDD = IDD_DDX_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV サポート
// 実装
protected:
HICON m_hIcon;
// 生成された、メッセージ割り当て関数
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedGet();
private:
// DDX変数
CString m_xvEdit;
BOOL m_xvChkDisp;
int m_xvRadioKind;
};
|
そしてもう一つのキーワードが、CWnd::UpdateData()という関数です。この関数を呼ぶことによって、ダイアログからデータ(メンバ変数)へ、また逆に、データからダイアログへと状態を反映させることができます。これがダイアログ・データ・エクスチェンジと呼ばれるゆえんです。

さて、以上がおおざっぱなDDXの概要です。DDXについてはここで説明していないことはまだありますが、それは次回に書きたいと思います。
また、各コントロールごとの実際のDDXの使用方法は、各コントロールの基本ページに書いてありますので、そちらを見てください。
|