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

转载 2006年05月17日 22:03:00

对话框的数据交换和验证机制(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浅析(6) 对话框数据交换及验证

对话框数据交换及验证
  • FMD
  • FMD
  • 2001年06月16日 13:11
  • 2270

MFC创建一个用户名密码登录对话框

本人最近在做一个大项目的上位机软件,也是边摸索边写代码。经过各方面搜集资料和几天的不断尝试,终于写出了第一个模块---账户管理界面。本着饮水思源,取之于网络,用之于网络的思想,在此跟大家分享经验和教训...
  • walkman_lfq
  • walkman_lfq
  • 2015年12月16日 14:56
  • 3653

MFC中两个对话框之间数据传递

这里有两种情况, 第一种情况是: (在一个基于单文档的应用程序中,新建了两个对话框A和B,并且用两个独立的类和他们关联) 对话框A中有一个编辑框, 按下A中的一个按钮a后弹出对话框B, B中也有一个...
  • foreverhuylee
  • foreverhuylee
  • 2014年03月21日 11:56
  • 25510

MFC-对话框与数据交换

MFC-对话框与数据交换   对话框是非常重要的一种窗体,就我看过的应用,除了MDI程序,对话框比文档视图框架用得更多。原因大概有两个,首先对话框可以利用资源编辑器来编辑,这就有了一点快...
  • feimashenhua
  • feimashenhua
  • 2012年05月10日 16:18
  • 489

[MFC]DoDataExchange的对话框数据交换和检验

1. 对话框里控件上的数据应该如何保存?     1) 一般需要在CDialog的派生类中定义一些数据成员用来保存控件中用户输入的数据;     2) 那么最大的问题就是如何让这些定义的数据成员和控件...
  • Lirx_Tech
  • Lirx_Tech
  • 2015年09月04日 16:16
  • 1265

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

MFC中对话框的数据交换(DDX)和数据校验(DDV) DDX : dialog data exchange DDV : dialog data validation 文档描述MFC中的DD...
  • HMSIWTV
  • HMSIWTV
  • 2012年11月29日 21:19
  • 833

mfc中模态、非模态对话框与主对话框之间的数据交换

  • 2012年11月21日 18:34
  • 2.22MB
  • 下载

VC实现模态对话框与应用程序之间的数据交换

  • 2010年01月24日 21:43
  • 60KB
  • 下载

java中创建简单的对话框和数据交换

源代码区域: 主代码: package dialogFrame; import java.awt.BorderLayout; import java.awt.event.*; import...
  • qq_32175491
  • qq_32175491
  • 2016年09月23日 20:07
  • 170

数据交换利器 Protobuf 技术浅析

由于最近公司采用protocol buffer(以下简称protobuf)来作为不同应用之间的数据交换,故最近一段时间研究了protobuf相关技术。在这里分享下。 protobuf是什么? ...
  • qq_35624156
  • qq_35624156
  • 2017年11月08日 17:53
  • 71
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC浅析(6) 对话框数据交换及验证
举报原因:
原因补充:

(最多只允许输入30个字)