MFC中给控件添加变量,DoDataExchange中

Posted Good Good Study~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC中给控件添加变量,DoDataExchange中相关的知识,希望对你有一定的参考价值。

DoDataExchange函数其实是一项数据动态绑定技术。比如你在写动态按钮过程中须对按钮添加变量时,怎么添加?控件类已经写好了,其变量是已经固定的。你要添加新的变量就要用到DoDataExchange函数。

你要在对话框的构造函数里面初始化一个变量,再用DoDataExchange函数将它绑定到你的动态按扭中,比如:DDX_Check(pDX, IDC_CHECK1, m_Lesson1);这就是将m_Lesson1(这是一个外部变量,其定义在对话框的构造函数里)绑定到IDC_CHECK1中。
 
看下DDX_Check函数原型:void AFXAPI DDX_Check(CDataExchange* pDX, int nIDC, int& value);
可以看到m_Lesson并不是真的添加到IDC_CHECK1控件里了,注意这是int& value,只是一个值引用而已。
差不多的意思就是这个变量被框架传递给控件了。控件只负责使用此变量 ,而不负责改写此变量。
 
值得注意的一点是:MSDN后面附加了一句 Never call this function directly. It is called by the UpdateData member function. Call UpdateData to initialize a dialog box’s controls or retrieve data from a dialog box.就是说此函数永远不被直接调用,它只是呼叫UpdateData函数时才会被调用。

 

 
UpdateData函数
内部调用了DoDataExchange。该函数只有一个布尔型参数,它决定了数据传送的方向。
调用UpdateData(TRUE)将数据从对话框的控件中传送到对应的数据成员中,调用UpdateData(FALSE)则将数据从数据成员中传送给对应的控件。
 
UpdateData(false)是将变量的值传到控件,表示对话框正在初始化.
UpdateData(TRUE)是从控件中取值到关联的变量, 表示数据正在获取
CWnd::DoDataExchange
 
 
时间: 2016年7月

调用由框架交换和验证对话框数据。

语法
 
      virtual void DoDataExchange(
   CDataExchange* pDX 
);
参数
 
 
pDX

为 CDataExchange 对象的指针。

备注
 

不要直接调用此函数。 它由 UpdateData 成员函数调用。 调用 UpdateData 初始化对话框的控件或对话框中检索数据。

当从 CDialog派生时应用程序特定的对话框选件类,则需要重写该成员函数,如果您希望使用结构的自动数据交换和验证。 添加变量向导将编写该成员函数的重写版本包含预期“数据映射”对话框的数据交换(ddx),并验证(DDV)全局函数调用。

自动生成此成员函数的重写版本,请对话框编辑器首先创建对话框资源,然后派生应用程序特定的对话框选件类。 然后使用添加变量向导关联变量、数据和验证大小与在新的对话框的各种控件。 向导然后将被重写的 DoDataExchange,包含数据映射。 下面是示例DDX/DDV代码块生成由添加变量向导:

 
void CPenWidthsDlg::DoDataExchange(CDataExchange* pDX)
{
   CDialog::DoDataExchange(pDX);
   DDX_Text(pDX, IDC_THINPENWIDTH, m_nThinWidth);
	DDV_MinMaxInt(pDX, m_nThinWidth, 1, 20);
   DDX_Text(pDX, IDC_THICKPENWIDTH, m_nThickWidth);
   DDV_MinMaxInt(pDX, m_nThickWidth, 1, 20);
}

DoDataExchange 重写的成员函数必须在源文件中的宏语句。

有关数据交换的对话框和验证的更多信息,请参见 显示和操作数据窗体 和 数据交换的对话框和验证。 有关添加变量向导生成的DDX_和DDV_宏的说明,请参见 技术说明26

要求

头文件位置: afxwin.h


 

VC中的DoDataExchange

怎么设置控件和变量关联呢?

假如在对话框中加入一个picture控件的话

1.导入图片

2.拉picture控件到对话框上,设置属性,Type改为Bitmap,image选择导入的图片,ID一定要修改,不能为默认的IDC_Static,否则下面将做的Classwizard将不出现此控件ID。

3.ClassWizard中选择member variable Category选择 Control加入相应的CStatic变量 。

4.此时到DoDataExchange看,增加相应的数据交换语句,我的是DDX_Control(pDX, IDC_bt, m_bt);


 

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框架是很有用的。对于写控件也是很有用的。 


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

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

 

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

UpdateData();//将控件的值传给变量 
m_variable= "string";//分别为控件的变量赋值 
UpdateData(FALSE);//将变量的值传给控件 

以上是关于MFC中给控件添加变量,DoDataExchange中的主要内容,如果未能解决你的问题,请参考以下文章

MFC中控件添加了变量后修改

如何在vs2008 MFC中添加、删除成员变量

MFC 如何调用另一个控件的变量

急!MFC中给一个对话框的不同编辑框关联变量后如何获得多个不同变量的值进行计算处理?????

MFC 手动添加自会Listcontrl

猎豹MFC--列表控件ListControl