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 閱讀(925)
評論(0) 編輯 收藏 引用 所屬分類:
windows