您的位置:首页 > 其它

VC/MFC DDX和DDV机制介绍

2013-07-02 10:59 295 查看
VC/MFC DDX和DDV机制介绍
C++的MFC类库中为用户提供了在对话框控件和数据变量间交换数据的

DDX/DDV(数据交换/数据验证)机制,而在此之前,用户只能通过调用

GetDlgItemInt或etDlgItemText等函数这样麻烦的过程来达到同样的目的。

当你要为控制增加DDX/DDV支持时,APP WIZARD和CLASS WIZARD将为你完成

大部分工作。你只需要在CLASS WIZARD中为你的控制ID添加一个数据变量,

然后在程序中适当的地方调用UpdateData函数。

UpdateData接一个BOOL值的参数,为TRUE时将控制中的数据传到变量中,

FAULSE表示把变量中的数据传到控制中。但UpdateData并不直接完成有关

DDX/DDV机制的有关操作,它通过调用一个DoDataExchange函数实现。

DoDataExchange将调用实际完成对话框所要求的所有DDX和DDV操作有关的

DDX和DDV函数。

当你为控制创建一个数据变量时,CLASS WIZARD将自动为你生成三块

代码:它们被用来定义和初始化与控制结合在一起的变量。一旦在应用程

序执行过程中发出了一个DDX或DDV消息,应用程序将使用这三块代码中的

信息来定位,然后执行指定的代码。

1 AFX_DATA代码块

AFX_DATA代码块是CLASS WIZARD用来说明与控制结合在一起的变量

的代码块。在相应的头(*.H)中,它出现在类的说明中。如:

//DIALOG DATA

//{{AFX_DATA(CAPPDIALOG)

enum{IDD=IDD_DIALOG1};

CButton m_btnCopy;

CString m_editName;

CString m_showName;

//}AFX_DATA

2 AFX_DATA_INIT代码块

AFX_DATA_INIT代码块对与控制结合在一起的变量进行初始化。在

相应的*.CPP文件中,它出现在类的构造函数中。如:

CAPPDIALOG::CAPPDIALOG(CWnd *nParent /*=NULL*/)

:CDialog(CAPPDIALOG::IDD,pParent)

{

//{{AFX_DATA_INIT(CAPPDIALOG)

m_editName=" ";

m_showName=" ";

//}AFX_DATA_INIT

}

上例中,与m_editName和m_showName变量结合在一起的编辑框将被

初始化为空的文本字符串。你也可以对其修改而轻松的以其他方式对其

进行初始化。

3 AFX_DATA_MAP代码块

AFX数据映像通常出现在DoDataExchange函数中,它是一个CWnd成员

函数,通常会被替换掉。比如在头文件中声明了:

virtual void DoDataExchange(CDataExchange * pDX);

则在CPP文件中如下实现:

void CAPPDIALOG::DoDataExchange(CDataExchange * pDX)

{

CDialog:: DoDataExchange( pDX);

//{{AFX_DATA_MAP(CAPPDIALOG)

DDX_Control(pDX,IDC_COPY,m_btnCopy):

DDX_Text(pDX,IDC_EDIT_NAME,m_editName);

DDV_MaxChars(pDX,m_editName,28);

DDX_Text(pdx,IDC_SHOW_NAME,m_showName);

//}}AFX_DATA_MAP

}

如例子所示,这个DoDataExchange函数公进行了四次DDX/DDV调用,

它们是由MFC库提供的。参数pDX是一个指向数据交换对象的指针--数据交换

对象是一个属于CDataExchange类的MFC对象。在这里,你可以编写专门的DDX

和DDV函数,来以某种特殊的方式处理数据交换或数据验证。

这三块程序段实现了DDX/DDV机制和应用程序的接口,应用程序循着

UpdateData函数--DoDataExchange函数--DDX/DDV函数的顺序实现了控制和

数据变量的数据交换。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: