MFC处理消息的顺序
在vc编程中,消息的路由和传递路径一直是一个大的问题,主要是由于windows本身的消息种类有很多,像系统消息,命令消息和自定义消息,而MFC中又玩起狸猫换太子的游戏,偷换窗口处理函数,在这里想归纳一下简单的消息传递路径:
AfxWndProc() | 接受消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc() |
AfxCallWndProc() | 保存消息(消息标识符和参数)供以后参考,然后调用WindowProc() |
WindowProc() | 发送消息到OnWndMsg(),如果未被处理,则调用DefWindowProc() |
OnWndMsg() | 按字节对消息进行排序,对于WM_COMMAND消息,调用OnCommand(); 对于WM_NOTIFY消息,调用OnNotify(),OnWndMsg()搜索类的消息映像, 以找到一个能处理消息的处理函数,如果OnWndMsg()不能找到这样一个函数,则将消息返回给WindodProc(),由它将消息发到DefWindowProc() |
OnCommand() | Oncommand()查看这是不是一个控件通知(lParam是不是空的),如果它是,OnCommand()试图将消息映射到制造通知的控件,如果它不是则调用OnWndMsg(). |
OnNotify() | OnNotify()也试图将消息映射到制造通知的控件,如果映射不成功,则调用OnWndMsg()返回。 |
OnCmdMsg() | 根据接受消息的类,OnCmdMsg()将在一个称为命令传递的过程中潜在的传递命令消息和控件通知。如果该窗口的类是一个框架类,则命令消息和通知也被映射到视图和文档类中,并为该类寻找消息处理函数。 |