当前课程知识点:VC++面向对象与可视化程序设计(下):MFC编程基础 > 第9章 单文档与多文档 > 9-5 MDI编程实例 > 9-5-2
返回《VC++面向对象与可视化程序设计(下):MFC编程基础》慕课在线视频课程列表
返回《VC++面向对象与可视化程序设计(下):MFC编程基础》慕课在线视频列表
下面我们要添加菜单处理的函数
我们可以在CMyMdiDoc2这个类中加入消息响应成员函数
那么这个我们自己来添加
这个类的定义中我们可以增加这么一个函数
当然你也可以在类的定义中添加函数的办法
在这里添加相应的函数
比如函数名 函数的参数
函数的参数就是UINT nID
那么函数名的话就是OnChangeDrawType
返回类型就是这个void
这个参数类型就是Uint
那么也可以给大家演示一下
你们做的时候返回值可以选void
函数名的话,可以是OnChangeDrawType
那么参数的名字叫做nID
参数的类型是Uint
那么这个就要添加
好,只要添加就过来了
然后我们就添加了这个
然后添加完 我们就要进行消息映射
我们就要在这个MyMdiDoc2.cpp的
消息映射部分添加选择图形类型的消息映射
添加消息映射我们选择的是COMMAND_RANGE
然后ID的话呢,第一个ID是直线
第二个是椭圆 第三个是矩形
所以第一个ID跟最后一个ID,绑定的它的消息处理函数是OnChangeDrawType
我们自己添加这一行在这个消息映射的区域
我们在消息映射的区域
我们已经添加好了这个这句
第一个是画线 第二个是画矩形
然后绑定的是消息处理函数
那么我们就要编写这个消息处理函数
这个里面 我们刚才定义了一个m_drawType就是绘画类型
nID减去第一个参数ID_LINE等于ID的索引值
如果减出来的是0,那么第一个就是画线
如果减出来是1那么画得就是椭圆
如果2的话呢 就是矩形
我们要进行串行化处理
为了把对视图中显示文本的修改保存到磁盘文件中
并在需要时可以打开所保存的磁盘文件读取文档
我们必须要重载CMyMdiDoc2类的Serialize()
串行化函数来完成串行化
串行化代码也是这样
这跟前面讲的串行化处理一样
如果存储
我们就获取它的值,然后储存起来
如果存储过程中我们要把图形存储起来的话
我们就要看这个值
确定它的x坐标和y坐标
一定是从左上角到右下角
因为我们画线的时候
可以从任意方向画线
所以这个例子跟我们前面讲过的一个例子类似
就是要确定它的坐标方位
么如果是加载代码
我们就是把内容的话呢 全部先清空
我们在这里定义了一个DrawData的指针
然后在这指针里面,我们把所有x\y的数据取出来
然后的话将文档中的数据读入到data的内存中去
然后加入到集合类中
最后一更新,全部就画出来了
后面我们要考虑一个视图的输出
在视图CMyMdiView2这个类中
我们要定义一个DrawData类型的变量 m_DrawData
这个变量要用于保存当前要绘图的信息
画完后把这信息保存
同时的话我们还要在这个view里面
因为视图是在绘图中绘图
但是我们牵扯到画图的数据和我们的文档
所以要在视图里面加上这两个头文件
才能够使用它们这个类
这是一个
第二个在为视图CMyMdiView2里面我们要增加
鼠标单击左键这么一个消息
和鼠标左键的按下和抬起两个消息
实际上这两个消息是为了画图用的
当按下鼠标时
定义一个DrawData类的对象
用这个类的成员begin记录按下鼠标时的坐标
用end记录松开鼠标时的坐标
那么我们可以根据文档类中图形的类型
决定在客户区画什么样的图形
所以这里面就牵扯一个视图的输出问题
然后我们在视图里面响应鼠标消息
我们是这么完成的
在这个view里面
类向导里面的消息
然后响应的鼠标左键按下和鼠标左键抬起的消息
好了 那么这两个消息都响应完了
我们就可以看一下
当鼠标按下左键的时候
我们做的事情是什么
我们这里定义了一个第二个文档的指针
然后获取文档的GetDocument()第二个文档的内容
然后我们又定义了一个这个DrawData这个对象
获取它的起始位置
当然了 我们为了在视图2里面能够使用
因为我们是GetDocument()是获取文档
那么在视图view里面响应的鼠标
那么我们坐标是在文档里面获取
所以我们还要加入这个文档的头文件
否则的话,CMyMdiDoc2对象是没法定义的
那么我们获得鼠标左键消息之后
我们(处理)是鼠标右键
右键是抬起
抬起的话仍然在第二个视图
就是view2里面
获取定义一个指向第二个文档的指针
然后获取的是结束位置的坐标
那么也就是说到这里为止
我们已经获取了画图的起始位置的坐标和结束位置的坐标
然后有了这个坐标之后
我们定义一个客户区的DC类的对象
CClientDC对象
用这个对象的成员就可以画图
那么在画图过程中我们仍然要创建一个空的画刷
CBrush的对象
因为什么呢
建立一个空画刷 绘图时就不会覆盖下面的图形
所以我们的画刷用的是HOLLOW_BRUSH
然后把这个画刷BRUSH选入当前的设备环境DC
然后根据起始坐标和终点坐标确定用户区
一个矩形用户区
然后的话呢 我们再根据这个获得的值
它的值如果是0 就把笔移到起始位置
MoveTo起始位置 LineTo结束位置
那么画的就是一条线
如果是1的话呢
实际上是矩形
因为我们已经知道矩形区的坐标
所以我们在矩形区里画内切椭圆
那么如果矩形的话呢
我们在矩形区里就可以唯一的画一个矩形
那这样就可以画图
画出来后呢
我们就将保存图形的信息m_drawData保存到文档类的成员当中去
然后画完之后
就可以DeleteObject 这个画刷就可以删除了
删除之后刷新用户区
m_drawData是不执行,报错的
那么只要在前面增加这个DrawData.h就可以了
我们还要在视图的OnDraw函数中添加刷新的代码
OnDraw函数中只需将文档类的成员m_drawData
这个集合的成员在客户区中绘制一遍就可以了
那么这个函数的代码是这样的
OnDraw 获取文档内容
这里面大家注意
原来代码里面写了一块儿别的内容
大家可以把它去掉
因为我们获得的是第二个文档的内容
所以把它改成第二个文档的内容
然后的话在这里面进行虚画刷的刷新
这样就重新绘制了
在绘制过程中我们通过一个循环来确定我们获取的是哪一项
把它的项数放到绘制数据的对象里面去
在这个时候我们已经获取了矩形区域的坐标
根据这个坐标进行图形类型的绘制
那么这时候drawData它的type如果是0 就画线
如果是1就画椭圆
如果是2就画矩形
那么这样的话呢
我们就完成了第二个多文档的操作
测试一下
好了 我们如果说新建一个第二个文档
我们确定
确定完了我们可以选择图形
如果话直线的话我们就画出来一个直线
如果画椭圆的话就可以画一个椭圆
如果画矩形的话就可以画一个矩形
-讨论实录
--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
-第三次作业及答题链接