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

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

对话框数据交换及验证

FMD(http://www.fmdstudio.net)

对话框的数据交换和验证机制(DDX、DDV)可以使对话框上控件与对象数据成员间协调工作。

包括控件窗口与控件对象间的连接,控件窗口与对话框数据成员间的连接,以及数据成员的合法性验证等等。

在 virtual void DoDataExchange(CDataExchange* pDX);中记录了这些关系:

例如:

 DDX_Control(pDX, IDC_BUTTON1, m_btn); //CButton对象到控件窗口IDC_BUTTON1的关联
 DDX_Text(pDX, IDC_EDIT1, m_int);   //整型数据到编辑窗口的关联
 DDV_MinMaxInt(pDX, m_int, 0, 40);   //整型数据的范围验证

必要时,可以自己编写验证函数实现特定内容检验。

相关的成员函数:

CDialog::OnInitDialog();

CWnd::DoDataExchange();

CDialog::DoDataExchange();

1 .控件关联

DDX_Control实现控件窗口和C++控件对象的关联。

由于对话框是以模板的方式建立的,故控件窗口都是事先建立好的。

C++控件对象用SubClassWindow的方法附着在控件窗口上,管理窗口的行为。

内部流程分析:

①OnInitDialog 时调用基类CDialog::OnInitDialog();

BOOL CDialog::OnInitDialog()
{
 .....
 // 执行UpdateData(),参数为FALSE,表示初始化
 if (!UpdateData(FALSE))
 {
  ....
 }
 .....
}

②UpdateData()

BOOL CWnd::UpdateData(BOOL bSaveAndValidate)
{
 ....
 
 //调用虚函数DoDataExchange
 CDataExchange dx(this, bSaveAndValidate);
 ....
 TRY
 {
  DoDataExchange(&dx);
  bOK = TRUE;         // it worked
 }
 .....
}
③DoDataExchange
void C????Dlg::DoDataExchange(CDataExchange* pDX)
{
 ....
 //对象到窗口的关联。
 DDX_Control(pDX, IDC_BUTTON1, m_btn);
 ....
}
④DDX_Control
void AFXAPI DDX_Control(CDataExchange* pDX, int nIDC, CWnd& rControl)
{
 if (rControl.m_hWnd == NULL)    //若还未关联 
 {
  //窗口句柄
  HWND hWndCtrl = pDX->PrepareCtrl(nIDC);
  // SubclassWindow 实现关联。
  if (!rControl.SubclassWindow(hWndCtrl))
  {
   ....
  }
  ....
 }
}

至此,控件对象与对话框上的子窗口关联上了,可以通过对控件对象的操作来管理该子窗口。

2 .数据关联

大致流程与前相似。在对话框OnOK()时将调用Update(TRUE),参数TRUE表示读出及校验数据。

另可根据需要,随时调用Update(TRUE)完成窗口内容到成员数据的校验及转换。

流程分析(以编辑框到整数的关联为例)

①DoDataExchange

void C???Dlg::DoDataExchange(CDataExchange* pDX)
{
 ....
 DDX_Text(pDX, IDC_EDIT1, m_int);
 ....
}

②DDX_Text

void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, int& value)
{
 
 if (pDX->m_bSaveAndValidate) //读取及校验
  _Afx_DDX_TextWithFormat(pDX, nIDC, _T("%d"), AFX_IDP_PARSE_INT, &value);
 else //初始化
  _Afx_DDX_TextWithFormat(pDX, nIDC, _T("%d"), AFX_IDP_PARSE_INT, value);
}

③_Afx_DDX_TextWithFormat

在对话框初始化时,m_bSaveAndValidate参数为FALSE;

在进行数据读取时,m_bSaveAndValidate参数为TRUE;

AFX_STATIC void AFX_CDECL _Afx_DDX_TextWithFormat(CDataExchange* pDX, int nIDC,
 LPCTSTR lpszFormat, UINT nIDPrompt, ...)
 // only supports windows output formats - no floating point
{
 ....
 //窗口句柄
 HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC);
 TCHAR szT[32];
 if (pDX->m_bSaveAndValidate)
 { 
  //读取 
  // the following works for %d, %u, %ld, %lu
  ::GetWindowText(hWndCtrl, szT, _countof(szT));
  if (!_AfxSimpleScanf(szT, lpszFormat, pData))
  {
   AfxMessageBox(nIDPrompt);
   pDX->Fail();        // throws exception
  }
 }
 else //对话框初始化时,以成员数据内容初始窗口内容。
 {
 
  //初始化窗口内容。
  wvsprintf(szT, lpszFormat, pData);
  AfxSetWindowText(hWndCtrl, szT);
 }
 ....
}

3. 数据验证

流程分析(以整数数值范围验证为例)

