MFC程序员WTL指南(6)高级对话框用户界面类
2008-01-19 20:25:19 来源:WEB开发网ControlMania2有一个ID是IDC_FAV_SEASON的edit box,它和成员变量m_nSeason相关联。
由于有效的值是1到7,所以使用这样的数据验证宏:
BEGIN_DDX_MAP(CMainDlg)
//...
DDX_INT_RANGE(IDC_FAV_SEASON, m_nSeason, 1, 7)
END_DDX_MAP()
OnOK()调用DoDataExchange()获得season的数值,并验证是在1到7之间。
处理DDV验证失败
如果控件的数据验证失败,CWinDataExchange会调用重载函数OnDataValidateError(),默认到处理是驱动PC喇叭发出声音,你可能想给出更友好的错误指示。OnDataValidateError()的函数原型是:
void OnDataValidateError ( UINT nCtrlID, BOOL bSave, _XData& data );
_XData是一个WTL的内部数据结构,CWinDataExchange根据输入的数据和允许的数据范围填充这个数据结构。下面是这个数据结构的定义:
struct _XData
{
_XDataType nDataType;
union
{
_XTextData textData;
_XIntData intData;
_XFloatData floatData;
};
};
nDataType指示联合中的三个成员那个是有意义的,nDataType 的取值可以是:
enum _XDataType
{
ddxDataNull = 0,
ddxDataText = 1,
ddxDataInt = 2,
ddxDataFloat = 3,
ddxDataDouble = 4
};
在我们的例子中,nDataType的值是ddxDataInt,这表示_XData中的_XIntData成员是有效的,_XIntData是个简单的数据结构:
struct _XIntData
{
long nVal;
long nMin;
long nMax;
};
我们重载OnDataValidateError()函数,显示错误信息并告诉用户允许的数值范围:
void CMainDlg::OnDataValidateError ( UINT nCtrlID, BOOL bSave, _XData& data )
{
CString sMsg;
sMsg.Format ( _T("Enter a number between %d and %d"),
data.intData.nMin, data.intData.nMax );
MessageBox ( sMsg, _T("ControlMania2"), MB_ICONEXCLAMATION );
::SetFocus ( GetDlgItem(nCtrlID) );
}
_XData中的另外两个结构_XTextData和_XFloatData的定义在atlddx.h中,感兴趣的话可以打开这个文件查看一下。
改变对话框的大小
WTL引起我的注意的第一件事是对可调整大小对话框的内建的支持。在这之前我曾写过一篇关于这个主题的文章,详情请参考这篇文章。简单的说就是将CDialogResize类添加到对话框的集成列表,在OnInitDialog()中调用DlgResize_Init(),然后将消息链入CDialogResize。
继续
下一章,我将介绍如何在对话框中使用ActiveX控件和如何处理控件触发的事件。
参考
Using WTL''s Built-in Dialog Resizing Class - Michael Dunn
Using DDX and DDV with WTL - Less Wright
修改记录
2003年4月28日,本文第一次发表。
更多精彩
赞助商链接