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,             获得/设置的数据类型:CStringor 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来关闭对话。

-----------------------------------------------------------------------------

DDX:Dialog Data Exchange

如果使用DDX机制,一般会在OnInitDialog消息处理函数或Dialog构造函数中,为对话

框对象的成员变量设置了初始值。在对话框显示前,框架的DDX机制将成员变量的值传

给对话框中的控件,当调用DoModal或Create函数,对话框即将显示时,这些值也就显

示在相应的控件上。

CDialog类的成员函数OnInitDialog的默认实现中,调用CWnd类的UpdateData成员函数

来初始化对话框的控件。

当用户单击OK按钮或调用成员函数UpdateData(TRUE),相同的机制会将控件值传给成员

变量。

DDV:Dialog Data Validation 
DDV机制会根据用户指定的验证规则来验证数据

UpdateData函数创建一个CDataExchange对象,并调用CDialog类DoDataExchange 成员

函数的对话框重载函数:

BOOL CWnd::UpdateData(BOOL bSaveAndValidate)
{
 ASSERT(::IsWindow(m_hWnd)); // calling UpdateData before DoModal?

CDataExchange dx(this, bSaveAndValidate);

// prevent control notifications from being dispatched during

UpdateData
 _AFX_THREAD_STATE* pThreadState = AfxGetThreadState();
 HWND hWndOldLockout = pThreadState->m_hLockoutNotifyWindow;
 ASSERT(hWndOldLockout != m_hWnd);   // must not recurse
 pThreadState->m_hLockoutNotifyWindow = m_hWnd;

BOOL bOK = FALSE;       // assume failure
 TRY
 {
  DoDataExchange(&dx);
  bOK = TRUE;         // it worked
 }
 CATCH(CUserException, e)
 {
  // validation failed - user already alerted, fall through
  ASSERT(!bOK);
  // Note: DELETE_EXCEPTION_(e) not required
 }
 AND_CATCH_ALL(e)
 {
  // validation failed due to OOM or other resource failure
  e->ReportError(MB_ICONEXCLAMATION,

AFX_IDP_INTERNAL_FAILURE);
  ASSERT(!bOK);
  DELETE_EXCEPTION(e);
 }
 END_CATCH_ALL

pThreadState->m_hLockoutNotifyWindow = hWndOldLockout;
 return bOK;
}

在对话框的重载函数DoDataExchange中,又调用CDialog::DoDataExchange(pDX)

void CSquare::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CSquare)
 DDX_Text(pDX, IDC_LENGTH, m_length);
 DDV_MinMaxInt(pDX, m_length, 10, 200);
 //}}AFX_DATA_MAP
}

UpdateData(TRUE); // 更新数据为真,则表示控件->成员变量
UpdateData(FALSE);// 更新数据为假,则表示成员变量->控件

所以,在更新数据时我们只调用UpdateData函数就行了!

