ATL消息处理机制.doc

ATL消息处理机制.doc

ID:57861934

大小:186.55 KB

页数:14页

时间:2020-09-02

ATL消息处理机制.doc_第1页
ATL消息处理机制.doc_第2页
ATL消息处理机制.doc_第3页
ATL消息处理机制.doc_第4页
ATL消息处理机制.doc_第5页
资源描述:

《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这些方法的调用很巧妙,它

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。