WTL创建对话框。
要用到头文件 atlapp.h
对话框的定义如下
#include < atlapp.h >
class CMainDialog : public CDialogImpl< CMainDialog >
{
//用户代码
}
CDialogImpl类是WTL中的模式对话框的基类。他利用了奇异自递归模板技术,来获得继承类的实际行为。
有了定义我们要给这个对话框一个窗口资源。很简单,只要代码中定义一个IDD的枚举量就可以了。
枚举量的值为窗口资源的ID。对话框的定义代码演化为如下
#include < atlapp.h >
class CMainDialog : public CDialogImpl< CMainDialog >
{
public:
enum { IDD=IDD_MAINDLG };//一定要在public域,否则没办法访问,编译时报错
//用户代码
}
就这样进行编译,编译器会报错,说CMainDialog是个抽象类,不能实例化。
其原因是ProessWindowMessage函数是个抽象地。
我们是不是要手动添加这个函数呢?可以。但对于编写代码来说并不方便。
这里要用到ATL中的消息映射宏了。
BEGIN_MSG_MAP( 类名 )
END_MSG_MAP()
有了这两个宏对后,就自动的添加了ProessWindowMessage函数了,而且添加消息映射的函数也方便。
现在对话框的定义代码演化为如下了
#include < atlapp.h >
class CMainDialog : public CDialogImpl< CMainDialog >
{
public:
enum { IDD=IDD_MAINDLG };//一定要在public域,否则没办法访问,编译时报错
public:
BEGIN_MSG_MAP( CMainDialog )
END_MSG_MAP()
//用户代码
}
有了以上代码,对话框就可以显现在屏幕上了。但是这个对话框没有办法推出,应为没有一个消息映射函数。
接不到推出的消息。
我们有添加两个消息映射,分别对应界面上的OK按钮和Cancel按钮。这两个是button控件,我们用控件的消息映射
COMMAND_ID_HANDLER( ID, Fun )。
添加消息映射后的对话框类定义如下
#include < atlapp.h >
class CMainDialog : public CDialogImpl< CMainDialog >
{
public:
enum { IDD=IDD_MAINDLG };//一定要在public域,否则没办法访问,编译时报错
public:
BEGIN_MSG_MAP( CMainDialog )
COMMAND_ID_HANDLER( IDOK, OnOk )
COMMAND_ID_HANDLER( IDCANCEL, OnCancel )
END_MSG_MAP()
public:
LRESULT OnOk( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled )
{
EndDialog( wID );//推出对话框
return 0;
}
LRESULT OnCancel( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled )
{
EndDialog( wID );//推出对话框
return 0;
}
//用户代码
};
posted on 2007-05-09 11:18
walkspeed 阅读(1344)
评论(0) 编辑 收藏 引用 所属分类:
C++语言