MFC“简化”后的消息机制

MFC通过一套消息映射机制简化了Windows消息处理,避免程序员直接设计窗口过程。在创建窗口时,MFC使用WH_CBT钩子拦截消息,并通过_AfxCbtFilterHook函数处理。消息映射包括声明和实现两个阶段,涉及_MessageEntries数组和messageMap静态变量。MFC主要处理Windows消息、控制通知消息和命令消息,分别由AfxWndProc、OnCommand和OnCmdMsg/OnNotify处理。命令消息在SDI或MDI应用中由MFC主边框窗口对象分发。
摘要由CSDN通过智能技术生成

MFC消息发送和处理的本质也如上所述。但是,所有MFC窗口都使用同一窗口过程,程序员不必去设计和实现自己的窗口过程,而是通过MFC提供的一套消息映射机制来处理消息。

Tips:MFC在创建窗口之前,创建了一个WH_CBT类型的钩子。这样,创建窗口时所有的消息都会被钩子过程函数_AfxCbtFilterHook捕获。若是希望的HOOK,则先把MFC窗口对象和刚刚创建的Windows窗口对象捆绑在一起,建立他们的映射。这样AfxWndProc就成为CWnd或其派生类的窗口过程。不论是队列消息,还是非队列消息,都送到AfxWndProc窗口过程来处理。

 

消息映射

所谓消息映射,就是让程序员指定某个MFC类处理某个消息。下面会进行一番详述。

消息映射的声明

其实质是给所在的类添加几个静态成员变量和静态或虚拟函数,当然它们是与消息映射相关的变量和函数。

成员变量:_messageEntries和messageMap

_messageEntries[]是一个AFX_MSGMAP_ENTRY类型的数组变量,用来容纳类的消息映射条目。

其中每条映射包括两部分,消息ID和消息对应的执行函数。

messageMaps 是一个AFX_MSGMAP类型的静态成员变量,它是一个包含了消息映射信息的变量。通过messageMap可以得到类的消息映射数组_messageEntries和函数_GetBaseMessageMap(用来得到基类消息映射的函数)的地址。

消息映射的实现

其实质是初始化声明中定义的静态成员函数_messageEntries和messageMap。实现所所声明的静态或虚拟函数GetMessageMap、_GetBaseMessageMap。这样,在进入WinMain函数之前,每个可以响应消息的MFC类都生成了一个消息映射表,程序

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值