窗口消息概述:
所有的窗口消息的基本形式都是一样的,有3个部分:(1).一个无符号整数,包含消息的实际内容.(2)WPARAM,一个4字节整数.(3)LPARAM,一个4字节参数.无符号数是实际消息.
含MFC在内的任何WINDOWS程序的核心都是消息泵.消息泵是一个循环,它取出消息并将消息送给恰当的窗口消息处理函数.下面是个消息泵的示例:
while(GetMessage(&msg,NULL,NULL,NULL)){
TranslateMessage(&msg) ;
DispatchMessage(&msg) ;
}
return msg.wParam ;
程序会在开始运行时调用RegisterClass()并使用一个WNDCLASS结构来注册至少一个窗口类.每当该类的一个窗口窗口中有消息时,WINDOWS都会调用WNDCLASS中的lpfnWndProc所指定的函数.
典型的SDK程序中消息处理函数是个庞大且难于维护的switch语句.C++中可用虚函数处理每个消息,但是,这种方法将带因虚表而产生过多的开销,且不易适应消息的增减.
----------------------------
CCmdTarget和消息映射表----MFC的消息处理结构的两个基本组成部分
----------------------------
消息映射表数据结构
struct AFX_MSGMAP_ENTRY {//消息映射表实际入口.
UINT nMessage;//实际消息
UINT nCode;//控件代码或通知代码
UINT nID;//控件ID
UINT nLastID;//控件最大ID
UINT nSig;//消息处理函数的签名
AFX_PMSG pfn;//消息处理函数
};
struct AFX_MSGMAP { //实际的消息映射表.
const AFX_MSGMAP* pBaseMap;//基类的消息映射表.
const AFX_MSGMAP_ENTRY* lpEntries ;//消息表入口数组指针.
}
消息映射宏:
#define DECLARE_MESSAGE_MAP() /
private: /
static const AFX_MSGMAP_ENTRY _messageEntries[]; /
MFC中的消息处理/AfxWndProc/WM_COMMAND路由
最新推荐文章于 2022-07-23 23:43:29 发布
MFC中的消息处理主要通过消息映射表和AfxWndProc函数进行。文章介绍了消息泵的工作原理,以及如何通过CCmdTarget和消息映射表处理消息。详细阐述了消息映射表的数据结构和相关宏,以及消息的处理流程,特别是WM_COMMAND消息的路由,涉及到了命令路由到框架窗口、文档、视图和应用程序的过程。同时提到了PreTranslateMessage在消息处理前的角色。
摘要由CSDN通过智能技术生成