




已阅读5页,还剩41页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
山东凯文科技职业学院 山东凯文科技职业学院山东凯文科技职业学院 2012 届毕业论文届毕业论文 基于 VC 的基本矢量图形系统的开发与实现 学 院: 信息学院 学生姓名: 吴海瑞 指导教师: 张丹丹 专 业: 软件技术 班 级: 09 软件技术 1 班 完成时间: 2012 年 6 月 27 日 山东凯文科技职业学院 I 目目 录录 第一章 绪 论1 1.1 选题背景及意义1 1.2 国内外研究现状1 1.3 论文内容及结构安排2 1.4 本章小结3 第二章 矢量图形系统的分析与设计4 2.1 开发思路4 2.2 开发模式4 2.3 功能分析5 2.4 功能模块设计6 2.5 本章小结6 第三章 矢量图形系统的坐标转换7 3.1 WINDOWS环境下的坐标系.7 3.1.1 设备坐标.7 3.1.2 逻辑坐标.7 3.2 设备坐标与逻辑坐标8 3.2.1 设备坐标与逻辑坐标的关系.8 3.2.1 设备坐标及逻辑坐标的转换.8 3.3 窗口与视口9 3.4 本章小结9 第四章 实现矢量图形系统的文档和视图10 4.1 矢量图形系统的图形元素类10 4.1.1 图形元素基类.10 山东凯文科技职业学院 II 4.1.2 直线类.10 4.1.3 连续直线或封闭多边形类.10 4.1.4 圆类.10 4.1.5 圆弧类.11 4.1.6 标注文本类.11 4.1.7 图形参数类.11 4.2 矢量图形系统的文档11 4.2.1 面向对象的文档管理机制.11 4.2.2 创建图形元素对象指针.11 4.2.3 矢量图形系统的文档.12 4.2.4 实现文档的管理功能.12 4.3 矢量图形系统的视图13 4.3.1 建立坐标系.13 4.3.2 实现各类图形元素的绘制功能.14 4.3.3 实现视图的绘制.14 4.4 鼠标交互绘图15 4.4.1 要解决的主要问题.15 4.4.2 交互绘制各类图形元素.15 4.5 本章小结17 第五章 矢量图形系统的操作功能18 5.1 图形操作菜单管理18 5.1.1 增加菜单资源.18 5.1.2 添加消息处理函数.18 5.2 图形操作的具体实现19 5.2.1 图形重画.19 5.2.2 图形放大和移动.20 5.2.3 重画上屏和重画首屏.22 山东凯文科技职业学院 III 5.2.4 显示全图.24 5.2.5 图形重画速度的提升.25 5.3 图形的点选与撤销27 5.3.1 鼠标点选图形元素.27 5.3.2 各种图形元素的点选判断函数.28 5.3.3 实现点选图形元素功能.29 5.3.4 选中图形元素的特殊显示.31 5.3.5 撤销选中的图形元素.32 5.4 图形元素的删除32 5.5 本章小结35 第六章 总结与展望36 6.1 总结36 6.2 展望36 参考文献37 致 谢38 山东凯文科技职业学院 IV 摘 要 矢量图形系统作为 GIS 系统组成的一部分,随着 GIS 系统用户的不同,对 于矢量图形系统的要求也不同,现有 GIS 矢量图形绘制系统功能全面,但是针 对性差,所以有针对性的从底层自主开发符合自己需要的矢量图形系统是十分 必要的。 论文利用面向对象的程序设计和 C+类的组织方法,在 VC6.0 下实现了一 个基本的矢量图形系统,能够实现鼠标绘制直线、圆、圆弧、圆形区域等功能。 通过对矢量图形系统坐标系的建立及其与 Windows 坐标系之间的转换关系的探 讨,实现了图形的无级缩放、漫游、全图显示等操作功能。通过对点选图形元 素的原理的研究,实现了图形的选中、图形删除、放弃选中等功能。此外,就 矢量图形的显示速度等问题进行了探讨,并提出了加快图形显示速度的基本方 法:在显示一个图形元素前,对这个图形元素进行判断,判断这个图形元素是 否在视图屏幕中,如果这个图形元素不在当前的视图屏幕中,就不用对这个图 形元素进行绘制,以此节省绘制时间。 系统具有比较完善的图形绘制功能,可应用于城市信息管理系统中。 【关键词】矢量图形;鼠标绘图;无极缩放 山东凯文科技职业学院 山东凯文科技职业学院 V Development and Implementation of Basic Vector Graphics System Under VC Abstract Vector graphics system as a component part of the GIS system, GIS system users with different requirements for the vector graphics system is different, and the existing full-featured GIS graphics rendering system, but targeted poor, it targeted independent from the underlying development in line with their vector graphics system needs is essential. By using object-oriented programming and C + + class method of organization, the organization implements a basic vector graphics system that enables the mouse to draw a straight line, circle, arc, circle and so on. Vector graphics system through the establishment of the coordinate system and its Windows coordinate system conversion relationship between study and realize the stepless zoom graphics, roaming, full map display and other operations functions. Click through on the principles of graphic elements to achieve the selected graphic, graphics, remove, abandon selected functions. In addition, vector graphics display speed of the other issues discussed,And proposed to accelerate the speed of the basic method of graphical display, which is a graphical element in the display before the judge on the graphic elements to determine whether the graphic elements in the view screen, if the graphic element is not the current view of the screen, they do not draw on the graphic elements in order to save rendering time. System has a relatively complete graphics rendering capabilities, mainly used for urban information management system. 【Keywords】 vector graphic ; Mouse drawing;Promise Zoom 山东凯文科技职业学院 山东凯文科技职业学院 0 第一章第一章 绪绪 论论 1.1 选题背景及意义 一个基本的 GIS 系统包括管理空间坐标数据的矢量图形系统和管理属性信 息的数据库管理系统,以及实现矢量图形系统与数据库管理系统双向连接的连 接系统三个部分1。 矢量图形系统面向地理对象,是地理实体抽象和完整表达的主要方式,因 而是 GIS 系统中重要的组成部分,也是开发一个 GIS 系统的重点所在2。 一些专业的商品化 GIS 软件都提供了比较完善的图形系统的功能,利用这 些专业的工具软件进行开发,虽然开发难度不高,简单易学,但也普遍存在着 一些弊端3: 不易扩展。专业的 GIS 工具软件提供的接口复杂,难于修改,不能够 很好的扩展; 软硬件要求高。专业的 GIS 软件开发工具通常比较庞大,对系统软硬件 的要求高; 软件不易升级。利用 GIS 专业软件工具所进行的图形系统的开发,实质 上只是在这些专业软件基础上做一些简单的应用开发,开发完成的产品同样需 要这些专业软件工具的支撑,因此,软件的升级就要受到制约; 代价高。商品化的 GIS 软件要面向最广的用户,所以软件和系统还是作 为一个整体而存在,开发者必须要购买整个的 GIS 软件,代价较高,而且购买 的平台中真正需要的功能可能只是很少的一部分,造成了软件资源的浪费。 此外,在实际的应用中,我们对系统的需求往往主要集中在某些特定功能 上,如本论文结合信息平台的需求,所需要的功能主要是图形的绘制、显示、 查询、缩放等。然而,商品化的 GIS 软件致力于提供解决方案,它提供了全面 的 GIS 功能,因此,面向实际应用的针对性必然要差一些。 综合以上分析,对于有特定需求的用户来说,有针对性的从底层自主开发 符合自己需要的矢量图形系统是十分必要的。 1.2 国内外研究现状 矢量图形系统作为 GIS 系统最重要的组成部分,应用领域也不断扩大,已 进入了普通管理信息系统(MIS) 4,GIS 矢量图形系统与普通管理信息系统相结 合,克服了 MIS 系统的局限性,大大提高了系统的直观性和可操作性,同时提 高了 MIS 系统所不能解决的如空间信息统计、属性信息计算等功能。 山东凯文科技职业学院 山东凯文科技职业学院 1 专业的 GIS 软件大都提供了较为完善的矢量图形的开发功能。借助这些专 业的开发工具软件,出现了大量 GIS 系统的研究和开发成果。 文献5提出了一种小型 GIS 矢量图形系统的设计方案,利用 GIS、面向对 象及数据库等技术,以 VC+6.0 开发平台,底层开发实现了一个具有图形编辑 功能,且有与第三方 GIS 软件数据接口功能的 GIS 矢量图形系统,并已在生产 中得到了应用。 文献6提出了一种基于 MFC 的动态交互的矢量图形系统的快速开发方法, 设计实现的矢量图形系统已成功应用于测绘数据处理等专门问题的解决中。 文献7同样利用 VC+6.0,基于面向对象技术的软件工程思想开发实现了 一个用于煤矿安全分析可视化研究的矢量图形系统。 综上所述,从底层开发实现的 GIS 矢量图形系统以其较好的灵活性和可操 作性已经在很多领域得到了推广应用。 1.3 论文内容及结构安排 本文主要研究如何基于 VC+从底层开发实现一个能够满足信息平台需求 的矢量图形系统。主要对图形元素的组织和存储、图形对象的绘制、图形的操 作、图形与属性的双向查询、图层管理等方面进行研究,具体包括以下几个方 面的工作: 采用面向对象的方法完成矢量图形数据对象类的组织和存储,实现包括 圆形,直线,点,标注文本等图形元素的绘制; 能够实现鼠标交互绘图的功能; 研究矢量图形系统坐标系的建立及坐标转换关系,并在此基础上实现图 形的无级缩放、移动、全图显示等操作功能; 能够对图形进行选中、删除等功能。 论文的结构安排: 第一章是绪论,主要对课题的研究背景、矢量图形系统开发研究的现状进 行了探讨,并简要介绍了本文的研究内容; 第二章是对本系统的分析与设计,主要介绍系统的开发思路、开发模式的 选择、系统功能模块设计等内容; 第三章是矢量图形系统坐标系的设计。介绍和分析了 Windows 环境下的逻 辑坐标系和设备坐标系,在此基础上建立了系统的实际坐标系以及三种坐标之 间的转换关系; 第四章是实现图形系统的文档和视图,这一章主要是真对在系统实现过程 中所用到的一些文档与视图的管理; 第五章矢量图形系统的操作功能,这一章是论文的重点,主要对系统各功 山东凯文科技职业学院 山东凯文科技职业学院 2 能模块的实现技术、实现过程进行了详细的研究和阐述; 第六章主要是对全文进行的一个总结。 1.4 本章小结 本章主要是对 GIS 系统的研究背景、研究现状进行了简单的描述,从而体 现出选题的意义及其目的,在确定了系统需要的功能后,对整个系统的功能进 行了简单的描述,并对系统预期实现的功能进行了分析,最后列出了整篇论文 的基本构架。 山东凯文科技职业学院 山东凯文科技职业学院 3 第二章第二章 矢量图形系统的分析与设计矢量图形系统的分析与设计 2.1 开发思路 一个基本的矢量图形系统包含两个部分:矢量图形元素以及对图形元素的 各种操作。基于这两个组成部分,本文将从以下两方面组织确立系统的开发思 路。 开发工具的选择:从底层开发 GIS 矢量图形系统的首要问题是要选择合适 的可视化编程语言9。适用的有 Delphi,VC+等。目前比较流行的 GIS 专业软 件平台多是用 C+开发完成的。在 Windows 下 VC+是一个很好的底层开发工 具。VC+通过微软基础类 MFC(Microsoft Foundation Class)把 WIN32 API 封 装起来,使得在 MFC 基础上用 C+编写 Windows 平台下面的程序更为方便。 此外,VC+的 MFC 提供了很多与图形操作有关的类,使得 VC+结合 GDI 对 象可以简单的实现图形图像的显示。因此使用 VC+开发图形系统,具有开发 灵活、功能强等特点。最重要的一点是 MFC 在简化编程的同时,并没有限制 对系统的控制,设计出的程序也稳定、高效。所以两者的结合有利于矢量图形 系统的开发。因此,系统选用 Microsoft Visual C+ 6.0(简称 VC6.0)作为开发 平台,VC+作为程序设计语言。 2.2 开发模式 当前的软件开发模式有面向过程和面向对象两种。 1. 面向过程的方法 面向过程的方法也就是传统的结构化方法10,包括结构化系统分析、系统 设计及程序设计方法,是以系统中的数据及对数据进行处理的过程为研究中心 的。面向过程的方法构建一个系统的流程是:从需求出发,制定计划,编写代 码,测试代码,维护系统。 2. 面向对象的方法 面向对象的方法(Object-Oriented Paradigm,简称 O-O 方法)是目前软件开 发的主流方法11。面向对象的方法以对象为中心,对象是属性(数据)和操作 (处理数据的函数)的封装体。面向对象方法有如下三大特性12: 封装性:封装性(Encapsulation)是指对象将其属性的实现细节隐藏在内部, 外界只有通过函数才能对其访问和利用。因此保证了面向对象软件的可构造性 和易维护性; 继承性:继承性(Inheritance)是指下层对象能够拥有上层对象的特征(属 山东凯文科技职业学院 山东凯文科技职业学院 4 性和操作)的能力。继承性是面向对象方法中最重要的机制,可以通过继承机 制扩充和完善旧的程序设计以适应新的需求; 多态性:多态性(Polymorphism)是指发出同样的消息被不同类型的对象 接收时导致完全不同的行为。这里所说的消息主要是指对对象函数的调用,而 不同的行为是指不同的实现。多态性体现了对象行为的扩充能力,使程序的动 态链接方便易行。面向对象方法的这三大特性是相互关联的,封装性是基础, 继承性是关键,多态性是补充,而多态性又必须存在于继承的环境中。 3. 两种开发模式的比较 应用于不同领域的 GIS 系统,对矢量图形系统功能的要求是有差异的12。 用户的需求也可能是逐步提出的,如果考虑系统的所有功能,则在构建时会很 困难。而面向过程的方法在做需求分析、制定计划阶段都需要用户的参与,开 发人员对这些需求的理解也会存在差异,这就导致开发人员将不断地修改这些 面向过程的代码,陷入代码的泥潭。面向对象技术很好地解决了这种问题。在 需求分析阶段,如果用户对需求不十分清楚,正如在此系统中,那么开发人员 无须考虑将要构建的矢量图形系统会应用于哪一类实际应用,可以先从一般的 需求出发,构造实现这种需求的对象,把系统看做是一组相对独立的对象的集 合,规定其操作13,由多个对象抽象为类,由类构造派生类,由这些类派生出 实例,逐步构造系统。由于对象的数据与其操作(处理数据的函数)是封装的, 并通过函数与外部进行联系,这是一种自下向上的开发方法,在对某个对象修 改时只涉及该对象、该类的细节,不影响整个系统。这使建立一个基本图形系 统来满足不同图形应用系统开发的需要具有了可行性。将面向对象技术应用于 矢量图形系统的设计当中,可以根据应用系统本身的需求来实现功能,使软件 易于扩充。面向对象的方法在 GIS 中的应用,己经成为 GIS 发展的方向。这是 因为空间信息较之传统数据库处理的一维信息更为复杂、繁琐,面向对象的方 法为描述复杂的空间信息提供了一条直观、结构清晰、组织有序的方法。 基于以上分析,确定本系统的开发思路是:在 Windows 下选用 VC6.0 作为 开发平台,VC+作为程序设计语言,采用面向对象的软件开发模式,从底层开 发独立于其他任何专业 GIS 开发平台的软件产品。 2.3 功能分析 一个基本的 GIS 矢量图形系统,一般应具备如下基本功能10: 比较完善的图形元素。具备处理点、线、面等基本图形元素的能力; 比较完善的图形绘制功能,能够绘制图形系统的各种图形元素; 比较完善的图形操作功能。具备图形的放缩、漫游、全屏等功能; 图层管理功能。根据图形元素的属性不同,分图层进行管理; 山东凯文科技职业学院 山东凯文科技职业学院 5 具有颜色、线型、线宽、填充色等参数的设置功能; 图形对象的各种选取功能。根据需要选定图形对象,如点选、框选等。 但不同的行业对 GIS 矢量图形系统的需求是有差别的14。建立一个城市信 息管理系统,要求矢量图形系统具有丰富的图形元素、丰富的线型、巨大的存 储容量、完整的输入和输出、强大的地图编辑功能等;而建立一个地图查询系 统,则只需要地图显示和操作的基本功能。根据以上功能分析,本系统将以矢 量图形系统所应具备的基本功能为基础,从城市信息管理系统的需求出发进行 系统功能的设计。 2.4 功能模块设计 本系统对功能结构的设计采用的是完全面向对象的模块化方式, “模块化的 设计方式,使得系统能够易于维护和扩展。系统主要包含以下能模块:图形绘 制模块、图形操作模块、查询模块、矢量数据的输入及输出模块。下面分别对 各模块功能作简要说明。 1. 图形绘制模块 该模块主要实现对基本图形元素类(点、线、圆、圆形区域、标注文本等) 的绘制功能。 2. 图形操作模块 该模块要实现的主要操作功能有: 图形无级缩放:图形能够以任意比例尺放大缩小; 漫游:通过调整视图屏幕来显示图形的其他部分进行浏览; 全图显示:在视图屏幕中显示所有图形元素; 点选:通过鼠标点击选取当前视图屏幕中的图形元素并查询其属性数据。 2.5 本章小结 本章主要对系统开发的思路进行了简单的阐述,包括矢量图形系统的构成、 开发工具的选择等方面;开发模式的选择,包括对两种开发模式的简单介绍, 并对两种开发模式进行了比较,选出了适合本系统的开发模式,即面向对象开 发模式;阐述了组成本系统的几个模块,并对各个模块的功能进行了分析与介 绍。 山东凯文科技职业学院 山东凯文科技职业学院 6 第三章第三章 矢量图形系统的坐标转换矢量图形系统的坐标转换 3.1 Windows 环境下的坐标系 3.1.1 设备坐标 设备坐标是指在 Windows 环境下的各种输出设备所使用的坐标4,5。它所 对应的对象是具体的设备,如:键盘、显示器及打印机等。设备坐标是建立在 笛卡尔直角坐标系上的,以像素为单位。一个实际物理屏幕就是由像素组成的, 如平常所说的分辨率 1024*768 指的就是显示器屏幕的实际宽度和高度的像素数 目。由于不同的设备分辨率不同,相同坐标值的物理位置就可能不同。 3.1.2 逻辑坐标 逻辑坐标也是建立在笛卡尔坐标系上的,即是指 Windows 系统各种映射模 式下的坐标。Windows 系统为了方便程序开发,为我们提供了如表 3.1 所示的 8 种映像模式: 表 3.1 Windows 映像模式 映射模式映射识别码逻辑单元X 和 Y 轴正向 MM_TEXT1Pixel右下 MM_LOMETRIC20.1mm右上 MM_HIMETRIC30,01mm右上 MM_LONGLISH40.1inch右上 MM_HIENGLISH50.01inch右上 MM_TWIPS61/440inch右上 MM_ISOTROPIC7Variable变化的 MM_ANISOTROPIC8Variable变化的 其中 MM_TEXT 方式宇 DOS 文本方式很相似,MM_Text 方式允许应用程 序利用设备像素工作,而 DOS 是在字符状态下操作。在此模式下,窗口(屏幕) 的原点是在坐上角,X 的正方向为向右,Y 的正方向为向下。 而 MM_LOMETRIC、MM_LONGLISH、MM_HIENGLISH、MM_HIMETRIC 四 山东凯文科技职业学院 山东凯文科技职业学院 7 种映像方式默认的原点即是窗口的左上角,X 的正方向为向右,Y 的正方向为 向上。坐标用英尺(inch)或毫米(mm)表示,对于绘图程序来说很方便,不用进 行坐标转换。 MM_ISOTROPIC 与 MM_ANISOTROPIC 映像方式都是用笛卡尔坐标,且提供 可变的逻辑单位和可变的原点。在 MM_ISOTROPIC 方式下,X 轴和 Y 轴坐标 的刻度是相同的,而 MM_ANISOTROPIC 方式下 X 轴和 Y 轴坐标的刻度是可 以设置为不同的。 MM_TWRIPS 方式下,TWIPS 是对“一个点的 1/20”的缩写。一点等于 1/72 英尺。 3.2 设备坐标与逻辑坐标 3.2.1 设备坐标与逻辑坐标的关系 逻辑坐标不同于设备坐标,它不需要考虑具体的设备类型,其中面向的对 象是设备环境,在内存中建立的一种虚拟坐标系。虽然逻辑坐标的取值同设备 坐标一样都是整数,但是采用的坐标单位是不同的,而且坐标轴的方向也是随 着映射模式的改变而不同。在矢量图形系统中,应根据实际需要使用特定的逻 辑坐标系。 逻辑坐标和设备坐标一起为 Windows 提供了设备无关性,设备无关性指的 是只要设定了映射模式,不管是在何种输出设备上,一个图形显示出同样的效 果。但对于 MM_TEXT 映射模式来说,因为其坐标单位是像素,而一个像素所 占的实际长度随着设备的不同而不同,长度是不固定的,所以在不同的输出设 备上不能保证所显示图形的大小相同。 设备坐标系和逻辑坐标系均是由 Windows 系统定义的,因此统称为 Windows 坐标系3。Windows 下图形的绘制是在逻辑坐标系中进行的,用户在 各种绘图设备上的绘制操作使用的是逻辑坐标值,然后 Windows 再根据所设定 的映射模式,将逻辑坐标值转换成设备坐标值,最后将图形输出到实际的显示 设备或打印设备上。 3.2.1 设备坐标及逻辑坐标的转换 Windows 下的绘图是在逻辑坐标系中进行的,而任何图形的显示和输出都 必须在一定的设备上实现,因此,在图形系统的开发中,逻辑坐标到设备坐标 的转换常被大量用到。另外,当系统和用户之间进行交互时,系统需要知道用 户输入焦点的位置坐标,而这个坐标是设备坐标,必须将其转换为逻辑坐标后 才能进行识别和操作。 山东凯文科技职业学院 山东凯文科技职业学院 8 逻辑坐标与设备坐标转换之前,首先要对映射模式进行设置,也就是要确 立系统开发所采用的逻辑坐标系。在 MFC 中,不同的映射模式其对应的逻辑 坐标单位是不同的,设定了映射模式,就规定了逻辑单位的大小和增量的方式。 所以实现逻辑坐标与设备坐标转换的第一步就是确定系统所使用的映射模式14。 在 MFC 应用程序中可以通过调用 CDC 类的函数 SetMapMode(int nMapMode)来设置,其中参数 nMapMode 代表的即是表 1 中的映射模式识别码, 用来指定新的映射模式,可以取 Windows 八种映射模式中的任意一种。 本系统在视图类 CMapView 的 OnDraw 函数中设置映射模式如下: pDC-SetMapMode(MM_TEXT); 为了完成 Windows 各种映射模式下从逻辑坐标到设备坐标的转换,VC+提 供了两个转换功能函数: DPtoLP(LPPOINT lpPoints) /从设备坐标到逻辑坐标的转换 LPtoDP(LPPOINTlpPoints) /从逻辑坐标到设备坐标的转换 3.3 窗口与视口 窗口是虚拟存在的一个屏幕视口(也称视图)是设备坐标系(通常屏幕) 中定义的一个矩形区域,就是在屏幕上看到的视图客户区,即绘图的区域,用 来确定显示内容,窗口是图形的可见部分。窗口的坐标是逻辑坐标,与设备无 关5。 视口是与设备相关 的一个矩形区域,坐标单位是与设备相关的。视口决定 了窗口中的图形显示在屏幕上的位置和大小。窗口坐标的原点与视口坐标的原 点始终对应于同一点。 窗口和视口的划分与 Windows 下图形绘制的机制有关。Windows 下的绘图 并不是把图形直接绘制到设备屏幕上,而是先在 Windows 预先定义好的坐标系 统(映射模式)中选择一个作为绘图参考系,在此映射模式下将图形绘制到虚 拟的内存窗口中去。然后再将窗口中的图形映射到视口中。如果映射到屏幕上 就实现了图形的显示;如果映射到打印机等输出设备上就实现了图形的打印输 出。 窗口原点和视口原点指的是同一点分别在窗口坐标系和视口坐标系中的坐 标值,它们决定了图形由窗口映射到视口时的相对位置。 3.4 本章小结 要实现矢量图形的绘制、显示及无级缩放等功能,首先要确立和实现矢量 图形系统所采用的坐标系,坐标系是整个图形系统开发的基础。本系统建立了 山东凯文科技职业学院 山东凯文科技职业学院 9 自己的图形坐标系,称之为实际坐标系,来维护矢量数据的地理坐标,并实现 了实际坐标与 Windows 坐标逻辑坐标和设备坐标的相互转换。因此本章对 矢量图形系统坐标系的建立过程及其与 Windows 坐标系的相互关系进行了介绍, 并对设备坐标与实际坐标的转换方法进行了阐述,最后还简单的介绍了窗口与 视口及其他们之间的关系。 第四章第四章 实现矢量图形系统的文档和视图实现矢量图形系统的文档和视图 4.1 矢量图形系统的图形元素类 面向对象的程序设计,是目前程序设计的主流方法,在本设计中,将利用 面向对象的程序设计和 C+类的组织方法,组织建立一个基本矢量图形的图形 元素类。组织实现的矢量图形系统,能够处理点类、线类、面类等类别的图形 元素,其中点类图形元素有包括直线,圆,圆弧,标注文本等图形元素,针对 每类图形元素组织建立起对其进行管理的 C+类,并把每个图形元素作为一个 独立的对象来管理。 4.1.1 图形元素基类 对各类图形元素进行分析,可以发现各类图形元素具有一些相同的属性和 操作功能,如图形元素的颜色、线型线宽所在层等属性和得到一个图形元素是 否做了删除标志等操作。把这些图形元素中共性的东西(属性和操作) ,组织存 放在一个图形元素基类(CDraw)中,具体的图形元素由这个基类来派生。 4.1.2 直线类 直线类 Cline 是从 CDraw 派生而来,在直线类的构造函数中,共有包括 11 个参数,并利用前 7 个参数从 CDraw 派生而来,并在构造函数中对其余的四个 参数(直线的起点与终点)进行了初始化。用来标识直线类的特殊属性,也在 类中进行了定义。 4.1.3 连续直线或封闭多边形类 连续直线除了具有图形元素基类所具有的属性外,从图形的几何特征上, 山东凯文科技职业学院 山东凯文科技职业学院 10 连续直线是由很多顶点组成的,而且顶点数目是不确定的。一条连续直线可能 只有两个顶点,也可能有几千个顶点。所以,需要定义一个结构来存储连续直 线的一个顶点坐标。定义一个成员变量 m_Numble 用来记录点的个数,定义一 个 b_Fill 来标识是连续直线还是封闭多边形。 4.1.4 圆类 对圆类 CCircle 的创建方法与直线类 CLine 类似,圆除了具有图形元素的 基本特征外,还有自身的几何特性。在 CCircle 类中定义了 m_CircleX, m_CircleY, m_CircleR 用来记录圆心与圆的半径,并定义了 b_Fill 用来标识此图 形元素是圆还是圆形区域。 4.1.5 圆弧类 圆是圆弧的一个特例,当圆弧的弧度等于 2 时就是圆。所以可以从一个圆 类派生得到一个圆弧类。在圆弧类中定义了 m_Angle1,m_Angle2 用来表示圆 弧的起始弧度与终点的弧度。 4.1.6 标注文本类 矢量图形中可以有大量的标注文本,标注文本除了具有图形元素的基本特 性外,还具有位置、字体及标注内容等自身的信息。CText 类也有两个构造函 数,第二个构造参数有多个参数,并利用多个参数对类的成员变量进行初始化。 在构造函数中,调用了基类 CDraw 的构造函数对基类 CDraw 的成员变量进行 初始化。 4.1.7 图形参数类 在矢量图形系统中,图形参数是集中存储的。在图形元素基类中成员变量 m_ColorPen,m_ColorBrush 分别用来存储画笔的颜色与画刷的颜色序号, m_Layer 中存储的是在图层列表中的序列号。用 m_ColorList,m_LayerList 两 个数组来分别存储颜色和涂层,并在构造函数中进行初始化。 4.2 矢量图形系统的文档 4.2.1 面向对象的文档管理机制 管理矢量图形系统图形数据的方法即文档管理机制。在本设计的开发中, 采用一套完全面向对象的文档组织机制。这种机制就是通过图形元素类创建很 多图形元素对象,每个图形元素对象作为一个整体来组织存储空间的分配、存 取等各种管理功能。然后通过建立一种存储机制,来管理指向所有图形元素对 山东凯文科技职业学院 山东凯文科技职业学院 11 象的指针,达到管理所有图形元素对象的目的。这种文档管理机制具有组织简 单结构化和移植性好,以及比较容易利用 VC+程序设计语言的开发功能等优 点。缺点是需要较大的内存空间。 4.2.2 创建图形元素对象指针 管理一个矢量图形系统文档的思路是:每个图形元素是图形元素类创建的 一个对象,在创建这个对象时得到指向这个对象的指针,建立一个对象指针数 组来管理这些指针,以达到管理所有图形元素对象的目的。 在 VC+下可以较容易地实现对指向图形元素对象的指针的组织和管理。在 MFC 中有一个类模板 CTypedPtrArray,可以用它来创建一个管理类指针的对象。 例如,可以定义一个管理 CLine 类指针的对象如下: CTypedPtrArraym_LineArray; 4.2.3 矢量图形系统的文档 在应用程序 Draw 中,可以派生几个 CObArray 对象来分别管理基类图形元 素。在文档类 CDrawDoc 中创建用来管理各类图形元素的对象指针,创建的 CObArray 对象如下: private: CTypedPtrArraym_LineArray;/管理直线对象指 针的对象 CTypedPtrArraym_PLineArray;/管理连续直线对 象指针对象 CTypedPtrArraym_CircleArray;/管理圆对象指针 的对象 CTypedPtrArraym_ArcArray;/管理圆弧对象指 针的对象 CTypedPtrArraym_TextArray;/管理文字对象指 针的对象 4.2.4 实现文档的管理功能 增加图形元素。在应用程序 Draw 中增加一个图形元素对象(如一条直 线)时,需要进行以下两个步骤的操作:首先需要创建一个图形元素对象,并 用图形元素的实际数据初始化这个图形元素对象。如增加一条直线时,需要创 建一个 CLine 对象,并用这条直线的实际数据(起终点、所在图层、颜色等) 初始化这个 CLine 对象的成员变量。然后需要把指向新创建的图形元素对象的 山东凯文科技职业学院 山东凯文科技职业学院 12 指针,增加到文档类中管理图形元素对象指针的对象中。如增加一条 CLine 对 象后,需要把指向这个 CLine 对象的指针增加到文档类的 m_LineArray 对象中。 为了实现增加各类图形元素的功能,在文档类 CDrawDoc 中定义几个函数, 分别来完成增加各类图形元素的操作功能 CLine* AddLine(short ColorPen,short ColorBrush,float LineWide,short LineType,short Layer,int id_only,float X1,float Y1,float X2,float Y2); CCircle* AddCircle(short ColorPen,short ColorBrush,float LineWide,short LineType,short Layer,int id_only,float CircleX,float CircleY,float CircleR,BOOL bFill); CArc* AddArc(short ColorPen,short ColorBrush,float LineWide,short LineType,short Layer,int id_only,float CircleX,float CircleY,float CircleR,float Angle1,float Angle2); CText* AddText(short ColorPen,short ColorBrush,float LineWide,short LineType,short Layer,int id_only,float StartX,float StartY,float Angle1,float Angle2,float TextHeight,float TextWide,float OffWide,unsigned char TextFont,int TextLong,CString Text); CTag* AddTag(short ColorPen,int Layer,float xInsert,float yInsert,float xScale,float yScale,float angle,int only_id,int idBlock); CPline* AddPLine(short ColorPen,short ColorBrush,float LineWide,short LineType,short Layer,int id_only,int Numble,PointStruct *PointList); 这 6 个函数分别用来实现增加一条直线、一个圆、一个圆弧、一个标注文 本、一条连续直线或一个多边形区域的功能。函数返回指向新增图形元素对象 的指针。 实现对图形元素的操作。为了实现对图形元素的操作,为此,在文档类 CDrawDoc 中定义一些 Public 成员函数,并在实现文件 drawdoc.cpp 中,加入 函数的具体实现代码。函数具体定义如下: CDraw* GetGraph(short Lb, int index ); / 得到指向图形元素对象的指针 Void DeleteGraph(short Lb, int index); / 删除图形元素对象 Int GetGraphNumb(short Lb); / 各类图形元素的数目 Int GetGraphUpperBound(short Lb);/存储各类图形元素 CObArray 对象数组 的最大下标 Int GetGraphIndex(short Lb,int ID);/ 某个识别号的图形元素对象指针在 CObArray 数组中的存放位置 山东凯文科技职业学院 山东凯文科技职业学院 13 4.3 矢量图形系统的视图 4.3.1 建立坐标系 建立坐标系 该坐标系取屏幕的左下角点作为图形屏幕的基点。客户区的左下角的坐标 定义为(m_xStart, m_yStart), 并确定一个变量 blc 作为逻辑坐标和实际坐标 的比例关系。 实际坐标与逻辑坐标的转换 为了实现实际坐标与逻辑坐标的转换,在视图类 CDrawDoc 中定义如下的 四个转换函数: Public: Void DPtoVP(float x, float y, int *X,int *Y); Void VPtoDP(int x, int y, float *X, float *Y); Int DLtoVL(float l); Float VLtoDL( int l); 函数 VPtoDP 用来将逻辑坐标转换成实际坐标,参数(x,y)是一个点的逻辑 坐标,参数(*X ,*Y)返回转换后的实际坐标值。 函数 DLtoVL 用来将实际坐标长度转换成逻辑坐标长度,参数 l 是一个实 际坐标长度,函数返回逻辑坐标表示的长度值。 四个转换函数中用到的成员变量,在视图类 CDrawView 中定义: Privated: Float m_xStart, m_yStart, blc; Int m_wScreen, m_hScreen; 为了在应用程序 Draw 的其他类中能够使用四个坐标转换函数,可以将四 个转换函数定义成四个全局函数来实现转换操作功能,在实现文件 drawview.cpp 中,定义四个全局函数。且四个全局函数利用视图类指针 p_View 调用视图类的四个坐标转换函数,来完成坐标和长度的转换功能,p_View 指向 当前激活的视图对象。如果在某个实现文件中使用这四个全局转换函数,只需 在这个实现文件中的开始处加入全局函数的外部引用。 4.3.2 实现各类图形元素的绘制功能 利用虚函数实现各种图形元素的绘制功能。在图形元素基类 CDraw 中,抽 象定义一个进行绘制操作的虚函数。因为在应用程序 Draw 中,不用 CDraw 类 直接来创建对象,所以可以将虚函数定义成纯虚函数: Virtual void Draw(CDC* pDC,int m_DrawMode,int m_DrawModel,short 山东凯文科技职业学院 山东凯文科技职业学院 14 BackColor)=0; 在各种图形元素类 CLine CCircle CArc CText CTag CPline CPlineRgn CLinkNet 中,重载虚函数 Draw : virtual void Draw(CDC* pDC , int m_DrawMode, int m_DrawModel ,short BackColor); 4.3.3 实现视图的绘制 为了实现应用程序 Draw 的图形绘制工作,在文档类 CDrawDoc 中定义 Draw 函数如下: void Draw(CDC* pDC, int m_DrawMode, int m_DrawModel ,short BackColor); 4.4 鼠标交互绘图 4.4.1 要解决的主要问题 捕获鼠标操作消息 VC+提供了足够的窗口消息和已经保护的消息处理函数解决这个问题.在应 用程序 Draw 中实现鼠标交互绘制图形元素时,将主要用到以下三个鼠标操作: OnMouseMove(UINT nFlags ,CPoint point) WM_MOUSEMOVE /鼠标移动 OnRButtonDown(UINT nFlags.CPoint point) WM_RBUTTONDOWN /按下右键 OnLButtonDown(UINT nFlags.CPoint point) WM_LBUTTONDOWN /按下左键 捕捉所有的鼠标输入 在用鼠标交互绘制一个图形元素时,在已经开始绘图的情况下,不希望还 能进行别的操作,以避免造成系统流程和变量初始化等方面的错误.VC+提供 了两个成员函数来满足以上的功能需求: CWnd:SetCapture(); CWnd:ReleaseCapture(); 在屏幕上拖动图形 在用鼠标交互绘制图形元素时,为了直观的看到所绘制的图形,一般采用 拖动图形的方法; 保存图形数据到文档 用鼠标在屏幕上交互绘制的图形元素,要创建一个图形元素对象并将指向 山东凯文科技职业学院 山东凯文科技职业学院 15 这个图形元素对象的指针保存起来; 将图形以实际的形态重画 用鼠标交互绘制一个图形元素后,要在屏幕上马上显示出这个图形元素的 实际形态,必须将图形元素以实际的形态重画。在矢量图形系统设计中,一般 采用 CClientDC 对象,在交互绘制图形元素操作完成后,即时在视图中重画这 个新增的图形元素。 4.4.2 交互绘制各类图形元素 本设计主要实现交互绘制直线、圆、填充圆、圆弧、标注文本、连续直线、 多边形区域的实现过程. 增加菜单资源. 在应用程序 Draw 的菜单资源中,增加一个菜单”鼠标绘图” ,.在这个菜单 中包含直线、圆、填充圆、圆弧、标注文本、连续直线及多边形区域菜单项。 加入的菜单如图 4-1 所示: 图 4-1 鼠标绘图菜单 为每个操作添加消息处理函数 选中其中的一个菜单项,单击鼠标右键,选择“建立类向导” ,在 Class name 中选择 CDrawView,在 Messages 中选择 COMMAND,点击 Add Function,即可为菜单先增加一个响应函数。点击 Edit 即可在实现文件 drawview.cpp 中增加消息处理函数的实现代码. 操作界面如图 4-2 所示: 图 4-2 MFC ClassWisard 获得图形元素的唯一识别号: 山东凯文科技职业学院 山东凯文科技职业学院 16 在一个矢量图形系统中,对于任何一个图形元素,必须有一个能够与其他 图形元素区分开来的属性,因此,在此系统中,在 Draw 类中为每类图形元素 创建一个惟一识别号变量 m_id_only.为了得到每类图形元素的识别号,在 CDrawDoc 中定义一个成员函数 GetGraphID 来实现。具体函数定义如下: int GetGraphID(short Lb). 其中参数 Lb 用来表示图形类别,具体的实
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论