// Windows消息的分类,分为以下三类
// 标准消息:除WM_COMMAND之外,所有以WM_开头的消息都是标准消息,
// 从CWnd派生的类,都可以接受到这类消息
// 命令消息:来自菜单、快捷键或工具栏按钮的消息。这类消息都以WM_COMMAND
// 形式呈现,在MFC中通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,
// 通过消息的wParam参数识别。从CCmdTarget派生的类,都可以接受这类消息
// 通知消息:由控件产生的消息,例如按钮的单击,列表框的选择等都会产生
// 这类消息,这类消息也都以WM_COMMAND形式呈现,从CCmdTarget派生的类,都可以接受这类消息
// 从MFC类层次结构图发现,CWnd类实际上派生与CCmdTarget类,也就是说,凡是从
// CWnd派生的类,它们既可以接收标准消息,也可以接受命令消息和通知消息,
// 而对于那些从CCmdTarget派生的类,则只能接收命令消息和通知消息,不能接收
// 标准消息
// 文档类CxxxDoc和应用程序类CWinApp,因为他们都派生与CCmdTarget类,所以它们
// 可以接受菜单命令消息,但因为他们不是从CWnd类派生的,所以不能接收标准消息
// 菜单命令消息与标准消息的路由过程不太一样
// MFC在后台吧窗口过程函数替换成成了AfxWndProc函数,对消息进行处理,该函数
// 内部调用AfxCallWndProc函数,这个函数又调用WindowProc,这是CWnd类的一个
// 成员函数,应用程序所有类型的消息都会进入到这个函数中。WindowProc函数又
// 将调用OnWndMsg,对到来的消息进行一个类型判断,如果是标准消息,利用消息
// 映射机制来查找是那个类响应了当前这个消息,并调用相应的处理函数,完成对
// 消息的处理;如果是命令消息,它就会交给OnCommand处理,完成对消息的路由
// 如果是通知消息,它将交给OnNotify处理,完成对消息的路由,二者最后都会
// 调用OnCmdMsg()
// 当点击某个菜单项时,最先接受到这个菜单命令消息的是框架类。框架类把接收到的消息
// 交给它的子窗口,及视图类,由视图进行处理。视图类根据消息映射机制查找是否对此
// 消息进行了响应,如果响应了就处理,消息路由过程结束;如果没有响应,就交给文档类
// 判断文档类对此消息是否进行响应,响应则处理,否则把命令消息交给视图类,视图类在
// 交给框架类,判断框架类对视图是否进行响应,响应则处理,否则把命令消息交给应用程序类
// 由应用程序类处理
命令消息的路由
最新推荐文章于 2022-09-10 07:03:10 发布