VC++中的DDX和DDV

简介: DDX/DDV    通过使用ClassWizard向对话类添加成员变量,你可以利用ClassWizard所提供的高效特征,为对话数据交换和对话数据验证自动生成源代码,也就是人们所熟知的DDX/DDV。

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函数就行了!

目录
相关文章
|
编解码 Android开发 iOS开发
airserver软件激活码mac版
AirServer 可以方便的利用 AirPlay, Google Cast 以及 Miracast 等技术,将 iPhone, iPad, Mac, Android, Nexus, Pixel, Chromebook, 以及 PC 上面的内容投影到更大的屏幕上面,从而更好的促进协作。
7329 0
|
虚拟化
故障案例-ESXI6.7 EP13 紫屏分析
一台ESXI6.7 EP13 紫屏分析过程
2797 0
|
17天前
|
人工智能 自然语言处理 监控
AI客服机器人部署入门:意图识别模型话术配置3步快速上线
部署AI客服机器人需三步:构建高精度意图识别模型实现“听懂”,配置人性化话术确保“答好”,通过测试与数据驱动迭代保障“用稳”。该方法可系统性提升自动化解决率与用户体验,是企业客服智能化、降本增效的可靠路径。
167 3
|
人工智能 文字识别 数据挖掘
MarkItDown:微软开源的多格式转Markdown工具,支持将PDF、Word、图像和音频等文件转换为Markdown格式
MarkItDown 是微软开源的多功能文档转换工具,支持将 PDF、PPT、Word、Excel、图像、音频等多种格式的文件转换为 Markdown 格式,具备 OCR 文字识别、语音转文字和元数据提取等功能。
2721 9
MarkItDown:微软开源的多格式转Markdown工具,支持将PDF、Word、图像和音频等文件转换为Markdown格式
|
JavaScript 前端开发 API
【入门】你连Babel都不会配?那插件不成乱装了
大家好,我是小鑫同学。一位从事过Android开发、混合开发,现在长期从事前端开发的编程爱好者,我觉得在编程之路上最重要的是知识的分享,所谓三人行必有我师。所以我开始在社区持续输出我所了解到、学习到、工作中遇到的各种编程知识,欢迎有想法、有同感的伙伴加我fe-xiaoxin微信交流~
542 0
|
域名解析 缓存 网络协议
HTTP 和 HTTPS(请求响应报文格式 + 请求方法 + 响应状态码 + HTTPS 加密流程 + Cookie 和 Session)
1. HTTP 是什么 2. HTTP 请求报文和响应报文的格式 1)请求报文格式 2)响应报文格式 3)报文中空行的作用 3. HTTP 的长连接和短连接 4. URL 1)在浏览器中输入 www.baidu.com 后执行的全部过程 5. HTTP 常用的请求方法 6. GET 和 POST 的区别 7. HTTP 常见的响应状态码 8. HTTPS 是什么 1)SSL 协议 9. HTTPS 怎么进行 “加密” 1)对称加密 2)非对称加密 3)CA 证书 4)HTTPS 加密的完整流程 10. HTTPS 的优缺点 11. HTTPS 和 HTTP 的区别
790 0
|
存储 编解码 算法
图形学 | 格物致知!PNG 除了无损压缩你还知道什么?
图形学 | 格物致知!PNG 除了无损压缩你还知道什么?
628 0
图形学 | 格物致知!PNG 除了无损压缩你还知道什么?
|
存储 安全 Go
满分入选! 阿里云“软硬融合入侵检测卸载方案”亮相ISCA2022
满分入选! 阿里云“软硬融合入侵检测卸载方案”亮相ISCA2022
满分入选! 阿里云“软硬融合入侵检测卸载方案”亮相ISCA2022
|
存储 JavaScript 前端开发
REPL 介绍|学习笔记
快速学习 REPL 介绍
|
文件存储 Serverless 弹性计算
基于函数计算 + TensorFlow 的 Serverless AI 推理
本文介绍了使用函数计算部署深度学习 AI 推理的最佳实践, 其中包括使用 FUN 工具一键部署安装第三方依赖、一键部署、本地调试以及压测评估, 全方位展现函数计算的开发敏捷特性、自动弹性伸缩能力、免运维和完善的监控设施。
6352 0