网站大量收购独家精品文档,联系QQ:2885784924

窗口创建及窗口息映射.doc

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
窗口创建及窗口息映射

进入MFC讲坛的前言 2008-02-14 10:53:59 分类: WINDOWS MFC中的窗口创建及窗口消息映射   我经常碰到有人问我有关窗口创建的问题,他们经常把用HWND描述的系统窗口对象和用CWnd描述的MFC的窗口对象混淆不清。这两者之间是紧密联系在一起的,但是MFC为了自身的管理,在CWnd中加了一些额外的内容,包括如何从HWND生成CWnd。   在MFC中,有几种典型的窗口对象,CWnd描述的一般窗口对象,CView描述的视图对象,CFrameWnd描述的SDI框窗对象,CMDIFrameWnd描述的MDI框窗对象等等。在这一章中,主要讨论下述内容:   MFC中窗口的创建   MFC的消息映射机制(MESSAGE MAP)   对于上面两点MFC的设计者们使用了很高的技巧来确保应用程序的代码尽可能小,其中的技巧和隐藏在它们背后的思想值得我们学习。下面对各项内容进行讨论。   MFC中窗口的创建   在Window下,创建窗口可以使用两个函数,CreateWindow()和CreateWindowEx(),它们都需要一个参数,这个参数是标识窗口类的字符串。所以,如果要创建窗口,一般的做法是,先使用RegisterClass()或RegisterClassEx()注册一个窗口类,然后使用该窗口类来创建窗口。在前面我也提到过,注册窗口类的最主要目的是为系统提供窗口函数的地址,以便被DispatchMessage()之类的函数回。   在MFC中,创建窗口的函数是CWnd或其派生类的Create()或CreateEx方法,注册窗口类一般使用AfxRegisterWndClass(),在这个全局函数中,并没有发现窗口函数地址这样的参数,因此脑子里自然就会有这样的问题:窗口函数在哪里?它是如何同窗口关联的?下面我们将对MFC的一些与此有关的代码进行仔细分析,回答上述两个问题。   窗口函数   在MFC中,有一个全局的函数AfxWndProc(),正如下面的注释所示,它就是CWnd及所有从它派生的窗口类的窗口函数,它的实现如下:   // The WndProc for all CWnds and derived classes   LRESULT CALLBACK   AfxWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)   {    // special message which identifies the window as using AfxWndProc    if (nMsg == WM_QUERYAFXWNDPROC)    return 1;    // all other messages route through message map    CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);    ASSERT(pWnd != NULL);    ASSERT(pWnd-m_hWnd == hWnd);    return AfxCallWndProc(pWnd, hWnd, nMsg, wParam, lParam);   }   AfxCallWndProc()调用pWnd对象的虚拟函数WindowProc(),它的代码如下:   LRESULT CWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)   {    // OnWndMsg does most of the work, except for DefWindowProc call    LRESULT lResult = 0;    if (!OnWndMsg(message, wParam, lParam, lResult))    lResult = DefWindowProc(message, wParam, lParam);    return lResult;   } 上面的代码中,OnWndMsg()是用来处理该窗口消息的函数,如果某条消息没有被OnWndMsg()处理,也就是该窗口没有提供处理该消息的函数,它就调用DefWindowProc()进行处理,DefWindowProc()也是一个虚拟函数,看看它的代码:   LRESULT CWnd::DefWindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam)   {    if (m_pfnSuper != NULL)    return ::CallWin

文档评论(0)

qnc814 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档