MFC程序员WTL指南(5)对话框与控件
2008-01-18 20:24:13 来源:WEB开发网核心提示:在OK按钮的处理函数中,我们首先调用DoDataExchange()将将edit控件的数据传送给我们刚刚添加的两个变量,MFC程序员WTL指南(5)对话框与控件(6),然后将结果显示在列表控件中,LRESULT CMainDlg::OnOK ( UINT uCode, int nID, HWND hWndCtl ){C
在OK按钮的处理函数中,我们首先调用DoDataExchange()将将edit控件的数据传送给我们刚刚添加的两个变量,然后将结果显示在列表控件中。
LRESULT CMainDlg::OnOK ( UINT uCode, int nID, HWND hWndCtl )
{
CString str;
// Transfer data from the controls to member variables.
if ( !DoDataExchange(true) )
return;
m_wndList.DeleteAllItems();
m_wndList.InsertItem ( 0, _T("DDX_TEXT") );
m_wndList.SetItemText ( 0, 1, m_sEditContents );
str.Format ( _T("%d"), m_nEditNumber );
m_wndList.InsertItem ( 1, _T("DDX_INT") );
m_wndList.SetItemText ( 1, 1, str );
}
如果编辑控件输入的不是数字,DDX_INT将会失败并触发OnDataExchangeError()的调用,CMainDlg重载了OnDataExchangeError()函数显示一个消息框:
void CMainDlg::OnDataExchangeError ( UINT nCtrlID, BOOL bSave )
{
CString str;
str.Format ( _T("DDX error during exchange with control: %u"), nCtrlID );
MessageBox ( str, _T("ControlMania1"), MB_ICONWARNING );
::SetFocus ( GetDlgItem(nCtrlID) );
}
作为最后一个使用DDX的例子,我们添加一个check box演示DDX_CHECK的使用:
DDX_CHECK使用的变量类型是int型,它的可能值是0,1,2,分别对应check box的未选择状态,选择状态和不确定状态。你也可以使用常量BST_UNCHECKED,BST_CHECKED,和 BST_INDETERMINATE代替,对于check box来说只有选择和未选择两种状态,你可以将其视为布尔型变量。
以下是为使用check box的DDX而做的改动:
class CMainDlg : public ...
{
//...
BEGIN_DDX_MAP(CMainDlg)
DDX_CONTROL(IDC_EDIT, m_wndEdit)
DDX_TEXT(IDC_EDIT, m_sEditContents)
DDX_INT(IDC_EDIT, m_nEditNumber)
DDX_CHECK(IDC_SHOW_MSG, m_nShowMsg)
END_DDX_MAP()
protected:
// DDX variables
CString m_sEditContents;
int m_nEditNumber;
int m_nShowMsg;
};
在OnOK()的最后,检查m_nShowMsg的值看看check box是否被选中。
void CMainDlg::OnOK ( UINT uCode, int nID, HWND hWndCtl )
{
// Transfer data from the controls to member variables.
if ( !DoDataExchange(true) )
return;
//...
if ( m_nShowMsg )
MessageBox ( _T("DDX complete!"), _T("ControlMania1"),
MB_ICONINFORMATION );
}
使用其它DDX_*宏的例子代码包含在例子工程中。
更多精彩
赞助商链接