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定义各种消息映射表入口宏
消息类型 |
宏形式 |