打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
理解MFC(五)

理解MFC(五) —— 对话框数据交换与核查(DDX & DDV)

2014年09月05日 ? 综合 ? 共 1301字 ? 字号 ? 评论关闭

MFC提供DDX(X 表示eXchange),用于设定控件与变量的对应关系。不但可以令控件的内容一有改变就自动传送到变量,还可以藉MFC提供的DDV(V 表示Validation)设定字段的合理范围。

为EDIT控件添加了一个Value类别的int变量,名字是width_,最小值是0,最大值是10。添加好之后在DoDataExchange()函数中自动新增了两行代码

对于变量width_,我们一般这么用:

(1)Save From Screen

也就是Retrieve and validate dialog data,从控件读取数据保存到变量中。调用:“UpdateData(TRUE);”,这时Framework 会自动调用DoDataExchange()函数,并读取EDIT控件的内容,然后保存到变量width_中。

(2)Write To Screen

这时ramework 也会自动调用DoDataExchange()函数,并把width_变量保存的数值更新到控件显示。

那DDX_Text()是如何完成这两项工作的?我们可以到源码中一探究竟。

DDX_Text()首先判断pDX->m_bSaveAndValidate的值。如果为TRUE,则是要“Save From Screen”,于是在调用_Afx_DDX_TextWithFormat()时,最后一个参数传递的是控件变量(width_)的地址,否则直接传值就可以了。然后把工作都交给_Afx_DDX_TextWithFormat()来完成。

那pDX->m_bSaveAndValidate的值是怎么来的呢?它其实是由UpdateData()的参数决定的。

先看看UpdateData()的源码吧。

在UpdateData()中,先构造CDataExchange类型的对象dx,并将bSaveAndValidate传递到CDataExchange的构造函数中,用于初始化成员变量m_bSaveAndValidate。最后以dx为参数调用DoDataExchange()。于是就到了上面的DDX_Text()。

好了,继续看_Afx_DDX_TextWithFormat()。

如果pDX->m_bSaveAndValidate为TRUE,则调用GetWindowText函数获取控件内容,然后通过_sntscanf_s()读到pResult中。pResult就是控件变量width_的地址。如果pDX->m_bSaveAndValidate为FALSE,则调用AfxSetWindowText函数将变量内容更新到控件窗口显示。

AfxSetWindowText()的源码如下,它调用SetWindowText()来设置窗口文本。

那DDV_MinMaxInt()是如何来判断输入的数值是否合法(是否在0 ~ 10之间)呢?来看源码:

很简单,就是一个ASSERT和一个if。如果value的值不在(minVal, maxVal)之间就调用_AfxFailMinMaxWithFormat(),进而会弹出一个错误提示框。

我觉得理解到这个程度差不多了,先喝杯水休息一下。

学习资料:《深入浅出MFC》

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
MFC中的DoDataExchange(CDataExchange *pDX)
MFC浅析(6) 对话框数据交换及验证
MFC:Tab Control 控件的利用
vc++ DDX和DDV UpdateData()控件与变量之间值的传递
MFC中UpdateData()函数的使用
VS2010/MFC编程入门之八(对话框:创建对话框类和添加控件变量)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服