WEB开发网
开发学院软件开发VC MFC程序员WTL指南(5)对话框与控件 阅读

MFC程序员WTL指南(5)对话框与控件

 2008-01-18 20:24:13 来源:WEB开发网   
核心提示:最后,在OnInitDialog()中调用DoDataExchange()函数,MFC程序员WTL指南(5)对话框与控件(5),这个函数是继承自CWinDataExchange,DoDataExchange()第一次被调用时完成相关控件的子类化工作,但是要到本文的第五章介绍DDV时才用得到,使用DDX在CMainDlg

最后,在OnInitDialog()中调用DoDataExchange()函数,这个函数是继承自CWinDataExchange。DoDataExchange()第一次被调用时完成相关控件的子类化工作,所以在这个例子中,DoDataExchange()子类化ID为IDC_EDIT的控件,将其与m_wndEdit建立关联。

LRESULT CMainDlg::OnInitDialog(...)
{
// ...
   // Attach CContainedWindows to OK and Exit buttons
   m_wndOKBtn.SubclassWindow ( GetDlgItem(IDOK) );
   m_wndExitBtn.SubclassWindow ( GetDlgItem(IDCANCEL) );
   // CButtonImpl: subclass the About button
   m_wndAboutBtn.SubclassWindow ( GetDlgItem(ID_APP_ABOUT) );
   // First DDX call, hooks up variables to controls.
   DoDataExchange(false);
   return TRUE;
}

DoDataExchange()的参数与MFC的UpdateData()函数的参数意义相同,我会在下一节详细介绍。

现在运行ControlMania1程序,可以看到子类化的效果。鼠标右键单击编辑框将弹出消息框,当鼠标通过按钮上时鼠标形状会改变。

DDX的详细内容

当然,DDX是用来做数据交换的,WTL支持在Edit控件和字符串之间交换数据,也可以将字符串解析成数字,转换成整型或浮点型变量,还支持Check box和Radio button组的状态与int型变量之间的转换。

DDX 宏

DDX可以使用6种宏,每一种宏都对应一个CWinDataExchange类的方法支持其工作,每一种宏都用相同的形式:DDX_FOO(控件ID, 变量),每一种宏都可以支持多种类型的变量,例如DDX_TEXT的重载就支持多种类型的数据。

DDX_TEXT 在字符串和edit box控件之间传输数据,变量类型可以是CString, BSTR, CComBSTR或者静态分配的字符串数组,但是不能使用new动态分配的数组。 DDX_INT 在edit box控件和数字变量之间传输int型数据。 DDX_UINT 在edit box控件和数字变量之间传输无符号int型数据。 DDX_FLOAT 在edit box控件和数字变量之间传输浮点型(float)数据或双精度型数据(double)。 DDX_CHECK 在check box控件和int型变量之间转换check box控件的状态。 DDX_RADIO 在radio buttons控件组和int型变量之间转换radio buttons控件组的状态。

DDX_FLOAT宏有一些特殊,要使用DDX_FLOAT宏需要在stdafx.h文件的所有WTL头文件包含之前添加一行定义:

#define _ATL_USE_DDX_FLOAT

这个定义是必要的,因为默认状态为了优化程序的大小而不支持浮点数。

有关 DoDataExchange()的详细内容

调用DoDataExchange()方法和在MFC中使用UpdateData()一样,DoDataExchange()的函数原型是:

BOOL DoDataExchange ( BOOL bSaveAndValidate = FALSE, UINT nCtlID = (UINT)-1 );

参数:

bSaveAndValidate 指示数据传输方向的标志。TRUE表示将数据从控件传输给变量,FALSE表示将数据从变量传输给控件。需要注意得是这个参数的默认值是FALSE,而MFC的UpdateData()函数的默认值是TRUE。为了方便记忆,你可以使用DDX_SAVE 和 DDX_LOAD标号(它们分别被定义为TRUE和FALSE)。 nCtlID 使用-1可以更新所有控件,如果只想DDX宏作用于一个控件就使用控件的ID。

如果控件更新成功DoDataExchange()会返回TRUE,如果失败就返回FALSE,对话框类有两个重载函数处理数据交换错误。一个是OnDataExchangeError(),无论什么原因的错误都会调用这个函数,这个函数的默认实现在CWinDataExchange中,它仅仅是驱动PC喇叭发出一声蜂鸣并将出错的控件设为当前焦点。另一个函数是OnDataValidateError(),但是要到本文的第五章介绍DDV时才用得到。

使用DDX

在CMainDlg中添加几个变量,演示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)
   END_DDX_MAP()
protected:
   // DDX variables
   CString m_sEditContents;
   int   m_nEditNumber;
};

上一页  1 2 3 4 5 6 7 8 9  下一页

Tags:MFC 程序员 WTL

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接