资源描述:
《ATL消息处理机制.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、ATL消息机制的探究作者:后知后觉(307817387)任何的框架,包括MFC或者ATL,创建并显示窗口,处理窗口消息都逃不过RegisterClass、CreateWindow和MessageLoop。对于ATL也是一样的道理,下面就来细说一下ATL的消息处理机制。重要的部分我会用红色标识出来。1,注册窗口类CWindowImpl类使用一个DECLARE_WND_CLASS(NULL)的宏来定义WNDCLASS的信息#defineDECLARE_WND_CLASS(WndClassName)staticATL::CWndClassInfo&GetWndClass
2、Info(){staticATL::CWndClassInfowc={{sizeof(WNDCLASSEX),CS_HREDRAW
3、CS_VREDRAW
4、CS_DBLCLKS,StartWindowProc, ,0,NULL,NULL,NULL,(HBRUSH)(COLOR_WINDOW+1),NULL,WndClassName,NULL},NULL,NULL,IDC_ARROW,TRUE,0,_T("")};returnwc;}这里有一个很重要的信息,那就是StartWindowProc,这个是定义的默认的窗口处理函数。先提醒一下,后面有具体说明
5、。CWndClassInfo的定义如下:struct_ATL_WNDCLASSINFOW{WNDCLASSEXWm_wc;LPCWSTRm_lpszOrigName;WNDPROCpWndProc;LPCWSTRm_lpszCursorID;BOOLm_bSystemCursor;ATOMm_atom;WCHARm_szAutoName[5+sizeof(void*)*CHAR_BIT];ATOMRegister(WNDPROC*p){returnAtlWinModuleRegisterWndClassInfoW(&_AtlWinModule,&_AtlBaseMo
6、dule,this,p);}};其中的Register方法会注册一个窗口类。在CWindowImpl的Create方法中:HWNDCreate(HWNDhWndParent,_U_RECTrect=NULL,LPCTSTRszWindowName=NULL,DWORDdwStyle=0,DWORDdwExStyle=0,_U_MENUorIDMenuOrID=0U,LPVOIDlpCreateParam=NULL){if(T::GetWndClassInfo().m_lpszOrigName==NULL)T::GetWndClassInfo().m_lpszOrig
7、Name=GetWndClassName();ATOMatom=T::GetWndClassInfo().Register(&m_pfnSuperWindowProc);dwStyle=T::GetWndStyle(dwStyle);dwExStyle=T::GetWndExStyle(dwExStyle);//setcaptionif(szWindowName==NULL)szWindowName=T::GetWndCaption();returnCWindowImplBaseT::Create(hWndParent,rect,
8、szWindowName,dwStyle,dwExStyle,MenuOrID,atom,lpCreateParam);}这里Register的里面的具体实现很复杂,不过其本质就是注册窗口类,具体里面的实现的作用就是根据GetWndClassInfo里面定义的结构体里面的内容生成一个WNDCLASSEX的信息,窗口过程函数也是同理,然后注册成窗口类。同时对传入的m_pfnSuperWindowProc赋值,其值就是定义的StartWindowProc。自此,可以的出,创建窗口生成消息之后第一步会到StartWindowProc中去执行。具体StartWindowPr
9、oc是什么呢?其实它是CWindowImplBaseT里面定义的一个静态函数:staticLRESULTCALLBACKStartWindowProc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam);T::GetWndClassInfo函数就是调用DECLARE_WND_CLASS宏定义的方法,其本质就是返回一个定义好的CWndClassInfo对象。这里在创建窗口之前先调用Register方法注册一个窗口类,上面也说到了过。这里的T::GetWndClassInfo和T::GetWndStyle这些方法的调用很巧妙,它