传统SDK程序的消息循环.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
传统SDK程序的消息循环

?传统SDK程序的消息循环 在传统的SDK程序中,消息循环是很简单的,也许你不信,那我们就看看下面这段代码吧:#include windows.h LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; 函数的声明 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, ??????????PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT (HelloWin) ; WNDCLAS wndclass ; wndclass.style ?= CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc?= WndProc ; wndclass.lpszClassName = szAppName ; RegisterClass (wndclass); hwnd = CreateWindow( szAppName,……,NULL); ?? ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; ?? while (GetMessage (msg, NULL, 0, 0)) ??? { TranslateMessage (msg) ; ? DispatchMessage (msg) ; ?????} return msg.wParam ; } 函数数定义 LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {?? switch (message) ?????{ case WM_CREATE: ?????????? ……… case WM_PAINT: ?????????? ……… case WM_DESTROY: PostQuitMessage (0) ; return 0 ; ?????} ? return DefWindowProc (hwnd, message, wParam, lParam) ; }   在WinMain 中 CreateWindow通过一个参数将创建的窗口和窗口类(见窗口类的诞生一文)联系起来,这样该窗口的所有消息都将发送到该窗口类的窗口函数WndProc,其后WndProc根据不同的消息给予不同的动作。 二、MFC期望的消息循环   在传统的SDK程序中消息循环是非常简单的,并且将窗口和窗口函数绑定在一起。而在MFC中就出现了问题,比如CDocument类,不是窗口,所以没有窗口类,但是我也想让它响应消息,怎办?问题不仅仅如此,我们再看看MFC的消息,就会发现更多问题。   MFC将消息分为三大类:1.标准消息,即除WM_COMMAND之外的任何WM_开头的消息,任何派生自CWnd的类都可以接受该消息,并按照继承关系接受(如从CScrollView到CView再到CWnd)。2.命令消息,即WM_COMMAND,任何派生自CCmdTarget的类,兼可接受该消息,接受顺序如下图所示,其中标号标注了接受消息的顺序,箭头代表调用顺序 : 图1 消息的拐弯流动 3.Control Notification,通知类消息,也以WM_COMMAND形式出现,由控件产生,通知其父窗口。 三、消息宏背后的秘密   知道了MFC消息流动的要求,那MFC是怎样实现的呢?当一个消息出现时,Application FrameWork怎么知道将该消息发送给哪个对象的呢?其实都是CCmdTarget类在作怪,所有能够接受消息的类都必须继承于CCmdTarget类,因为这些类都一个共同的特征:含有DECLARE_MESSAGE_MAP、BEGIN_MESSAGE_MAP、END_MESSAGE_MAP三个宏。啊!就这三个宏组织了一张庞大的消息映射网,也许你不信,那我们就看看这三个宏是怎样定义的: #define DECLARE_MESSAGE_MAP()\ private:\ ?? static const AFX_MSGMAP_ENTRY _messageEntries[];\ protected: ?? static AFX_DATA const AFX_MSGMAP messageMap;\ ?? virtual const AFX_MSGMAP* GetMessageMap() const;\ #define BEGIN_

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档