MFC消息机制的介绍

Windows是基于事件(消息) 驱动机制的图形界面操作系统,基于Windows的应用系统的运行依靠消息来驱动。Windows程序设计主要经历了传统的SDK、MFC 两个重要的发展阶段。

MFC(Microsoft Foundation Classes) 是一个Windows 应用程序的可视化集成开发工具,,是一个建立在WindowsAPI 之上的C + +类库,它以面向对象的全新面貌出现,使Windows程序设计开发过程效率更高,在MFC 中消息及对消息的操作均被封装到类中,消息通过消息映射机制传递到相应的处理函数。

MFC 把消息分为三大类,一是命令消息(WM COMMAND) :来自于用户接口(UI) 对象的消息都是这种命令消息,它的处理不同于其它消息,它们可以被更多的对象处理,凡是由CCmdTarget派生的类都有资格处理这类消息,它们依靠一种称为消息映射(MessageMap) 的机制把消息与消息处理函数连接起来。二是窗口消息(WindowsMessages) : 除WMCOMMAND以外,任何以WM 开头的消息都是这一类,任何由CWnd 派生的类均可接受此消息。三是控件通知(Control Notification) :这种消息由控件产生,为的是向其父窗口(通常是对话框) 通知某种情况,任何由CWnd 派生的类均可接受此消息。还有一种用户自定义的消息,用于处理所有非标准的窗口消息,用户自定义的消息的处理与命令消息一样。

消息映射(MessageMap) 是MFC 消息机制中一个关键技术,MFC 中可以处理消息的类都是由CCmdTarget派生的,这些派生类中都有一个消息映射表,消息映射表的作用就是把程序中欲处理的消息和消息处理例程关联起来,并且将基类与派生类的消息映射表连接起来,使得消息能沿着这条路寻找匹配的处理函数。

消息传递,在MFC 中,消息的处理是很复杂的,线程的消息循环不断地从消息队列抓取消息,派送到窗口函数,此后消息又是如何传递的呢? 关键就在消息映射表中,MFC 中可以处理消息的类其消息映射表就构成了一个消息传递网。其次,MFC 还有一个实现消息推动的泵,推动消息沿着一定的路径传递,这个泵就隐藏在各个类的WindowProc、On2Command、OnCmdMsg、DefWindowProc虚函数中,我们把消息循环看作消息传递的起点,消息的流动

MFC消息的处理的过程:(1)函数AfxWndProc接收Windows操作系统发送的消息。(2)函数AfxWndProc调用函数AfxCallWndProc进行消息处理,这里一个进步是把对句柄的操作转换成对CWnd对象的操作。 (3)函数AfxCallWndProc调用CWnd类的方法WindowProc进行消息处理。(4)WindowProc调用OnWndMsg进行正式的消息处理,即把消息派送到相关的方法中去处理。在CWnd类中都保存了一个AFX_MSGMAP的结构,而在AFX_MSGMAP结构中保存有所有我们用ClassWizard生成的消息的数组的入口,我们把传给OnWndMsg的message和数组中的所有的message进行比较,找到匹配的那一个消息。实际上系统是通过函数AfxFindMessageEntry来实现的。找到了那个message,实际上我们就得到一个AFX_MSGMAP_ENTRY结构,而我们在上面已经提到AFX_MSGMAP_ENTRY保存了和该消息相关的所有信息,其中主要是消息的动作标识和相关的执行函数。然后我们就可以根据消息的动作标识调用相关的执行函数,而这个执行函数实际上就是通过ClassWizard在类实现中定义的一个方法。这样就把消息的处理转化到类中的一个方法的实现上。

Windows 系统是一个非常复杂的系统,Windows 的开发工具MFC 更象是笼罩着一层神秘的面纱,而消息是打开MFC 大门的钥匙,是理解把握纷繁复杂的Windows 系统脉络、内涵的基础。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值