一 MFC中采用的这种消息处理机制成为 MFC消息映射机制
一个MFC消息响应函数在程序中有三处相关信息:
函数原型,
函数实现,
关联消息和消息响应函数的宏。
函数原型——头文件CDrawView——两个AFX_MSG注释宏之间——消息响应函数原型的声明 —— afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
函数实现——源文件CDrawView()——OnLButtonDown(UINT nFlags, CPoint point)
关联消息和消息响应函数的宏——源文件CDrawView()——BEGIN_MESSAGE_MAP 和END_MESSAGE_MAP()之间
二 MFC消息映射机制的具体实现方法是:
在每个能接收和处理消息的类中,定义一个消息和消息函数静态对照表,即:消息映射表。
在消息映射表中,消息与对应的消息处理函数指针是成对出现的。
某个类能处理的所有消息及其对应的消息处理函数的地址都列在这个类所对应的静态表中。
当有消息需要处理时,程序只要搜索该消息静态表,查看表中是否含有该消息,就可知道该类能否处理此消息。
如果能处理该消息,则同样依照静态表能很容易找到并调用对应的消息处理函数。
三 MFC消息映射机制的实际实现过程:
MFC在后台维护了一个窗口句柄与对应的C++对象指针的对照表。
以本例中的CDrawView类为例,与CDrawView对象相关的有一个窗口,窗口当然有它的窗口句柄。
窗口句柄与C++对象对照表中维护的对应关系是: 窗口句柄与CDrawView对象的一个指针(CDrawView *)存在着一一对应的关系,
具体实现过程:当收到某一消息时,消息的第一个参数就指明该消息与哪个窗口句柄相关,通过
对照表就可以找到与之相关的C++对象指针。然后把这个指针传递给 应用程序框架窗口类的基类 ,后者会调用一个
名为WindowProc的函数。WindowProc是一个虚函数,WindowProc函数内部调用了一个OnWndMsg函数,真正的消息路由,也就是
消息映射就是由此函数完成的。
四、OnWndMsg函数的处理过程是:
1、首先判断消息是否有消息响应函数。
判断的方法是:在相应窗口类中查找所需的消息响应函数。
因为传递给WindowProc函数的是窗口子类指针,所以OnWinMsg函数会到相应的子类头文件中查找----看看DECLARE_MESSAGE_MAP()
宏之上,两个AFX_MSG注释宏之间是否有相应的消息响应函数原型的声明;------再到子类的源文件中,看看
BEGIN_MESSAGE_MAP和END_MESSAGE_MAP这两个宏之间是否有相应的消息映射宏。
2、如果通过了上述步骤,找到了消息映射函数,那么接着就会调用该响应函数,对消息进行处理。
3、如果在子类中没有找到消息响应函数,那么就交由基类进行处理。