首页 理论教育VC++MFC命令传递机制示例

VC++MFC命令传递机制示例

【摘要】:在一些MFC派生类中重写OnCmdMsg虚函数,可以对WM_COMMAND消息的发送路径进行管理。例如,在主框架类中收到命令消息后,调用活动视图子窗口的OnCmdMsg函数,让活动视图子窗口得到优先处理。创建一个工程名为“cm”不使用文档视图架构的SDI程序,用于了解命令传递机制。7)在OnFocus和OnCmdMsg两个函数中,也删除ChildView的代码。图13-36 查看运行结果通过重写OnCmdMsg函数,将主框架内接收的命令消息准确地分发给两个视图子窗口。

在一些MFC派生类中重写OnCmdMsg虚函数,可以对WM_COMMAND消息的发送路径进行管理。例如,在主框架类中收到命令消息后,调用活动视图子窗口的OnCmdMsg函数,让活动视图子窗口得到优先处理。如果视图子窗口不处理,则再调用与它关联的文档以及theApp等类对象处理。

创建一个工程名为“cm”不使用文档视图架构的SDI程序,用于了解命令传递机制。

1)在向导第1步,选择多文档和非文档视图框架,如图13-27所示。

978-7-111-46378-8-Chapter13-85.jpg

图13-27 创建框架视图程序

2)添加CTreeView派生类作为分隔栏左侧的视图类,如图13-28所示。

3)添加CListView派生类作为分隔栏右侧的视图类,如图13-29所示。

978-7-111-46378-8-Chapter13-86.jpg

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

978-7-111-46378-8-Chapter13-87.jpg

图13-29 创建CListView类的派生类

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

978-7-111-46378-8-Chapter13-88.jpg

图13-30 修改预编译头文件

5)在主框架类的头文件中,添加两个视图类的指针变量并删除ChildView的代码。

978-7-111-46378-8-Chapter13-89.jpg

978-7-111-46378-8-Chapter13-90.jpg

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

978-7-111-46378-8-Chapter13-91.jpg

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

978-7-111-46378-8-Chapter13-92.jpg

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

978-7-111-46378-8-Chapter13-93.jpg

图13-31 添加虚函数

9)修改OnCreateClient函数代码,创建一行两列的分隔窗口。(www.chuimin.cn)

978-7-111-46378-8-Chapter13-94.jpg

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

978-7-111-46378-8-Chapter13-95.jpg

图13-32 编辑主菜单资源

11)在“编辑”菜单下面添加一些子菜单项,见表13-3。

表13-3 编辑菜单项属性

978-7-111-46378-8-Chapter13-96.jpg

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

978-7-111-46378-8-Chapter13-97.jpg

图13-33 添加菜单项的消息映射函数

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

978-7-111-46378-8-Chapter13-98.jpg

图13-34 添加菜单项的消息映射函数

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

两个新增的菜单项并不可用,说明菜单消息并没有被转发到主框架的两个子窗口内。

978-7-111-46378-8-Chapter13-99.jpg

图13-35 查看运行结果

15)重写主框架类的OnCmdMsg虚函数。

978-7-111-46378-8-Chapter13-100.jpg

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

978-7-111-46378-8-Chapter13-101.jpg

图13-36 查看运行结果

通过重写OnCmdMsg函数,将主框架内接收的命令消息准确地分发给两个视图子窗口。