void C????Dlg::DoDataExchange(CDataExchange* pDX)
{
 ....
 DDV_MinMaxInt(pDX, m_int, 0, 40);
 ....
}
void AFXAPI DDV_MinMaxInt(CDataExchange* pDX, int value, int minVal, int maxVal)
{
 ASSERT(minVal <= maxVal);
 
 //验证
 if (value < minVal || value > maxVal)
  //报错返回
  _AfxFailMinMaxWithFormat(pDX, (long)minVal, (long)maxVal, _T("%ld"),
   AFX_IDP_PARSE_INT_RANGE);
}
[MFC]DoDataExchange的对话框数据交换和检验 1. 对话框里控件上的数据应该如何保存?     1) 一般需要在CDialog的派生类中定义一些数据成员用来保存控件中用户输入的数据;     2) 那么最大的问题就是如何让这些定义的数据成员和控件中的数据进行及时的交流——使用SetDlgItemText和GetDlgItemText两个函数即可:          i. 在OnInitDialog中使用SetDlgItemText将数据 阅读详情

相关推荐

MFC中模态对话框和非模态对话框的区别

MFC对话框有两种形式,一个是模态对话框(model dialog box),一个是非模态对话框(modeless dialog box)。二者的区别在于当对话框打开时,是否允许用户进行其他对象的操作。 一、模态对话框(model dialog box) 在程序运行的过程中,若出现了模态对话框,那么主窗口将无法发送消息,直到模态对话框退出才可以发送。点击模态对话框中的OK按钮,模态对话框会被销毁...

亲亲Friends的博客 4664

对话框数据交换

对话框数据交换 对话框数据交换指以下两种动作,或者是把内存数据写入对应的控制窗口,或者是从控制窗口读取数据并保存到内存变量中。MFC为了简化这些操作,以CDataExchange类和一些数据交换函数为基础,提供了一套数据交换和校验的机制。 数据交换的方法 首先,定义保存数据的内存变量──给对话框添加成员变量,每个控制窗口可以对应一个成员变量,或者是控制窗

c65547bd的博客 1031

MFC】学习MFC day3 vs2019 基于对话框MFC应用程序

MFC】学习MFC day3 vs2019 基于对话框MFC应用程序 上一篇 今天目标: 编写一个基于对话框的类似网页表单的MFC程序 需要一个3个界面(主界面,信息填写界面(非模态对话框),信息提交确认界面(模态对话框)) 本章源代码的GitHub链接会放在底部 主界面:显示信息汇总 信息填写界面:填写信息 信息提交确认界面:确认提交信息 模态对话框与非模态对话框 模态对话框(Modal Dialogue Box,又叫做模式对话框),是指在用户想要对对话框以外的应用程序进行操作时,必须首先对该对

m0_46202128的博客 3461

Vc中对话框数据交换验证机制

