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 https://msdn.microsoft.com/zh-cn/library/x4d0y489.aspx

CWnd::DoDataExchange

时间: 2016年7月

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

语法

      virtual void DoDataExchange(
   CDataExchange* pDX
);

参数

pDX

为 CDataExchange 对象的指针。

备注

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

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

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

C++

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);//将变量的值传给控件

时间: 2024-10-07 16:40:25

MFC中给控件添加变量,DoDataExchange中的相关文章

vs2010 无法为控件添加变量

在今天之前,我为我的工程文件制作过一个安装包,因为要重新修改项目.所以今天需要为editbox控件添加变量,但是发现无论点击dialog里的什么,都会出现下面的情况,无法为控件添加变量. 无奈开始网上查资料, 群里拜求大神帮助. 最后发现,只要将项目文件夹里的.sdf文件(这个据说相当于vc6.0中的.ncb文件)删除再重新打开项目就一切OK了.

MFC List Control控件添加单元格编辑和单元格下拉列表项以适用于数据库相关操作

作为现代的软件,往往是连着数据库的,而连着和用户方便地操作之间,还有着界面这道坎.MFC是Windows上比较好开发用户界面的框架,然而其自带的控件中没有对于数据库表格支持较好的控件,而使用网上提到的 DataGrid 等控件在本人的win8.1+VS2013平台上老出现找不到控件或者头文件的问题,搞的烦死人.最后想到 List Control 控件只要稍作修改,加上单元格编辑和单元格下拉列表,其实就能和数据库进行良好的对接,一百度,果然有人已经做了这件事,实在是太让人感动了!       

Xcode中给控件添加颜色时自动显示出颜色

在iOS开发中,给一些控件设置颜色的时候,设置完不能立马看到颜色.必须要运行程序之后才能看到设置的颜色,如果颜色有偏差再回代码改参数,然后再运行看颜色很是麻烦.令人高兴得是Xcode有很多功能强大插件,使用起来非常方便.ColorSense-for-Xcode-master 就是一个非常好用的设置完颜色就能立即显示颜色的插件.效果图如下 插件安装方法: 1.到github上下载插件https://github.com/omz/ColorSense-for-Xcode 2.下载完插件之后用Xcod

mfc 动态为控件添加事件1

知识点: 认识窗口过程 GetWindowLong SetWindowLong 为动态控件绑定事件 一.获取窗口过程 二.设置新窗口过程 1.书写一个新窗口过程函数 窗口过程格式 LRESULT CALLBACK WindowProc( HWND hwnd, // 窗口句柄 UINT uMsg, // 消息事件 WPARAM wParam, // 消息参数1 LPARAM lParam //消息参数2 ); CallWindowProc 把消息事件传递给以前的窗口过程 LRESULT CallW

mfc 动态为控件添加事件2

重载窗口过程 为动态控件绑定事件 一.重载窗口过程处理函数 CWnd::WindowProc virtual LRESULT WindowProc( UINT message, WPARAM wParam, LPARAM lParam ); LRESULT CALLBACK WindowProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message para

MFC 控件添加热键

给MFC中的控件添加我们想要的控件热键,在动手之前,必须清楚,热键分为local的和global的, 其中local的职能在当前程序有焦点(被激活)时有效,而global的,则无论什么时候都有效,测试local的要优先于global的,就是如果当前激活窗口的快捷键与未激活窗口的快捷键重叠,当前激活窗口优先响应.另外还包括menu,button. 自然而然,创建热键的方法也有多种,不同的创建方法创建的热键作用范围不一定相同.应该根据需求合理的选择自己的方法. 方法一: 打开对话框资源,选择指定控件

对话框控件绑定变量及操作

对话框控件绑定变量 右键单击控件,添加变量. 复选框:添加变量为控件变量.可以操作控件. 列表框:选择添加变量的控件的ID. 列表框:选择添加的变量的类别,Control为控件控制类型.Value为关联值变量,可以设置数据验证 编辑框:添加的控件变量名. 复选框:不选中,则为控件关联一个变量.不可以操作控件. 列表框:选择关联变量类型. 编辑框:添加的控件变量名.  头文件中添加的变量 // CMFCTestDlg dialog class CMFCTestDlg : public CDialo

DDX和DDV——控件与变量之间值的传递

DoDataExchange由框架调用,作用是交互并且验证对话框数据,主要由(DDX) 和 (DDV)宏实现. 永远不要直接调用这个函数,而是通过UpdateData(TRUE/FALSE)实现控件与变量之间值的传递. 当然你也可以不使用DoDataExchange而完成控件与变量之间值的传递,如: 通过GetWindowText和SetWindowText等等函数完成String变量与Edit控件之间的数据交互. DDX/DDV    通过使用ClassWizard向对话类添加成员变量,你可以

MFC进度条控件(Progress)

进度条控件的应用 进度条的主要方法和事件 SetRange方法:该方法用于设置进度条范围. void SetRange(short  nLower,short  nUpper);进度的下界和上界范围. GetPos方法:用于获取进度条当前位置. SetStep方法:用于设置进度条每步的增量. StepIt方法:用于每一步的增量来增加进度条的当前位置. 详细的介绍见MFC++程序开发参考大全(P196) 1.创建一个基于对话框的应用程序. 2.向对话框中添加一个进度条控件.一个按钮控件.3个静态文