VC++中的DDX和DDV的更多相关文章

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

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

  2. VC++中StretchBlt图像失真问题的解决办法

    在 VC 中使用 StretchBlt 会碰到一些与点阵图大小缩放相关的一些问题.在扩展一个点阵图时,StretchBlt必须复制图素行或列.如果放大倍数不是原图的整数倍,那么此操作会造成产生的图像有 ...

  3. VC++中开发汇编语言(转)

    汇编程序结构 一个显示字符串的汇编程序 程序格式 一.模式定义 二.includelib语句 三.函数声明语句 四.数据和代码部分 Visual C/C++环境 建立工程 汇编程序的调试 一.设置断点 ...

  4. VC中实现文字竖排的简单方法

    好多人都觉得在VC中实现文字竖排是一件很难的事情,其实可以使用“躺”着的字体很方便的实现文字竖排. Windows中有一些字体是“躺”着的,例如:@Fixedsys.@System.@宋体.@黑体等等 ...

  5. VC中基于 Windows 的精确定时[转]

    在工业生产控制系统中,有许多需要定时完成的操作,如定时显示当前时间,定时刷新屏幕上的进度条,上位 机定时向下位机发送命令和传送数据等.特别是在对控制性能要求较高的实时控制系统和数据采集系统中,就更需要 ...

  6. VC++中操作XML(MFC、SDK)转

    [转]VC++中操作XML(MFC.SDK) XML在Win32程序方面应该没有在Web方面应用得多,很多Win32程序也只是用XML来存存配置信息而已,而且没有足够的好处的话还不如用ini.VC++ ...

  7. VC中LINK 2001 和 LINK 2009 的错误的解决

    最近将两个开源C++项目编译成windows版本的时候遇到很多问题,关键是两个项目经过同事的修改之后,一个项目引用了另一个项目,两个项目的头文件中都有一些跨平台的关于数据类型,以及一些通用函数的定义, ...

  8. 浅谈VC++中预编译的头文件放那里的问题分析

    用C++写程序,肯定要用预编译头文件,就是那个stdafx.h.不过我一直以为只要在.cpp文件中包含stdafx.h 就使用了预编译头文件,其实不对.在VC++中,预编译头文件是指放到stdafx. ...

  9. VC中常用的宏

        我们在VS环境中开发的时候,会遇到很多宏定义,这些宏可以应用到代码中,或用于编译.工程选项等设置,总之是我们开发中必不可少的工具,有必要做一个总结.有些宏是C/C++定义的,有些宏是VC环境预 ...

随机推荐

  1. 【课程分享】ASP.NET MVC5&微信公众平台整合开发实战(响应式布局、JQuery Mobile,Windows Azure、微信核心开发)

    对这个课程有兴趣的,能够联系我QQ2748165793 基础知识储备 ASP.NET MVC 5基础(6讲) 第一讲-初识ASP.NET MVC并搭建整合开发环境 第二讲-深入MVC开发模式 第三讲- ...

  2. VS C++工程类成员初始化检测脚本

    最近项目中出现由类成员未初始化而进行读写而造成的问题,于是想将项目中所有的为初始化的地方找出来,优化一下代码,维护了这么多年的程序已有百万余行且VS2015还尚未支持检查类成员初始化的方法.,于是想写 ...

  3. 我的IOS学习之路(三):手势识别器

    在iOS的学习中,对于手势的处理是极为重要的,如对于图片,我们经常需要进行旋转,缩放以及移动等.这里做一下总结,详见代码. - (void)viewDidLoad { [super viewDidLo ...

  4. BZOJ 3916: [Baltic2014]friends( hash )

    字符串哈希..然后枚举每一位+各种判断就行了 ----------------------------------------------------------------------------- ...

  5. BZOJ 1668: [Usaco2006 Oct]Cow Pie Treasures 馅饼里的财富( dp )

    dp , dp[ i ][ j ] = max( dp[ k ][ j - 1 ] ) + G[ i ][ j ] ( i - 1 <= k <= i + 1 , dp[ k ][ j - ...

  6. Android Developers:按需求加载视图

    有时候你的布局可能需要较少使用的复杂视图.无论它们是项目详情,进度指示器,或者处理的信息,你能通过在它们被需要的时候加载的方式,来减少内存消耗和加快显示. 定义一个ViewStub ————————— ...

  7. ubuntu vim终端编辑命令

    一. VIM高亮 进入vim后,在普通模式下输入如下命令,开启php代码高亮显示   :syntax enable   :source $VIMRUNTIME/syntax/php.vim   二. ...

  8. 有意思的C宏

    在Linux内核.嵌入式代码等传统的C代码里,会有一些难以识别的宏定义.我记得在eCos, UBoot, FFmpeg有一些比较BT的宏定义,很难读懂.对于C++程序员来说,最好将这种难读的宏定义转成 ...

  9. 转:说说angularjs中的$parse和$eval

    说说AngularJS中的$parse和$eval AngularJS的初学者常常会对$parse和$eval两个内建服务感到有些困惑,今天我们就来说说AngularJS中的$parse和$eval. ...

  10. vs2012-vs2013编译出来的程序不能在xp上运行解决方法

    在链接标志中加入参数: /SUBSYSTEM:WINDOWS,"5.01" 在ide环境下: 项目属性-常规-平台工具集-Visual Studio 2013 - Windows ...