ATL3.0中的窗口类
2006-07-22 22:53:41 来源:WEB开发网当窗口收到一个消息,它将从消息映射表的顶部开始查找匹配的消息处理函数,因此把最常用的消息放在消息映射表的前面是个不错的注意。如果没有找到匹配的消息处理函数,则这个消息被发送到默认的窗口过程进行处理。
ATL的消息映射表封装了Windows的消息处理过程,它比传统的窗口函数中的大量switch分支或者if语句看起来更加直观。
要创建一个基于CWindowImpl派生类的窗口,请调用CWindowImpl类的Create方法: CMyWindow wnd; // 构造一个 CMyWindow 类的对象
注意,CWindowImpl类的Create方法与CWindow类的Create方法略有不同,在CWindow类的Create中,我们必须指定一个注册了的窗口类,但是CWindowImpl则不同,它创建一个新的窗口类,因此,不需要为它指定窗口类。
wnd.Create( NULL, CWindow::rcDefault, _T("Hello"),
WS_OVERLAPPEDWINDOW|WS_VISIBLE );
一个简单而完整的示例:
这篇文章中的大部分示例都只是代码片段,但是下面列出的是一个完整的Hello world的示例程序。虽然我们使用的是ATL,但是没有涉及到COM,因此在使用Visual C++®建立项目的时候,我们选择Win32® application而不是ATL COM:
在stdafx.h文件中,加入下面几行: #include <atlbase.h>
在hello.cpp文件中,写如下代码:
extern CComModule _Module;
#include <atlwin.h>#include "stdafx.h"
CComModule _Module;
class CMyWindow : public CWindowImpl<CMyWindow> {
BEGIN_MSG_MAP( CMyWindow )
MESSAGE_HANDLER( WM_PAINT, OnPaint )
MESSAGE_HANDLER( WM_DESTROY, OnDestroy )
END_MSG_MAP()
LRESULT OnPaint( UINT, WPARAM, LPARAM, BOOL& ){
PAINTSTRUCT ps;
HDC hDC = GetDC();
BeginPaint( &ps );
TextOut( hDC, 0, 0, _T("Hello world"), 11 );
EndPaint( &ps );
return 0;
}
LRESULT OnDestroy( UINT, WPARAM, LPARAM, BOOL& ){
PostQuitMessage( 0 );
return 0;
}
};
int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE, LPSTR, int )
{
_Module.Init( NULL, hInstance );
CMyWindow wnd;
wnd.Create( NULL, CWindow::rcDefault, _T("Hello"),
WS_OVERLAPPEDWINDOW|WS_VISIBLE );
MSG msg;
while( GetMessage( &msg, NULL, 0, 0 ) ){
TranslateMessage( &msg );
DispatchMessage( &msg );
}
_Module.Term();
return msg.wParam;
}
在这个示例程序中,CmyWindow是从CWindowImpl派生的,它的消息映射捕获了两个消息WM_PAINT和WM_DESTROY,当收到WM_PAINT消息时,它的成员函数OnPaint处理这个消息并在窗口上输出“Hello world”,当收到WM_DESTROY消息时,也就是当用户关闭这个窗口的时候,调用OnDestroy函数处理这个消息,在OnDestroy函数中调用PostQuitMessage来结束消息循环。
更多精彩
赞助商链接