CDataExchange()

来源:互联网 发布:恐怖电影推荐 知乎 编辑:程序博客网 时间:2024/04/29 09:13
该函数中的代码是由ClassWizard自动加入的。DoDataExchange只有一个参数,即一个CDataExchange对象的指针pDX。在该函数中调用了DDX函数来完成数据交换,调用DDV函数来进行数据有效检查。

当程序需要交换数据时,不要直接调用DoDataExchange函数,而应该调用CWnd::UpdateData。UpdataData函数内部调用了DoDataExchange。该函数只有一个布尔型参数,它决定了数据传送的方向。调用UpdateData(TRUE)将数据从对话框的控件中传送到对应的数据成员中,调用UpdateData(FALSE)则将数据从数据成员中传送给对应的控件。

在缺省的CDialog::OnInitDialog中调用了UpdateData(FALSE),这样,在对话框创建时,数据成员的初值就会反映到相应的控件上。若用户是按了OK(确定)按钮退出对话框,则对话框认为输入有效,就会调用UpdataData(TRUE)将控件中的数据传给数据成员。

对于这个函数,MSDN是这样描述的:Called by the framework to exchange and validate dialog data.

 

大意是框架调用此函数来改写与确认对话框数据。 

到是看了下DoDataExchange函数里的DDX型函数,似乎明白了DoDataExchange函数的作用。

 
比如你设计一个游戏,在结束之后弹出个对话框,需要你输入大名,进而保存你结果分数的纪录(如图1),这时你就要在这个对话框类里添加一个变量,来提取文本框输入时的用户名。假设你的对话框ID为IDD_USERNAME_DIALOG,对应类为CUserDialog(UserDialog.cpp,UsernDialog.h),文本框控件的ID为IDC_USER_EDIT,为对话框类添加CString变量m_username,再用DoDataExchange函数将它绑定到你的动态按扭中,比如:DDX_Text(pDX,IDC_USER_EDIT, m_username);这就是将m_username(这是一个外部变量,其定义在对话框的构造函数里)绑定到IDC_USER_EDIT中。 


  

 

 

 

 

 

 

 

 

 

 

 

 

 

 



 

void CUserDialog::DoDataExchange(CDataExchange* pDX) 

    CDialog::DoDataExchange(pDX); 
    DDX_Text(pDX, IDC_USER_EDIT, m_username); 
    DDV_MaxChars(pDX,m_username,10); //将用户名的最大长度控件在10个字符

DDX:Dialog Data Exchange 表示对话框数据交换

DDV:Dialog Data Valid 表示对话框数据有效性
总之,这个函数对理解MFC框架是很有用的。对于写控件也是很有用的。 
good good study,day day up..... 


UpdataData函数内部调用了DoDataExchange。该函数只有一个布尔型参数,它决定了数据传送的方向。调用UpdateData(TRUE)将数据从对话框的控件中传送到对应的数据成员中,调用UpdateData(FALSE)则将数据从数据成员中传送给对应的控件。 

UpdateData(FALSE)是将变量的值传到控件. 
UpdateData(TRUE)是从控件中取值到关联的变量 



DoDataExchange会被框架调用,用来改变和验证对话框的数据。在这个函数中一般是将控件和某些变量关联,当在其它地方改变量的值,通过UpdateData 进行双向交换。如: 

UpdateData();//将控件的值传给变量 
m_username= "风中在飘牛";//分别为控件的变量赋值 
UpdateData(FALSE);//将变量的值传给控件 
DDX_TEXT()的作用可以理解为把字符串变量和控件的文本(WindowText)关联起来
DDV_MaxChars
void AFXAPI DDV_MaxChars( CDataExchange* pDX, CString const& value, int nChars );
参数:nChars允许的最大字符数目。
说明:
调用DDV_MaxChars以检验与value相关的控件的字符数是否超过nChars。

0 0