2009-9-2
======================
《深入解析MFC》笔记 6.MFC消息处理、消息映射
======================
CCmdTarget和消息映射表
-窗口消息
3个部分:1)一个无符号整数,包含了消息的实际内容; 2)WPARAM—— 一个4字节的参数;3)LPARAM—— 一个4字节的参数
MFC消息映射
CCmdTarget类
消息映射表数据结构:
AFX_MSGMAP_ENTRY,表示消息映射表的实际入口:
struct AFX_MSGMAP_ENTRY{
UINT nMessage; //表示Windows消息。
UINT nCode; //表示控件代码或WM_NOTIFY代码
UINT nID; //产生消息的控件ID
UINT nLastID; //
UINT nSig; //表示用于处理消息的函数的签名(signature)
AFX_PMSG pfn; //指向处理消息的函数
};
typedef void (CCmdTarget::*AFX_PMSG) (void);
struct AFX_MSGMAP{
const AFX_MSGMAP* pBaseMap; //指向另一个AFX_MSGMAP结构的指针(基类的消息映射表)
const AFX_MSGMAP_ENTRY* lpEntries; //
};
消息映射表基本上就是AFX_MSGMAP_ENTRY结构数组。
消息映射宏
DECLARE_MESSAGE_MAP、 BEGIN_MESSAGE_ MAP 和 END_MESSAGE_MAP.
在类定义中使用DECLARE_MESSAGE_MAP意味着在类中定义了3种东西:
1)一个名为_messageEntries 的 AFX_MSGMAP_ENTRY 结构数组; (静态成员)
2)一个名为messageMap 的 AFX_MSGMAP; (静态成员)
3)一个获得类的消息映射表的函数(GetMessageMap())。
#define BEGIN_MESSAGE_MAP(theClass, baseClass) \
PTM_WARNING_DISABLE \
const AFX_MSGMAP* theClass::GetMessageMap() const \
{ return GetThisMessageMap(); } \
const AFX_MSGMAP* PASCAL theClass::GetThisMessageMap() \
{ \
typedef theClass ThisClass; \
typedef baseClass TheBaseClass; \
static const AFX_MSGMAP_ENTRY _messageEntries[] = \
{
宏产生一个GetMessageMap()函数,该函数返回类的消息映射表指针。框架程序用GetMessageMap()来获得类的消息映射表。
然后宏产生填充AFX_MSGMAP结构的代码。第一个域指向基类的消息映射表,同时创建一条到根对象的链表。
第二个域是指向类自己的第一个消息映射表的入口。
最后,宏产生实际的消息表,消息表实际上就是AFX_MSGMAP_ENTRY结构的表。
#define END_MESSAGE_MAP() \
{0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } \
;
MFC如何使用消息映射表
---------------------------------------
Command Routing(命令传递)
■ 若是一般的 Windows消息(WM_xxx),一定由派生类流向基类
■ 若是命令消息 WM_COMMAND
Frame窗口: View → Frame窗口本身 → CWinApp对象
↓
View: View本身 → Document
↓
Document: Document本身→ DocumentTemplate
posted on 2010-03-15 23:14
Euan 阅读(876)
评论(0) 编辑 收藏 引用 所属分类:
windows