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. xcode 资源管理

    我个人觉得这么理解就够了 其他的以后再说

  2. C++内联函数与宏定义

    用内联取代宏: 1.内联可调试: 2.可进行类型安全检查或自动类型转换: 3.可访问成员变量. 另外,定义在类声明中的成员函数自动转化为内联函数. 文章(一) 内联函数与宏定义 在C中,常用预处理语句 ...

  3. 类中成员函数与数据成员private/pubic/protected

    类中成员函数与数据成员private/pubic/protected

  4. Linux中ssh的免密码登陆

    原理: Hadoop的各个节点要实时的进行各种通信的,ssh就是能让各个节点免密码的相互访问相互通信. 操作步骤: 这里用的加密方式是非对称的加密方式,具体的操作是: <1>执行命令ssh ...

  5. MSSQL 修改数据库的排序规则

    1.修改数据库排序规则 ALTER DATABASE [CHARACTER] COLLATE Chinese_PRC_CI_AS ; 2.修改表中列的排序规则 如果下列其中之一当前正在引用一个列,则无 ...

  6. jquery+easy ui 实现表格列头筛选

    示例代码 1.筛选的下拉 <a href="javascript:void(0)" id="filterStatus" class="easyu ...

  7. Oracle的大数据类型,BIG DATA TYPE

    1.CLOB 字符LOB类型,主要用于存储大型英文字符 2.NCLOB 国际语言字符LOB类型,主要用于存储大型非英文字符 3.BLOB 二进制LOB类型,主要用于存储二进制数据 4.BFILE 二进 ...

  8. jQuery File Upload 插件 php代码分析

    jquery file upload php代码分析首先进入构造方法 __construct() 再进入 initialize()因为我是post方式传的数据  在进入initialize()中的po ...

  9. RatProxy

    http://book.51cto.com/art/201212/374023.htm http://www.oschina.net/p/ratproxy/similar_projects

  10. Linux 动态库剖析

    进程与 API 动态链接的共享库是 GNU/Linux® 的一个重要方面.该种库允许可执行文件在运行时动态访问外部函数,从而(通过在需要时才会引入函数的方式)减少它们对内存的总体占用.本文研究了创建和 ...