WEB开发网
开发学院软件开发VC ATL3.0中的窗口类 阅读

ATL3.0中的窗口类

 2006-07-22 22:53:41 来源:WEB开发网   
核心提示: 当窗口收到一个消息,它将从消息映射表的顶部开始查找匹配的消息处理函数,ATL3.0中的窗口类(4),因此把最常用的消息放在消息映射表的前面是个不错的注意,如果没有找到匹配的消息处理函数,也就是当用户关闭这个窗口的时候,调用OnDestroy函数处理这个消息,则这个消息被发送到默认的窗口过程

当窗口收到一个消息,它将从消息映射表的顶部开始查找匹配的消息处理函数,因此把最常用的消息放在消息映射表的前面是个不错的注意。如果没有找到匹配的消息处理函数,则这个消息被发送到默认的窗口过程进行处理。

ATL的消息映射表封装了Windows的消息处理过程,它比传统的窗口函数中的大量switch分支或者if语句看起来更加直观。

要创建一个基于CWindowImpl派生类的窗口,请调用CWindowImpl类的Create方法: CMyWindow wnd;   // 构造一个 CMyWindow 类的对象
wnd.Create( NULL, CWindow::rcDefault, _T("Hello"),
  WS_OVERLAPPEDWINDOW|WS_VISIBLE );
注意,CWindowImpl类的Create方法与CWindow类的Create方法略有不同,在CWindow类的Create中,我们必须指定一个注册了的窗口类,但是CWindowImpl则不同,它创建一个新的窗口类,因此,不需要为它指定窗口类。

一个简单而完整的示例:

这篇文章中的大部分示例都只是代码片段,但是下面列出的是一个完整的Hello world的示例程序。虽然我们使用的是ATL,但是没有涉及到COM,因此在使用Visual C++®建立项目的时候,我们选择Win32® application而不是ATL COM:

在stdafx.h文件中,加入下面几行: #include <atlbase.h>
extern CComModule _Module;
#include <atlwin.h>
在hello.cpp文件中,写如下代码:#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来结束消息循环。

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

Tags:ATL 窗口

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