MFC中对话框的数据交换(DDX)和数据校验(DDV)。。。

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

MFC中对话框的数据交换(DDX)和数据校验(DDV)
<reference MFC TNO 26>
DDX : dialog data exchange
DDV : dialog data validation
文档描述MFC中的DDX DDV机制,如何使用DDX_和DDV_ 函数和定制自己的DDX_ ,DDV_函数;

Dialog Data Exchange概要:
对话框的数据交换不依赖于任何宏来实现,全部依赖于C++代码实现,唯一特别之处在于每一个对话框如果想处理自己的数据交互必须重载一个虚函数void CMyDialog::DoDataExchage(CDataExchage* pDX)

最常见的形式:
void CMyDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);    // call base class
    //{{AFX_DATA_MAP(CMyDialog)
        <data_exchange_function_call>       
    //}}AFX_DATA_MAP
}
在包含AFX的2个字段之间的部分,向导用来定位和编辑代码;
如果想实现自定义的DDX DDV应该定位在这2个字段外

可以在头文件afxdd_.h中找到MFC定义的一些关于DDV DDX的函数的声明;

注意:
DDX /DDV技术虽然被称为对话框数据交换和校验,但是适用于任何需要与控件进行数据交换和校验的CWnd派生类

这些用于交换的成员数据变量一般在对话框的构造函数中的
//{{AFX_DATA_INIT 和
//}}AFX_DATA_INIT之间的字段中进行初始化的

CWnd::UpdateData()函数用来封装对数据交换(初始化或获取数据)和校验的处理(范围出错)

在程序的任意部分都可以通过调用UpdateData来进行数据交换或数据校验;
默认情况下
在对话框的OnInitDialog()函数中会调用UpdateData(FALSE);
在对话框的OnOK()函数中会调用UpdateData(TRUE);


DDX/DDV技术实现
DDX/DDV技术实现用于帮助实现定制的DDX和DDV函数

DoDateExchange成员函数类似于序列化中Serialize函数,不同之处在于DoDateExchange是从对话框的控件上读取或写入数据,而在这个过程中的CDataExchage对象类似序列化中于CArchive对象;CDataExchange对象也有数据方向标识:
• if !m_bSaveAndValidate,   设定控件上的数据
• if m_bSaveAndValidate,    读取控件上的数据
只有当m_bSaveAndValidate的值设定时才进行校验,这个值是通过传给UpdateData的参数来设定的;

CDateExchage中还有几个有意义的成员:
m_pDlgWnd : 含有控件的窗体 (通常是对话框),这样可以避免每次调用DDX/DDV函数时需要将this指针传人;
PrepareCtrl or PrepareEditCtrl: 将要数据交互的控件, 当某一个控件的数据交互失败时,则将设定焦点在这个控件上(PrepareCtrl是非Edit控件, 而PrepareEditCtrl是Edit控件);
Fail: 显示一个对话框来告知输入错误;这个函数在DDX DDV函数中被调用,该函数会保持最后一个那个PrepareCtrl的数据的焦点,并抛出异常

用户可实现扩展(User Extensions)
有几种方法可以用于实现扩展DDX DDV机制:
• 增加一种新数据类型.
• CTime
• 增加新的数据交换函数 (DDX_???).
• void PASCAL DDX_Time(CDataExchange* pDX, int nIDC, CTime& tm);
• 增加新的数据校验函数(DDV_???).
• void PASCAL DDV_TimeFuture(CDataExchange* pDX, CTime tm, BOOL bFuture);
• //make sure time is in the future or past
• 特定的数据校验.
• DDV_MinMax(pDX, age, 0, m_maxAge);
注意只有最后一种方法是不能为类向导支持的,所以不能置于类向导标识字段中


类向导的支持(ClasWizard Support)
类向导通过支持一个个性化子集来允许用户将自己编写的DDX_ DDV_函数集成到类向导中;这样做可以在可以使定制的DDX DDV函数在一直有效(在任意工程中都可以使用)或只在一个工程中有效;

实现这些功能需要在DDX.CLW或工程的.CLW中添加一些特殊的字段
在DDX.CLW(位于/Program Files/Microsoft Visual Studio/Visual C++/bin 也可能不存在需要用户创建)[ExtraDDX]字段添加的信息则可以在任意工程中使用;而在用户工程的CLW中[GENERAL INFO]字段添加的信息则只可以在该工程的向导中使用

