分享
 
 
 

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

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

对话框数据交换及验证

对话框数据交换及验证

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);

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有