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

DoDataExchange由框架调用,作用是交互并且验证对话框数据,主要由(DDX) 和 (DDV)宏实现。 永远不要直接调用这个函数,而是通过UpdateData(TRUE/FALSE)实现控件与变量之间值的传递。

当然你也可以不使用DoDataExchange而完成控件与变量之间值的传递,如:

通过GetWindowText和SetWindowText等等函数完成String变量与Edit控件之间的数据交互。

DDX/DDV
    通过使用ClassWizard向对话类添加成员变量,你可以利用ClassWizard所提供的高效特征,为对话数据交换和对话数据验证自动生成源代码,也就是人们所熟知的DDX/DDV。
    数据交换和验证仅仅应用于为之选定了Value类别的成员变量。也就是CString,BOOL,数字,COleDateTime或COLeCurrency。
    对话框数据交换负责数据在控件中的进出。当对话首次出现的时候,每个控件窗口自动用相应的成员变量的值进行初始化。当用户通过单击OK按钮,或通过按Enter键关闭对话的时候,该控件无论是包含哪一个值或文本,都将被复制回该变量。
    对话数据验证可以确保值落在规定的限制之内。交换和验证机制都是由MFC框架提供的。每个函数都有一个前缀DDX_或DDV_,来把它作为数据交换或数据验证函数来标识。
1. 对话数据交换(DDX)
    常见的对话数据交换函数
   (1)交换函数:DDX_CBIndex,           获得/设置的数据类型:int,             应用于控件:Combobox
   (2)交换函数:DDX_CBString,          获得/设置的数据类型:Cstring,      应用于控件:Combobox
   (3)交换函数:DDX_CBStringExact, 获得/设置的数据类型:Cstring,      应用于控件:Combobox
   (4)交换函数:DDX_Check,             获得/设置的数据类型:intCheck,  应用于控件:box
   (5)交换函数:DDX_DateTimeCtrl,   获得/设置的数据类型:Ctime,        应用于控件:Datetimepicker
   (6)交换函数:DDX_LBIndex,           获得/设置的数据类型:int,             应用于控件:List box
   (7)交换函数:DDX_LBString,          获得/设置的数据类型:CString,     应用于控件:Listbox
   (8)交换函数:DDX_LBStringExact, 获得/设置的数据类型:CString,      应用于控件:List box
   (9)交换函数:DDX_MonthCalCtrl, 获得/设置的数据类型:Ctime,        应用于控件:Month calendar
   (10)交换函数:DDX_Radio,            获得/设置的数据类型:int,             应用于控件:Radio button
   (11)交换函数:DDX_Scroll,           获得/设置的数据类型:int,             应用于控件:Scroll bar
   (12)交换函数:DDX_Text,              获得/设置的数据类型:CString  or numerical(BYTE,short,int,UINT,long,etc.),应用于控件:Edit control
    在所有的数据交换函数之中,该函数是独一无二的,它只应用于一组控件,而不是一个控件。DDX_Radio返回一个int值用来指示用户打开了组中的哪个按钮:0代表组中的第一个按钮,1代表第二个按钮,以此类推。值-1的意思是小组中的所有按钮都是清除的。你可以调用DDX_Radio来确定单个单选按钮的状态(假如它是组中的唯一一个按钮)。在这种情况下,返回值0的意思是按钮是打开的,值-1意为按钮是关闭的。

建立一个单选按钮通常在对话编辑器中进行,我们一会儿就能看到。

MFC提供了大量的对话数据交换函数,它们可以在对话类中的控件成员变量之间移动数据。除了所列的常见函数之外,还有用于记录集数据和由ActiveX控件返回的数据的特殊交换函数。DDX_Control函数可以为几种不同类型的控件传输数据  ,例如Animate和IPAddress。

