当前课程知识点:VC++面向对象与可视化程序设计(下):MFC编程基础 > 第9章 单文档与多文档 > 9-5 MDI编程实例 > 9-5-1
返回《VC++面向对象与可视化程序设计(下):MFC编程基础》慕课在线视频课程列表
返回《VC++面向对象与可视化程序设计(下):MFC编程基础》慕课在线视频列表
下面我们介绍一个MDI的例子
这个例子是这样的
我们要创建一个多文档的应用程序
可以打开两种类型的文档
其中MyMdi是主窗口的标题
MyMdi是系统默认生成的文档
在此窗口中可以输入文字
还有一个MyMdi2是另一个用户添加的文档类型
在这个文档中
用户通过“选择图形”这个菜单项
然后在视图窗口中拖动鼠标就可以画出图形
由于两种文档的操作对象和操作方式不同
程序运行时的界面与菜单就不同
那我们下面创建一个MyMdi的工程文件
在创建工程文件的时候
在文件模板属性的文件扩展名对话框中我们加入mmd
完成后的应用程序文件将使用mmd为扩展名
那么文件过滤器域显示的也是mmd
我们在建立了这个过滤器之后
然后我们为CMyMdiView这个类设置一个基类为CEditView
好了!我们开始制作
我们创建一个叫做MyMdi
那么这个时候这个应用程序就是多文档的
那么我们就缺省的了
这时候文件扩展名我们给它起为mmd
下一步
好!这里面我们都用缺省的
那么在生成的类里面
我们的基类要给它起成CEditView
我们要创建第二种文档和视图类
那么我们在创建的过程中
应该为应用程序添加CDocument的派生类CMyMdiDoc2
和CView的派生类CMyMdiView2
那么我们看怎么操作
这时候我们在类视图里面添加MFC类
那么类的名字我们给它起成CMyMDIDoc2
那么这时候呢基类我们选CDocument类
我们找到CDocument类
那么这时候的话呢我们就生成了这么一个类
那么它定义的文件是在MyMdiDoc2里面定义的
然后我们还要增加视图类
所以仍然添加类
我们添加的是CMyMdiView类
CMyMDIView2这个类
那么它的基类是CView
那么这个CMyMdiView2
我们“完成”
好了相关的内容我们都加完了
然后我们要增加资源
我们现在创建好了第二个文档和视图类之后
我们要在资源文件中手工地加入
MyMdiTRYE2的这个东西
这个就定义了第二个文档的文档、视图和框架窗口共同的资源ID
那么以后定义的菜单、文档模板、视图资源等都可以使用这个ID
那么我们在Recourse里面添加一下
给它添加到最后面就行了
那这里面我们写的131要注意跟前面不要有重复
前面如果有131
我们就一定不能用131了 132没用过
我们就改成132
那么对于第一个模板我们可以看到
MyMdi的type
我们打开这个资源视图
我们打开一下这个文件
我们可以看到这个它的构架的话呢是这样的
文档模板字符串的格式是Window的Title
过滤器 过滤器的名字
扩展名 注册文件的类型ID 等等等等
如果我们打开这个文件的话 .rc文件
我们就可以看到这些代码
我们这时候如果看一下String Table
我们就看到 第一个文档资源模板是在这地方
它是这么写的
大家去校对一下这个格式
实际上就是文档模板字符串的格式
这个格式我们在教材里面对每一行都有注释
大家可以看一下
第一个文档它是系统给添加好的
那么第二个文档是我们自定义的
所以这时候对第二个资源模板我们进行手工的添加
那么我们根据它第一个文档的格式
我们增加第二个文档的模板
这时候的话 我可以在高亮的地方进行增加
然后我选择这个定义的ID
这个是我增加的 IDR_MyMdiTYPE2
好!增加完了 那么这个值132
刚才在Resource里面大家已经看到了我增加的是132
然后我把这块内容给拷贝上去
格式的话,跟第一个是很相像
那么这样的话,我们就创建了第二个模板
然后我们接下来要做什么事情呢?
要在菜单里面增加我们的菜单项内容
所以我们在资源视图中选择Menu
我们把这个Menu TYPE复制一份过来
然后这个给它改成TYPE2
在这里TYPE2里我们创建一个菜单叫做“选择图形”
菜单项下面有“直线” “椭圆” “矩形”
那么我们要为每一个菜单项设置ID
这个ID就给它设成直线
这个就给它设成椭圆
那么这个给它设成矩形
我们ID都给它设置好了
下面我们就要进行代码的编写
那么我们就看一下
在创建文板模板类中
我们应用程序的InitInstance()函数中
我们这时候是需要定义新的文档模板的对象
所以的话,我们看一下
MyMdi.cpp这个文件
InitInstance() 在这里我们要定义第二个文档模板
所以的话在这里面,第一个文档模板的创建,这个构架的话前面都给大家介绍过了
我们在TODO的地方构建第二个文档模板
在InitInstance()这个函数里面增加相应内容
增加的内容是
首先创建一个指向多文档类的文档模板
然后创建这个文档模板
在这里面我们使用的参数跟前面第一个模板非常相似
那么这个大家从这里看跟这个就非常相似
那么在这里面这是创建第一个模板了
我们如法炮制
创建第二个模板
那么创建完MDI派生文档类的CRuntimeClass对象的一个指针
那么这个跟前面的MDI的子窗口框架
这个是视图
创建文档模板视图的对象
那么这些的话,跟前面的非常相似
代码加完后大家发现
这里面画线的有两个带波浪号的
那么实际上这是错误提示
也就是说CMyMdi不识别这些东西
那么怎么办呢?
为了使CMyMdiDoc2这个类和CMyMdiView2类
能够在CMyMdiApp中成为可识别的类
我们要加入这两个类的定义文件
所以的话,我们要include这两个类的定义
所以我们给它加进去
这个地方大家看 加了这两个后
实际上这两个类他们就都识别了
然后我们还要扩展CMyMdiDoc2这个类
我们在这个类中添加CPtrArray这个类型的成员变量m_data
这个CPtrArray这个是一个集合的类
它可以保存多个类的实例对象
我们用这个m_data保存图形信息
因为我们要在第二个文档里面画图
所以在CMyMdiDoc2里面增加这个m_data
要增加这个m_data很简单
只要在它这个MDI的定义中
添加CPtrArray m_data就可以了
当然了你也可以通过这个添加变量的方式
然后把数据类型和变量名写在这儿
也同样可以添加 添加的效果就是这个
那添加完了我们还要在应用程序中添加一个C++类的DrawData
用来保存每个图形信息
那么这个DrawData的定义是这样的
由于是图形信息,我们现在只有起点和终点
画直线、画矩形、画椭圆等等
所以的话,我们这里有一个POINT成员begin和end
然后定义一个整型变量
由于我们增加了这个C++的DrawData这个类
那么可以直接在类视图里面
我们可以通过添加类
然后添加C++的类
这个办法来添加类名
类名就是DrawData
这些文件都自动地生成了
那么我们添加完这个类之后
要添加这个StdAfx
在这里面呢 它定义了对POINT的识别
也就是对POINT的定义
如果不增加这句的话
它不识别POINT数据结构
所以的话 在这个类的定义里面
我们在前面嵌入了这一行
为了能在CMyMdiDoc2中能够用这个类
那同样的话我们就在这个Doc2这个头文件的定义中
我们增加DrawData.h
那么就是include DrawData.h
那么大家看 我们在这里面是这么个增加的
好了我们要增加这一行
这一行增加完之后呢
也就是说在这个类中可以识别DrawData了
我们还要添加一个用于保存图形类型的整型变量drawType
然后在构造函数中初始化为0
因为我们要画的图形类型有直线、有矩形、有椭圆
所以的话到底是什么?
我们要有一个变量来记录
所以这样的话我们定义一个DrawData
好了,我们仍然在CMyMdiDoc里面的话
定义一个drawType
drawType实际上很简单
就在这里面定义就可以了
当然你也可以直接增加
也可以通过添加变量的方式
填写变量类型跟变量名
同样都可以达到这个效果
这个大家学到今天比较熟悉了
然后我们要在构造函数中 给它初始化为0
那么构造函数在哪里
构造函数是在MyMdiDoc2.cpp里面给它初始化为0
好了那么这样,初始化在这里完成
下面我们要添加菜单处理的函数
-讨论实录
--0-0
-6-1 MFC概述
-6-2 C++的基本知识
--6-2-1 类
--6-2-2 对象
--6-2-6 重载
--6-2-9 指针
-6-3 MFC类的组织结构及主要的类的简介
--6-3-2 根类
-6-4 MFC中全局函数和全局变量
-7-1 概述
--7-1-1
--7-1-2
-7-2 按钮控件及其应用
--128B12447816EEF99C33DC5901307461
-7-3 按钮控件及其应用
--7-3
-7-4 静态控件
--7-4
-7-5 列表框控件
--7-5-1
--7-5-2
-7-6 编辑框控件
--7-6
-7-7 组合框控件
--7-7
-7-8 对话框通用控件
--7-8-1
--7-8-2
-讲义源代码
--html
-8-1&2 资源的应用以及菜单资源的使用
--8-1-1
--8-1-2
-8-3 快捷菜单的创建及其应用
--8-3
-8-4 加速键资源的创建及其使用
--8-4
-8-5 工具条资源的创建及其使用
--8-5
-8-6 字符串资源的使用
--8-6
-8-7 位图资源的创建及其使用
--8-7
-课堂示例源代码
--html
-第一次作业内容及要求
--html
--第一次作业及答题链接--作业
-9-1 概述
--9-1
-9-2 Doc/View框架的主要成员
--Video
-9-3 文档操作中的一些重要概念
--Video
-9-4 SDI编程实例
--Video
-9-5 MDI编程实例
--9-5-1
--9-5-2
-课堂示例源代码
--html
-第二次作业内容及要求
--html
--第二次作业及答题链接--作业
-10-1 利用音频函数实现多媒体程序设计
--10-1-1
--10-1-2
--10-1-3
--10-1-4
-10-2 利用Windows Media Player控件实现多媒体程序设计
--10-2
-课堂示例源代码
--html
-例11-1
--例1
-例11-2
--例11-2
-例11-3
--例11-3
-例11-4
--例11-4
-11-1 ODBC介绍与引用
--11-1
-课堂示例源代码
--html
-第三次作业及答题链接