对话框数据交换验证机制    在VC中,所有的对话框函数都是使用C++代码实现的,它并没有采用特殊的资源或“奇特”的宏,但却可以很好地实现用户与应用程序之间的交互工作,这里的关键就在于对话框应用程序中广泛采用的对话框数据交换验证机制。    对话框数据交换(Dialog Data Exchange,DDE)用于初始化对话框中的控件并获取用户的数据输入,而对话框数据验证(Dialog

博文视点(北京)官方博客 2530

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 1442

DDX双精度或浮点数为特定格式

一客户要求定制一对话框,显示几个数据,本以为几分钟就能搞定的事,却突然被一要求砸晕:客户要求其中一编辑框显示百分比,而且小数点必须是两位,也就是是说,如果是百分比为0的话,就要显示0.00。虽然情急之下用CString来关联编辑框,加上Format成员函数和scanf函数,也很快搞定。但也惊出一身冷汗,发现原来最简单的东西下面还有不简单啊。后仔细查阅资料,并翻看MFC源码,发现确实没有简单的方法来

七七八八 3210

MFC对话框数据交换

       对话框是非常重要的一种窗体,就我看过的应用,除了MDI程序,对话框比文档视图框架用得更多。原因大概有两个,首先对话框可以利用资源编辑器来编辑,这就有了一点快速开发的感觉,尽管比真正的快速开发弱得多;其次,对话框提供一种叫数据交换的方法,让控件与某种数据类型关联起来,比如Edit控件与CString变量关联,对CString变量的操作间接映射到Edit控件,这种方便性是不言而喻的。

colin 7256

MFC对话框数据交换

对话框         对话框分为模态对话框和无模态对话框。 模态对话框就是指在子对话框弹出时,焦点被强行集中于该子对话框,子对话框不关闭,用户将无法操作其他的窗口。非模态相反,用户仍然可以操作其他的窗口,包括该子对话框的父对话框。 如果从线程角度来讲,模态对话框实际上是线程阻塞的,也就是子对话框是一个线程,但是在创建这个子线程之后,父窗口就阻塞了;模态对话框则不是阻塞型的线程模型,父子线程

超越 2947

MFC对话框

本篇文章不是系统的介绍MFC对话框相关的内容。本篇的知识点会很碎,学到哪里就写到哪里。 本文参考链接: 1.mfc最详细入门教程_wang18323834864的博客-CSDN博客_mfc 1> 对话框的属性 属性名称 含义 ID 对话框ID,唯一标识对话框资源 Caption 对话框标题 Border 边框类型 M.

sinat_41752325的博客 2197

【05】MFC入门到精通——MFC对话框中的控件添加变量 和 数据交换和检验

本文介绍了为对话框控件添加变量并实现数据交换的步骤:首先通过右键菜单为编辑框控件添加double类型的成员变量(如m_editSummand),这些变量会在Dlg.h头文件和Dlg.cpp初始化函数中自动生成。MFC通过DoDataExchange()函数实现控件与变量之间的数据交换,该函数包含DDX_Text调用语句。数据交换需手动调用UpdateData()函数完成,其参数TRUE表示从控件传值到变量,FALSE则相反。整个过程建立了对话框控件与成员变量的双向数据绑定机制,为后续的消息处理奠定了基础。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1307

MFC对话框获取输入

题目 在MFC调用对话框读入数据,并在客户区输出。 这是《计算机图形学基础教程》的一个习题: 使用MFC设计一个长方形类CRectangle,调用对话框读入长方形的长度和宽度,在客户区输出长方形的周长和面积。 这个书上并没有教怎么用对话框读取输入,我在这之前也完全没接触过MFC对话框。弄了两小时,终于把这道题做出来了。以此文记录一下 参考链接 MFC调用输入对话框并返回输入信息 MFC对话...

乱世之尘 1万+

MFC基于对话框编程

MFC基于对话框编程 目录 基于对话框编程 创建基于对话框MFC 应用程序框架 资源视图 类视图 模态对话框 非模态对话框 对话框是一种特殊类型的窗口,绝大多数Windows程序都通过对话框与用户进行交互。 在Visual C++中,对话框既可以单独组成一个简单的应用程序,又可以成为文档/视图结构程序的资源。 创建基于对话框MFC 应用程序框架 程序的创建过程: 选择“文件 | 新建 | 项目”菜单; 在“新建项目”对话框中,选择“ MFC 应用程序 ”,输入工...

baidu_41388533的博客 2929

MFC编辑框的数据交换

 对话框数据交换指以下两种动作,或者是把内存数据写入对应的控制窗口,或者是从控制窗口读取数据并保存到内存变量中。MFC为了简化这些操作,以CDataExchange类和一些数据交换函数为基础,提供了一套数据交换和校验的机制。数据交换的方法首先,定义保存数据的内存变量──给对话框添加成员变量,每个控制窗口可以对应一个成员变量,或者是控制窗口类型,或者是控制窗口表示的数据的类型。例如,对于

1677

MFC对话框

<br />对话框经常被使用,因为对话框可以从模板创建,而对话框模板是可以使用资源编辑器方便地进行编辑的。<br />一,模式与非模式对话框<br />1.模式对话框<br />    一个模式对话框是一个有系统菜单、标题栏、边线等的弹出式窗口。在创建对话框时指定WS_POPUP, WS_SYSMENU, WS_CAPTION和 DS_MODALFRAME风格。即使没有指定WS_VISIBLE风格,模<br />式对话框也会被显示。创建对话框窗口时,将发送WM_INITDIALOG消息(如果指定对话框的DS

FlowShell的专栏 1万+

MFC 对话框

MFC 对话框,模态和非模态,动态创建按钮,控件访问等等

qq_61553520的博客 4089

对话框数据交换验证

对话框数据交换Dialog Data Exchange DDX,它用来在对话框类中创建变量,并与对话框上的控件相关联。 对话框数据验证简称DDV,主要用来设定变量的合理范围。 如果使用DDX,通常在对话框的构造函数或OnInitDialog()中设置其成员变量,因为,在调用DoModal()或Create()函数显示对话框之前,DDX机制就会立即将对话框的成员变量值传送给相应的控件,这样当对话框

空山无人,水流花开 693

1.3 基于对话框MFC应用程序实例

MFC的全程是“Microsoft Foundation Classes”(微软基础类库),是微软为了简化Windows下应用程序的编写而提供的一个框架。MFC对基本API做了封装,并提供了数量众多的C++封装类。在编程时使用MFC,虽然会降低少许运行效率,但是会大大提高应用程序的开发效率。1.3.1 技术要点: 对话框Windows系统中的特殊窗口,对话框在系统内部已经实现了消息处理等功能,使得

圣诞树下的我们 5083
上一篇: MFC浅析(5) 命令更新机制
下一篇: MFC浅析(7) CWnd类虚函数的调用时机、缺省实现
FMD
FMD
博客等级 码龄26年 10粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值