消息处理机制:CCmdTarget 和 消息映射表

MFC的消息处理基于CCmdTarget类和消息映射表,避免了虚函数带来的额外开销。消息映射表由AFX_MSGMAP_ENTRY和AFX_MSGMAP结构定义,并通过DECLARE_MESSAGE_MAP、BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏实现。文章详细介绍了消息映射表的数据结构和宏的使用。
部署运行你感兴趣的模型镜像

MFC的消息处理机制由两部分组成:CCmdTarget类和消息映射表。

 

  • 窗口消息构成

所有的窗口消息由3部分组成

UINT Msg
WPARAM wParam
LPARAM lParam

  •  为神马不用虚函数来处理消息?

因为,虚函数是使用类的虚函数表实现的,每个派生类都会带一个虚函数表的拷贝。虚函数表中的每个入口都是一个4字节指针,这样每个类对象就会在虚函数表中带来大量的额外字节。同时,窗口消息的个数和种类随时会发生变化,在消息改变时,使用虚函数实现的消息机制容易导致代码的废弃

  • 消息机制内幕

MFC的消息映射技术由两部分组成:CCmdTarget类 和 消息映射表。CCmdTarget是所有接受窗口消息和命令对象的基类,为了接受消息,类必须从CCmdTarget派生。消息映射表是将窗口消息与处理消息的类成员函数关联起来的机制。消息映射表数据结构和消息映射宏是消息映射系统的另外的两个重要的方面。

 

  (a) 两个消息映射表数据结构

  AFX_MSGMAP_ENTRY 消息映射项  ( 见afxwin.h )

 

  AFX_MSGMAP 消息映射表 ( 见afxwin.h )

 

 

 

  (b) 消息映射宏

MFC提供了三个宏来产生消息映射表:DECLARE_MESSAGE_MAP、BEGIN_MESSAGE_MAP、END_MESSAGE_MAP。要在类中使用消息映射表,最基本的办法是在类声明中包含DECLARE_MESSAGE_MAP (.h文件),在类实现体中包含BEGIN_MESSAGE_MAP、END_MESSAGE_MAP和消息映射信息(.cpp文件)

 

 DECLARE_MESSAGE_MAP  ( 见afxwin.h )

定义了两个Protect函数,GetThisMessageMap用于返回本类中的消息映射表指针,GetMesssageMap是个虚函数

 

BEGIN_MESSAGE_MAP  ( 见afxwin.h )

GetMessageMap 和 GetThisMessageMap函数的实现,在GetThisMessageMap中一个函数中定义了两个函数静态变量:_messageEntries 表示所有的消息映射项、messageMap表示消息映射表(见下)

 

END_MESSAGE_MAP  ( 见afxwin.h )

 

BEGIN_MESSAGE_MAP 和 END_MESSAGE_MAP之间的内容是一系列消息映射表的入口宏。这些宏扩展后可以填充类的消息映射表_messageEntries。MFC定义的各种消息映射表入口宏,见下表

 

  (3)MFC定义各种消息映射表入口宏

消息类型

宏形式

参数

预定义窗口消息

ON_WM_XXXX

None

命令

ON_COMMAND

Command Id, Handler Name

命令ID的范围

ON_COMMAND_RANGE

Start ID, End ID,

Handler Name

更新命令

ON_UPDATE_COMMAND_UI

Commnad Id, Handler Name

用于更新的命令ID的范围

ON_UPDATE_COMMAND_UI_RANGE

Start ID, End ID,

Handler Name

控件通知

ON_XXXX

Control Id, Handler Name

控件ID范围

ON_CONTROL_RANGE

Notify CodeStart IDEnd IDHandler Name

用户定义的消息

ON_MESSAGE

User-defined Message ID,

Handler Name

注册的窗口消息

ON_REGISTERED_MESSAGE

Registered message ID variable, Handler Name

 

 

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值