相关字段的格式及意义:
ExtraDDXCount = n
//n 表示ExtraDDx的数目 如下:
ExtraDDX?=<keys>;<vb-keys>; <prompt>; <type>; <initValue>; <DDX_Proc> [;<DDV_Proc>; <prompt1>; <arg1>; [<prompt2>; <fmt2>]]
//?表示列表中的第几个DDX 被定义;每一个字段由‘;‘ 字符分开每个参数的意义如下: 
<keys>
//指示符表示适用的对话框中控件类型 如下
E = edit
C = two-state check box
c = tri-state check box
R = first radio button in a group
L = non-sorted list box
l = sorted list box
M = combo box (with edit item)
N = non-sorted drop list
n = sorted drop list
1 = if the DDX insert should be added to head of list (default is add to tail)  This is generally used for DDX routines that transfer the 'Control' property.
<vb-keys>
这个字段仅在16位程序中用于VBX控件(32位程序已不使用)
<prompt> =
置于属性组合框类向导中设定数据交换的对话框propery combo box)中的字符串提示信息<type> =
需要载头文件中包含的引用的用于数据交换的数据类型 如上CTime
<vb-keys> =
当前版本中必须为空(VC6.0)
<initValue> =
初始化值0或空,如果为空则在初始化字段中(//{{AFX_DATA_INIT}})不会有任何初始化字段 通常一个C++对象这个字段为空表示调用默认的构造函数来保证正确的初始化
<DDX_Proc> =
DDX调用(routine)的标识;这个C++函数必须以DDX_开头但是在这个字段只需写入DDX_以后的字段如添上Time则类向导会在{{AFX_DATA_MAP字段中加上DDX_字段结果在{{AFX_DATA_MAP中就是这样:DDX_Time
<comment> =
在对话框中当前DDX显示描述变量的内容,同上promopt在使用向导时可视;一般描述DDX/DDV对的完成的操作
<DDV_Proc>
DDV部分在这里是可选的;并非全部的DDX都需要对应的数据校验函数。
= DDV调用(routine)的标识如<DDV_Proc>字段的格式;
 其后为1 或 2 DDV 参数:
<promptX> =
类向导中在edit item位置之前的字符串提示信息(向导中)
<fmtX> =
格式化字符表示参数类型
d = int
u = unsigned
D = long int (that is, long)
U = long unsigned (that is, DWORD)
f = float
F = double
s = string

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yg_9527/archive/2006/04/28/695665.aspx

[MFC]DoDataExchange对话框数据交换检验 1. 对话框里控件上的数据应该如何保存?     1) 一般需要在CDialog的派生类中定义一些数据成员用来保存控件中用户输入的数据;     2) 那么最大的问题就是如何让这些定义的数据成员控件中的数据进行及时的交流——使用SetDlgItemTextGetDlgItemText两个函数即可:          i. 在OnInitDialog中使用SetDlgItemText将数据 阅读详情

相关推荐

MFC用户账户管理系统实战:从CRUD到数据持久化的完整开发指南

面向对象编程(OOP)是构建复杂软件系统的核心思想,它将数据与操作封装成对象,通过消息传递实现交互。在Windows桌面开发领域,MFC(Microsoft Foundation Classes)框架是这一思想的经典实践,它将Windows API封装成C++类,简化了图形界面(GUI)程序的开发。其技术价值在于,开发者可以基于成熟的文档/视图架构或对话框模式,快速构建出稳定、高效的本地应用程序。在数据管理、工具软件等应用场景中,这类程序常需实现数据的增删改查(CRUD)与持久化存储。本文即以一个具体的MF

weixin_34185512的博客 603

DoDataExchange(CDataExchange *pDX)

对话框中有这么一个函数  其作用是与对应的变量交换对话框数据   MSDN 解释为:         Called by the framework to exchange and validate dialog data.   virtual void DoDataExchange( CDataExchange* pDX );

目前打算换一个工作,有招聘windows c++方向的也欢迎联系,北京、济南 最好 8182

MFC对话框数据交换(DDX)数据校验(DDV)

MFC对话框数据交换(DDX)数据校验(DDV)DDX : dialog data exchangeDDV : dialog data validation文档描述MFC中的DDX DDV机制,如何使用DDX_DDV_ 函数定制自己的DDX_ ,DDV_函数;Dialog Data Exchange概要:对话框数据交换不依赖于任何宏来实现,全部依赖于C++代码实现,唯一特别之处在于

永彦的专栏 7710

MFC浅析(6) 对话框数据交换及验证

对话框数据交换验证机制(DDXDDV)可以使对话框上控件与对象数据成员间协调工作。 包括控件窗口与控件对象间的连接,控件窗口与对话框数据成员间的连接,以及数据成员的合法性验证等等。 在 virtual void DoDataExchange(CDataExchange* pDX);中记录了这些关系: 例如:  DDX_Control(pDX, IDC_BUTTON1, m_b

无幻 2370

MFC控件数据交换:DDX

MFC中操纵控件    操作控件的两种方式:    方式1 通过调用CWnd::GetDlgItem()函数,根据控件ID获取控件对象指针,操作控件即可。          对话框的初始化函数:OnInitDialog()        方式2 对话框数据交换技术(DDX)     将控件一个成员变量绑定,可以通过操作成员变量达到操作控件的目的。    1 定义与控件绑定的成员变

eldn__的专栏 1万+

MFC对话框数据交换(DDX)数据

DDX : dialog data exchange DDV : dialog data validation 文档描述MFC中的DDX DDV机制,如何使用DDX_DDV_ 函数定制自己的DDX_ ,DDV_函数; Dialog Data Exchange概要:对话框数据交换不依赖于任何宏来实现,全部依赖于C++代码实现,唯一特别之处在于每一个对话框如果想处理自己的数据交互必须重载一个虚

Tiger Liu share his technical articles here 1443

技术演进中的开发沉思-36 MFC系列: 对话框

本文以MFC对话框开发为主题,通过生动的比喻详细讲解了对话框编辑器的可视化设计功能、消息处理机制、数据交换与验证(DDX/DDV)的实现原理,以及两种调用方式(DoModalCreate)的区别与适用场景。文章特别强调了ClassWizard工具在简化开发流程中的重要作用,它能自动生成对话框类框架、消息映射变量绑定代码,大幅提升开发效率。作者结合自身开发经验,指出MFC对话框设计理念对现代前端框架的影响,认为其将复杂交互逻辑封装、专注于用户体验的思想至今仍有借鉴价值。全文通过"会客室&quot

你的天空阅读专栏 1055

5.5 在对话框中进行数据交换数据检查

MFC提供两种方法在对话框中进行数据交换数据检查(Dialog data exchange/Dialog data validation),数据交换数据检查的思想是将某一变量对话框中的一个子窗口进行关联,然后通过调用BOOL UpdateData( BOOL bSaveAndValidate = TRUE )来指示MFC将变量中数据放入子窗口还是将子窗口中数据取到变量中并进行合法性检查。IDC_EDIT_TEST CString m_szEdit 输入框中输入的文本,最大长度为5。

qq_41237850的博客 665

C++控件的数据交换数据校验

MFC采用了独特的DDXDDV技术。 DDX数据成员变量同对话类模板内的控件相连接,这样就使得数据在控件之间很容易地传输。 DDV用于数据校验,例如它能自动校验数据成员变量数值的范围,并发出相应的警告。 在类向导下添加成员变量的过程很简单,需要说明的是 。在DDVDDX技术中,允许用户为同一个控件关联多个数据成员变量,但必须保证这些变量名是互不相同的,且这些变量在同一...

weixin_30648963的博客 196

MFC中的DoDataExchange表示什么功能?

MFC 对话框数据管理的核心,它封装了控件与变量之间的数据交换逻辑,简化了代码编写,并提供了自动的数据验证机制。理解它有助于更好地掌握 MFC对话框编程。

cicada15的博客 354

DoDataExchange使用

DoDataExchange( ) void CRegisterDialog::DoDataExchange(CDataExchange* pDX) ...{ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CRegisterDialog) DDX_Control(pDX, IDC_INCOME

Marcelxx的专栏 2182
上一篇: #define new DEBUG_NEW...
下一篇: C++ 枚举类型。。。
Beyond_cn
博客等级 码龄17年 184粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值