孙鑫MFC笔记教程(4)--MFC消息映射机制的剖析

本文详细介绍了MFC消息映射机制的工作原理,通过CWnd类的WindowProc函数和OnWndMsg函数阐述了消息处理流程。同时,文章提供了使用CDC类进行画线的四种方法,包括Win32 API的GetDC、CDC、CClientDC和CWindowDC的使用,并涉及CPen和CBrush的使用,展示了颜色填充和透明效果的实现。
摘要由CSDN通过智能技术生成

1.      对应用程序(单文档程序)的窗口进行操作的时候,如点击鼠标,拖动鼠标等,所有的窗口消息应该在CView中捕获,而不能在MainFrame进行捕获,因为在文档-视图结构中,CView类总是覆盖在CMainFrm框架窗口之上的。

 

2.      MFC的消息映射机制:

    一般作为基类使用的CWnd类为Windows消息定义了大量窗口消息的缺省处理函数,这些函数大部分只是简单地调用了Windows的缺省过程,可以在派生类中对其进行重载。但是MFC应用程序框架却并没有象使用普通虚函数那样使用Windows消息处理函数,而是通过宏将指定的消息映射到派生类的成员函数。如果MFC仍象普通虚函数一样对消息响应函数进行处理,那么CWnd类就要为这上百个消息声明虚函数。而C++将为在程序中使用的每一个派生类都提供一个被称作vtable的虚拟函数分配表,这个分配表需要为每一个虚函数提供一个4字节的入口,而不管这些函数在派生类中是否真正被重载,这将不能有效利用存储空间。而且对于每一个不同类型的窗口或控件,应用程序都要为其提供一个超过400字节的虚拟函数分配表来实现对消息的响应。而采用 MFC的用宏将Windows消息映射到C++成员函数的方式则可避免产生庞大的虚拟函数分配表,其消耗的内存是同它所包含的消息入口数量成正比的

 

查看MFC的源代码:WINCORE.CPP

---------------------------------------------------------------------------------

  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))//真正的消息处理都是由OnWndMsg函数进行处理的

      lResult = DefWindowProc(message, wParam, lParam);

      return lResult;

 }

  ---------------------------------------------------------------------------------

  查看AFX_WIN.h

  ---------------------------------------------------------------------------------

  virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);

  --------------------------------------------------------------------------------

      MFC中维护了一张消息到窗口的对应表,当接收到一个消息后,通过消息的句柄,找到与其相关联的窗口对象的指针,然后传给CWnd::WindowProc函数,CWnd::WindowProc

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值