MFC消息机制
MFC将消息分为以下3类:
1.标准消息
除WM_COMMAND之外,所有以WM_开头的消息都是标准消息。从CWnd派生的类,都可以接收到这类消息。
2.命令消息
命令消息是来自菜单、加速键或工具栏按钮的消息,这类消息都以WM_COMMAND形式呈现。在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。从CCmdTarget派生的类,都可以接收到这类消息。
3.通过消息
通告消息是由控件产生的消息,例如按钮的单击、列表框中选项的选择等都会产生这类消息,目的是向父窗口(通常是对话框)通知时间的发生。这类消息也是以WM_COMMAND形式呈现的。从CCmdTarget派生的类,都可以接收到这类消息。
通过MSDN提供的MFC类层次结构图,可以发现CWnd类实际上派生于CCmdTarget类。也就是说,凡是从CWnd派生的类,既可以接收标准消息,也可以接收命令消息和通过消息。而对于那些从CCmdTarget派生的类,则只能接收命令消息和通过消息,不能接收标准消息。
其中,文档类(CXXXDoc)和应用程序类(CWinApp)都派生于CCmdTarget类,所以它们可以接收菜单命令消息。但是因为它们不是从CWnd类派生的,所以不能接收标准消息。
菜单命令消息传输过程:
当选择某个菜单命令时,最先接收到这个菜单命令消息的是框架类。
1.框架类将把接收到的这个消息交给它的子窗口,即视图类,由视图类首先进行处理。
2.视图类首先根据命令消息映射机制查找自身是否对此消息进行了响应,如果响应了,就调用相应的响应函数对这个消息进行处理,消息传输过程结束;如果视图类没有对此命令消息做出响应,就交由文档类。
3.文档里同样查找自身是否对这个菜单命令进行了响应,如果响应了,就由文档类的命令消息响应函数进行处理,传输路由过程结束;如果文档类也未做出响应,就把这个命令消息交还给视图类,后者又把消息交还给框架类。
4.框架类查看自己是否对这个菜单命令进行了响应,如果它也没有做出响应,就把这个命令消息交还给应用程序类,由后者来进行处理。