2.对话数据验证(DDV)对话数据验证函数,它们仅仅应用于接受用于从键盘输入数据的控件成员变量。换言之,就是编辑控件和组合框。
    对话数据验证函数
   (1)DDV_MinMaxByte 指定限制范围内的一个BYTE值。
   (2)DDV_MinMaxInt 指定限制范围内的一个int值。
   (3)DDV_MinMaxUInt 指定限制范围内的一个UNIT值。
   (4)DDV_MinMaxLong 指定限制范围内的一个long值。
   (5)DDV_MinMaxDWord 指定限制范围内的一个DWORD值。
   (6)DDV_MinMaxFloat 指定限制范围内的一个float值。
   (7)DDV_MinMaxDouble 指定限制范围内的一个double值。
   (8)DDV_MaxCharsCString字符串的长度不能超过指定的最大长度。
    当你为编辑控件或组合框添加成员变量,然后在Member Variable选项卡中的Control IDs框中选择控件的时候,两个提示之一将会出现在该选项卡的底部。究竟出现哪一个提示取决于变量所具有的是数字数据,还是文字数据;在任一种情况下,都要输入用于验证的变量限制值。
    除了一个对话数据验证函数之外,所有函数都监视数值数据,以确保由用户输入的值落在指定的上下限之间。
    例外是DDV_MaxChars函数,它用来验证键入到编辑控件或组合框中的字符数不超过给定的最大值。与交换函数不同,验证函数仅仅在对话关闭的时候起作用,而不在它刚出现的时候起作用。

如果输入到一个控件的值落到了指定的限制之外,那么,该控件的验证函数将显示一个消息框,以通知用户出了问题。当消息框被关闭的时候,出问题的控件将具有一个焦点,提示用户重新输入数据。除非所有的数据验证函数都满足了,否则,用户不能够通过单击OK来关闭对话。

时间: 2024-10-27 07:00:21

DDX和DDV——控件与变量之间值的传递的相关文章

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

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

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

DoDataExchange函数其实是一项数据动态绑定技术.比如你在写动态按钮过程中须对按钮添加变量时,怎么添加?控件类已经写好了,其变量是已经固定的.你要添加新的变量就要用到DoDataExchange函数. 你要在对话框的构造函数里面初始化一个变量,再用DoDataExchange函数将它绑定到你的动态按扭中,比如:DDX_Check(pDX, IDC_CHECK1, m_Lesson1);这就是将m_Lesson1(这是一个外部变量,其定义在对话框的构造函数里)绑定到IDC_CHECK1中

vs2010 无法为控件添加变量

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

事件委托应用:在父控件中创建子控件,并接收值

传值过程使用委托方法 定义一个打开按扭,一个文本框 1 /// <summary> 2 /// 增加父控件 3 /// </summary> 4 public void AddParent(BaseControl ctl) 5 { 6 foreach (Control ct2 in this.Parent.Controls) 7 { 8 if (ct2.Name == ctl.Name) { 9 ct2.Focus(); 10 return; 11 } 12 } 13 ctl.Wi

C#编写第三方控件,实现窗体控件的一键取值

上篇博客中讲到了利用编写第三方控件的方法,实现给窗体控件的Text属性赋值,比如说:TextBox,Combox等.有赋值,当然也有取值操作.从窗体的控件中取值,然后存入变量或者实体属性当中,传入到数据访问层进行添加,更新等操作也是我们经常使用的.如何实现一键取值呢? 使用的方法在上篇博客中已经做了详细说明,这里就不再累述了. 代码写在这里: 该方法的作用是,遍历传入窗体中的控件,并且获取其值赋给实体类的相应属性. /// <summary> /// 从窗体控件取值,填充到学生实体类中 ///

ASP.NET中多个相同name的控件在后台取值问题

有兽, 页面上可能有多个相同name的Html表单控件, 一般在后台使用Request.Form[“name”]取值,并用‘,’分隔. 但是当值中包含逗号时, 取值就会出现异常, 这个时候, 我们可以使用Request.Form.GetValues(“name")方法, 获取一个包含一个name值的数组.

Android基本控件和容器之间继承关系概览图

图中,圆柱体表示容器(上部),矩形表示非容器类(下部)

[UE4]UMG编辑器:控件作为变量、预设锚点和自由锚点

原文地址:https://www.cnblogs.com/timy/p/9057930.html

1.WinForm练习--按钮控件:窗体之间的跳转

//新建三个窗体和按钮,当点第一个窗体按钮时跳转到第二个窗体,当点第二个窗体按钮时跳转到第三个窗体,当点第三个窗体按钮时关闭所有窗体.//----1.第一个窗体程序----public partial class Form1 : Form{public Form1(){InitializeComponent();}//按钮点击事件private void btn1_Click(object sender, EventArgs e){//点击第一个按钮时跳转到二个按钮Form2 frm2 = ne