MFC消息发送和处理的本质也如上所述。但是,所有MFC窗口都使用同一窗口过程,程序员不必去设计和实现自己的窗口过程,而是通过MFC提供的一套消息映射机制来处理消息。
Tips:MFC在创建窗口之前,创建了一个WH_CBT类型的钩子。这样,创建窗口时所有的消息都会被钩子过程函数_AfxCbtFilterHook捕获。若是希望的HOOK,则先把MFC窗口对象和刚刚创建的Windows窗口对象捆绑在一起,建立他们的映射。这样AfxWndProc就成为CWnd或其派生类的窗口过程。不论是队列消息,还是非队列消息,都送到AfxWndProc窗口过程来处理。
消息映射
所谓消息映射,就是让程序员指定某个MFC类处理某个消息。下面会进行一番详述。
消息映射的声明
其实质是给所在的类添加几个静态成员变量和静态或虚拟函数,当然它们是与消息映射相关的变量和函数。
成员变量:_messageEntries和messageMap
_messageEntries[]是一个AFX_MSGMAP_ENTRY类型的数组变量,用来容纳类的消息映射条目。
其中每条映射包括两部分,消息ID和消息对应的执行函数。
messageMaps 是一个AFX_MSGMAP类型的静态成员变量,它是一个包含了消息映射信息的变量。通过messageMap可以得到类的消息映射数组_messageEntries和函数_GetBaseMessageMap(用来得到基类消息映射的函数)的地址。
消息映射的实现
其实质是初始化声明中定义的静态成员函数_messageEntries和messageMap。实现所所声明的静态或虚拟函数GetMessageMap、_GetBaseMessageMap。这样,在进入WinMain函数之前,每个可以响应消息的MFC类都生成了一个消息映射表,程序