第6节 命令传递机制
在一些MFC派生类中重写OnCmdMsg虚函数,可以对WM_COMMAND消息的发送路径进行管理。例如,在主框架类中收到命令消息后,调用活动视图子窗口的OnCmdMsg函数,让活动视图子窗口得到优先处理。如果视图子窗口不处理,则再调用与它关联的文档以及theApp等类对象处理。
创建一个工程名为“cm”不使用文档视图架构的SDI程序,用于了解命令传递机制。
1)在向导第1步,选择多文档和非文档视图框架,如图13-27所示。

图13-27 创建框架视图程序
2)添加CTreeView派生类作为分隔栏左侧的视图类,如图13-28所示。
3)添加CListView派生类作为分隔栏右侧的视图类,如图13-29所示。

图13-28 创建CTreeView类的派生类

图13-29 创建CListView类的派生类
4)在stdafx.h预定义头文件中,添加视图类的头文件,如图13-30所示。

图13-30 修改预编译头文件
5)在主框架类的头文件中,添加两个视图类的指针变量并删除ChildView的代码。


6)在主框架类的OnCreate函数中删除ChildView的代码。

7)在OnFocus和OnCmdMsg两个函数中,也删除ChildView的代码。

8)在主框架类中添加OnCreateClient虚函数,如图13-31所示。

图13-31 添加虚函数
9)修改OnCreateClient函数代码,创建一行两列的分隔窗口。(https://www.daowen.com)

10)在资源视图中,修改IDR_MAINFRAME主菜单,如图13-32所示。

图13-32 编辑主菜单资源
11)在“编辑”菜单下面添加一些子菜单项,见表13-3。
表13-3 编辑菜单项属性

12)通过类向导在CLeftView视图类中,建立“添加部门”菜单项的消息映射函数,如图13-33所示。

图13-33 添加菜单项的消息映射函数
13)通过类向导在CRightView视图类中,建立“添加员工”菜单项的消息映射函数,如图13-34所示。

图13-34 添加菜单项的消息映射函数
14)编译并运行,测试代码,如图13-35所示。
两个新增的菜单项并不可用,说明菜单消息并没有被转发到主框架的两个子窗口内。

图13-35 查看运行结果
15)重写主框架类的OnCmdMsg虚函数。

16)编译并运行,测试代码,如图13-36所示。

图13-36 查看运行结果
通过重写OnCmdMsg函数,将主框架内接收的命令消息准确地分发给两个视图子窗口。