- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
课程设计MFC
文档视图综合应用
用鼠标绘制曲线
1.1 目标与要求
本项目主要实现用鼠标绘制曲线;
曲线的线型、曲线的宽度(象素数)和颜色可以通过对话框进行选择,颜色可以通过颜色对话框选择,也可以在编辑框内直接输入。默认情况下,线型为实线,宽度为1个象素,颜色为黑色;
按下鼠标左键不放并拖动鼠标绘制曲线,松开鼠标停止绘制;再次按下鼠标左键绘制第二条曲线,依此类推;
曲线可以以文件的形式保存在磁盘里,也可以打开保存过的曲线文件并显示,保存或打开的文件名以drl为扩展名。
1.2 分析
数据结构的设计:一个视图可以显示若干条曲线,这若干条曲线组成曲线网络;而每条曲线又由若干个节点组成,每条曲线除了若干个节点之外,它还有线型、宽度和颜色等属性。所以,曲线网络的数据结构的定义如图1所示(其他的曲线的结构同曲线1):
图1 曲线网络的数据结构
这里利用集合类CArray和CTypedPtrList存放分别存放节点集合和曲线集合。这是因为:
(1)组成曲线的点的数目和组成曲线网络中曲线的数目事先无法确定,利用集合类来存放,可以动态改变集合的大小;
(2)我们需要把曲线网络的信息写到磁盘文件中,或需要从磁盘文件中读取曲线文件,集合类是个很好的选择,因为他们都是派生于CObject类,具有Serialize的特性;
(3)同时集合类又是模板类,所以在使用时需要指定具体的成员类型。在使用CArray类时,指定其成员类型为CPoint类。在使用CTypedPtrList类时,指定其基类为CObList,成员类型为CCurve*,其中CCurve将在下面详细说明。
曲线类的定义
(1)类名称CCurve,头文件Curve.h,实现文件Curve.cpp。
(2)基类CObject,即类CCurve必须派生自CObject,使CCurve具有Serialize特征,为此类的声明文件(头文件)中必须有DECLARE_SERIAL宏,类的执行函数里必须有IMPLEMENT_SERIAL 宏。
(3)设置构造函数,首先必须定义一个缺省的构造函数,即无参数的构造函数CCurve(),为什么?因为若一个类来自文件,MFC必须先动态生成它的对象,而且在没有任何参数的情况下调用其构造函数,然后才从文档中读出对象信息。另外,根据需要,可以添加其他形式的构造函数。在这里,除了缺省的构造函数外,也添加了一个新的构造函数,其形式为CCurve(int nStyle,int nWidth,COLORREF crColor),其中第一个参数为曲线的线型,曲线的线型主要有实线、短划线、点线、点划线和点点划线等,第二个参数为曲线的宽度,第三个参数为曲线的颜色,即通过这个构造函数设置曲线的线型、宽度和颜色。
(4)曲线文件的保存和打开。在这里需要改写文档类的虚拟函数Serialize,把一条曲线的信息写入文件中或从文件中读取一个曲线的信息并显示。写入或读取的曲线信息主要有线型、宽度、颜色和节点序列,这四种信息的写入和读取的顺序要相同。由于节点序列是存放在CArrray类型的数组中,而该类型的数组本身具有序列化的特点,所以在写入或读取节点序列时,再调用CArrray的Serialize函数,完成一次性的写入或读取节点序列。
(5)曲线的绘制。曲线的绘制分三步进行,第一步,根据曲线属性定义画笔,画笔的属性主要有:线型、宽度和颜色,这些属性都可以通过对话框由用户选择;第二步把定义好的画笔选入设备环境中;第三步即可用定义好的画笔在具体的设备环境中画线。
(6)添加新的节点函数AddNewPoint。鼠标每移动一下,都要调用该函数,把当前鼠标位置坐标添加到曲线类CCurve的节点序列中。
文档类
(1)曲线网络的定义m_curveList,采用模板链表类CTypedPtrList,该类的基类为CObList,即链表中的成员为CObject类对象,类型为CCurve*,为指向CCurve类的指针。
(2)曲线文件的读写Serialize,分三步进行:第一步,由于CTypedPtrList派生自CObject,所以该类对象也具有序列化的特征,所以曲线文件的读写即完成该类对象的序列化操作就行了,即在文档类的Serialize函数直接调用CTypedPtrList类的Serialize函数;第二步,由于CTypedPtrList类的成员是CCurve类,所以需要继续调用CCurve类的Serialize函数,来完成各条曲线的序列化操作,即依次完成每条曲线的属性(包括线型、宽度和颜色)和节点序列的写入或读取;第三步,由于每条曲线的节点序列存放在CArray数组中,于是接着调用CArray类的Serialize函数完成节点序列的序列化操作。
(3)创建一条新的曲线函数NewCurve。该函数
文档评论(0)