一种矢量图形工具的设计与实现计算机毕业设计论文

上传人:痛*** 文档编号:68135083 上传时间:2022-04-01 格式:DOC 页数:35 大小:281KB
收藏 版权申诉 举报 下载
一种矢量图形工具的设计与实现计算机毕业设计论文_第1页
第1页 / 共35页
一种矢量图形工具的设计与实现计算机毕业设计论文_第2页
第2页 / 共35页
一种矢量图形工具的设计与实现计算机毕业设计论文_第3页
第3页 / 共35页
资源描述:

《一种矢量图形工具的设计与实现计算机毕业设计论文》由会员分享,可在线阅读,更多相关《一种矢量图形工具的设计与实现计算机毕业设计论文(35页珍藏版)》请在装配图网上搜索。

1、毕业设计(论文)一种矢量图形工具的设计与实现论文作者姓名:申请学位专业:申请学位类别:指导教师姓名(职称):论文提交日期:一种矢量图形工具的设计与实现摘 要矢量图形系统的开发是利用VC+开发地理信息系统(GIS系统)的重点和难点。利用VC+进行矢量图形系统的开发主要是利用VC+的设备环境DC提供的功能进行图形绘制和采用面向对象的方法来组织和管理矢量图形数据。该论文分析了矢量图形系统的基本结构,采用了面向对象的思想,设计了图形对象的类继承层次,其中基类对象又派生出直线、圆弧(圆)和曲线,文本等类,给出了矢量图形系统类的组织结构。并且从整体功能结构到单独的类的具体实现和视图的实现,鼠标交互绘制,图

2、形操作,图形选中、移动、删除等各个方面开发实现了一个基本的矢量图形工具系统。完成了处理点、线、圆、面、标注文本等图形元素的功能,并具有处理图例(即图形块)的能力;具有相对完善的图形操作功能,方便的图形I/O功能,以及图形移动、删除的功能。关键词:面向对象;图形操作;I/O;The Design and Realization of a Vector Graphics ToolAbstractThe Vector Graphics system is one of the most important and difficult parts for GIS(Geographical Inform

3、ation System) development with VC+. The Vector Graphics system mainly includes implementing different drawing functions under the environment provided by VC + + 6.0, organizing and managing vector-based graphic data by means of object-based methods.The idea of object-oriented is introduced in this p

4、aper, the geographic elements in the system are classified into line, arc(circle) ,curve and text. The basic classes framework is proposed by analyzing the basic structure of the vector graphics system. A basic vector graphics tool system is designed and realized from the kind of organization, the v

5、iews realization, the mouses alternately draws up, the graphics operation, the graph selected, migration, deletion, and so on. Different drawing functions are implemented, including spot, line, circle, surface and note text. The system has the ability of processing chart of symbols (namely graph blo

6、ck). The realizations of relative consummation graphics operation function and facilitates graph I/O function is given, as well as graph migration, deletion function.Key words : Object-oriented; Graph operation; I/O;目 录论文总页数:25页1引言11.1课题背景及研究的目的和意义11.2矢量图形系统11.3课题研究方法12总体设计思想22.1整体功能模块的设计22.2功能模块说明2

7、3矢量图形结构33.1基类的组织33.2视图的实现53.2.1实际坐标与逻辑坐标的转换53.2.2图形元素的绘制功能63.3图形操作方面63.3.1屏幕状态的记录63.3.2边界矩形73.3.3点选的判断和特殊显示73.3.4图形的移动93.4提高图形重画速度94矢量图形工具系统的设计104.1类的实现104.2鼠标交互绘制134.3重画技术134.3.1图形重画134.3.2重画上屏、首屏和显示全图154.4图形移动和选中后操作174.4.1图形点选功能174.4.2图形移动205系统测试21结 论22参考文献23致 谢24声 明251 引言1.1 课题背景及研究的目的和意义GIS技术已经成

8、为IT的重要组成部分。利用GIS技术开发的以多媒体,网络化,自动化为特色的信息处理,信息管理,指挥调度和决策支撑系统,已经在各领域发挥着重大作用。GIS将普通管理信息系统(MIS)与矢量图形系统结合在了一起,克服了普通MIS的局限性,大大提高了系统的直观性和可操作性,同时提供了普通MIS所不能解决的功能,如空间信息统计,空间信息计算,网络分析等。矢量图形系统是GIS的重要组成部分,也是开发GIS时的重点所在。在不同领域应用GIS,其需要的矢量图形系统的功能是有差别的。建立一个城市信息管理GIS时,要求矢量图形系统要有丰富的图形元素,丰富的线形,巨大的存储容量,完善的输入和输出功能,强大的地图编

9、辑功能,甚至需要三维显示和处理能力;而有些管理型GIS所需要的矢量图形系统,可能只需要具有简单地处理二维普通图形元素的功能。1.2 矢量图形系统一个基本的矢量图形系统一般需要如下的功能:1. 相对完善的图形元素,应具备处理点,线,面,网络等图形元素的能力,这类图形系统在很大程度上能够满足普通的管理型GIS的矢量图形系统的要求。提高矢量显示图形的功能在很大程度上能够改善矢量图形界面的质量。2. 相对完善的图形操作功能。应具备图形的放缩,移动等各种操作功能。3. 相对完善的图形输入和输出功能。应具备鼠标交互绘制功能,图形数据交互输入等功能;4. 定制和使用线形;5. 具有子图填充功能;6. 具有图

10、层,颜色,线形等的设置功能;7. 具有较大的存储容量。处理图形元素的容量应该能够达到一般实用要求。1.3 课题研究方法面向对象的程序设计,是目前程序设计的主流方法,在本设计中,将利用面向对象的程序设计和C+类的组织方法,组织建立一个基本矢量图形的图形元素类。组织实现的矢量图形系统,能够处理点类、线类、面类、网络点等类别的图形元素,其中点类图形元素有包括直线,圆,圆弧,多边形,标注文本等图形元素,针对每类图形元素组织建立起对其进行管理的C+类,并把每个图形元素作为一个独立的对象来管理。本系统的开发要求采用VC开发平台,实现一个用于GIS的基本矢量图形系统。因此,本次毕业设计在MFC AppWiz

11、ard 产生的应用程序Draw的基础上,具体组织一个基本矢量图形系统的开发。该过程涉及与矢量图形系统设计有关的类及其主要操作。从矢量图形系统的类组织,文档管理,视图组织,图形交互绘制,图形操作,图形选中,图形旋转,图形移动,图形删除等各个方面。2 总体设计思想2.1 整体功能模块的设计矢量图形工具需要实现的基本功能包括文件的打开保存、图形的编辑、基本图形元素的绘制、图形的选择和重画,本课题设计的矢量图形工具系统的功能图如图1。图1 系统功能图2.2 功能模块说明 文件菜单菜单下拉选项有新建、打开、保存三个基本功能,可以新建新的客户区、打开已经存在的文件、保存希望保留的图形。 编辑菜单下拉菜单里

12、面的撤消选项可以撤消上一步的操作,同时选中图形后可以进行复制和粘贴的操作。 鼠标绘制利用鼠标交互的功能把直线、圆、填充圆、圆弧、连续直线、多边形区域和标注文本的操作直观化,只要选中你想要的操作就可以在窗口进行相应的绘制。 选中操作基本的矢量图形系统应该具有鼠标点选图形的功能,选中图形后可以进行简单的拖动、删除等基本功能。同样的,可以选中也就可以放弃选中。被选中的图形,会以特殊的方式显示出来。 图形操作图形绘制过程中用来解决重画、放大、摆动、显示全屏的操作,这在图形工具的系统中是很重要的。3 矢量图形结构3.1 基类的组织对各类图形元素进行分析,可以发现各类图形元素具有一些相同的属性和操作功能,

13、如图形元素的颜色、线型线宽所在层等属性和得到一个图形元素是否做了删除标志等操作。把这些图形元素中共性的东西(属性和操作),组织存放在一个图形元素基类(CDraw)中,具体的图形元素由这个基类来派生。如图2。图2 基类的继承class CDraw:public CObject /图形元素基类CDraw,由CObject类派生protected:short m_ColorPen; /笔色short m_ColorBrush; /填充颜色float m_LineWide; /线宽short m_LineType; /线型float m_xScale; /线型横向参数short m_Layer; /所

14、处图层int m_id_only; /图形元素唯一标识号BOOL b_Delete; /是否处于删除状态public:CDraw();CDraw (short ColorPen,short ColorBrush,float LineWide,short LineType,float xScale,short Layer,int id_only,BOOL Delete)virtual CDraw();1) 点类图形元素组织点类图形元素,其基本特性是各个图形相互独立,且每个图形元素具有有限个固定的特征点。直线的基类是CDraw,在直线类的构造函数中,共有包括11个参数,并利用前7个参数调用基类CD

15、raw的构造函数,对基类的成员变量进行初始化,而在本身的构造函数中对直线类CLine自身的四个参数(直线的起点和终点)进行了初始化。对圆类的创建方法与直线类CLine类似,圆除了具有图形元素的基本特征外,还有自身的几何特性,可以用圆心和半径作为特征参数表示圆的几何特性。圆是圆弧的一个特例,当圆弧的弧度等于2时就是圆。所以可以从一个圆类派生得到一个圆弧类。矢量图形中可以有大量的标注文本,标注文本除了具有图形元素的基本特性外,还具有位置、字体及标注内容等自身的信息。CText类也有两个构造函数,第二个构造参数有多个参数,并利用多个参数对类的成员变量进行初始化。在构造函数中,调用了基类CDraw的构

16、造函数对基类CDraw的成员变量进行初始化。2) 线类图形元素组织线类图形元素包括很多种,如连续直线、混合线、树状线等,在本设计中,以最简单的连续直线为例进行讨论,对于其他类型线的实现方法,可根据连续直线的实现方法来开发。连续直线除了具有图形元素基类所具有的属性外,从图形的几何特征上,连续直线是由很多顶点组成的,而且顶点数目是不确定的。一条连续直线可能只有两个顶点,也可能有几千个顶点。所以,需要定义一个结构来存储连续直线的一个顶点坐标。3) 面类图形元素的组织面类图形元素一般是由闭合线围成的区域。根据围成面的边界不同,有不同形式的面,如圆形区域、椭圆形区域、复合线区域、多边形区域等。最常用的面

17、是多边形区域,其边界由一条连续直线组成。因为另外各种类型面的边界一般都可以用连续直线来近似描述,所以,本设计只讨论多边形区域的实现方法。在描述多边形区域时,最主要的是要描述边界顶点坐标。描述面的边界顶点坐标时,有不同的描述方法,一种方法是将边界由几段连续直线来描述。另外一种描述方法是直接存储区域的边界顶点坐标,即把区域的整个边界作为一条连续直线来存储。这种方法的缺点是造成坐标的重复存储;优点是具有较强的独立性,不用考虑组成区域的连续直线段。在本设计中,采用直接存储边界坐标的方式。用这种方式组织多边形区域时,组织方式与连续直线类似。所以,可以由连续直线类CPline派生出一个CPlineRgn类

18、,来对多边形区域进行管理。3.2 视图的实现3.2.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

19、);函数VPtoDP 用来将逻辑坐标转换成实际坐标,参数(x,y)是一个点的逻辑坐标,参数(*X ,*Y)返回转换后的实际坐标值。函数DLtoVL用来将实际坐标长度转换成逻辑坐标长度,参数l是一个实际坐标长度,函数返回逻辑坐标表示的长度值。为了在应用程序Draw的其他类中能够使用四个坐标转换函数,可以定义四个全局函数来实现转换操作功能,在实现文件drawview.cpp中,定义四个全局函数如下:Void DPtoVP(float x, float y, int *X, int *Y);Void VPtoDP(int x, int y, float *X, float *Y );Int DLto

20、VL(float l);Int VLtoDL(int l);如果在某个实现文件中使用这四个全局转换函数,只需在这个实现文件中的开始处加入全局函数的外部引用:Extern Void DPtoVP (float x, float y, int *X, int *Y);Extern Void VPtoDP (int x, int y, float *X, float *Y);Extern Int DLtoVL (float l);Extern Int VLtoDL (int l);3.2.2 图形元素的绘制功能利用虚函数实现各种图形元素的绘制功能。在图形元素基类CDraw中,抽象定义一个进行绘制操作

21、的虚函数。因为在应用程序 Draw中,不用CDraw类直接来创建对象,所以可以将虚函数定义成纯虚函数:Public:Virtual void Draw(CDC* pDC,int m_DrawMode,int m_DrawModel,short BackColor)=0;在各种图形元素类Cline、CCircle、CArc、CText、CPline、CPlineRgn中,重载虚函数Draw:public:virtual void Draw(CDC* pDC , int m_DrawMode, int m_DrawModel ,short BackColor);3.3 图形操作方面3.3.1 屏幕

22、状态的记录对图形屏幕进行分析就会发现,一个图形屏幕是由三个参数来确定的:屏幕左下角原点的实际横纵坐标m_xStart、m_yStart和显示比例blc,只要记录下这三个参数,就可以记录下这一屏幕的状态。为了实现记录屏幕状态的功能,在文档类CDrawDoc中定义一个结构数组来存储历史图形屏幕。在CDrawDoc类中定义以下两个变量:Public:int m_CurrentScreen; /当前屏幕的序号int m_MaxScreen; /最多能存储的屏幕数ScreenStruct* m_Screen; /记录屏幕参数的结构数组Typedef structFloat blc; /显示比例Float

23、 sx; /屏幕左下角横坐标Float sy; /屏幕左下角纵坐标ScreenStruct;在文档类CDrawDoc中定义一个函数,来完成存储一个图形屏幕状态的操作功能:Public:Void AddScreen(float StartX, float StartY, float blc);3.3.2 边界矩形通过得到每一类图形元素(如直线、连续直线)的边界矩形,然后根据视图屏幕的大小(逻辑坐标)进行计算,得到屏幕的参数m_xStart,m_yStart,blc,从而实现显示全图的功能。在图形元素的基类CDraw中定义一个虚函数:Public:Virtual void GetRect(floa

24、t *minx,float *minY,float *maxX,float *maxY)=0;函数GetRect用来计算图形元素的边界矩形,(*minX ,*minY)和(*maxX ,*maxY )这四个指针参数用来返回边界矩形的最小和最大坐标。在由CDraw类派生的各个图形元素类中重载虚函数GetRect,即在各个类中加入以下定义代码:Public:Virtual void GetRect(float *minx,float *minY,float *maxX,float *maxY);3.3.3 点选的判断和特殊显示点选图形元素时,问题的关键在于如何判断一个点是否在一个图形元素上,也就是

25、要确定每一类图形元素的选中区域。1) 有效距离确定有效距离的方法是:首先确定在视图屏幕上有效距离的大小(如n个像素),也就是说,不管在什么比例的情况下,选中的图形元素都以在屏幕上与要选图形元素的距离小于n个像素为标准。用像素为单位进行计算时不方便,于是就求出n个像素在当时显示比例下的实际距离,这个实际距离就是点选图形元素时的有效距离。只要鼠标按中点到某图形元素的实际距离小于这个有效距离,就算选中了这个图形。有效距离的大小为:n*blc。/即n个像素的实际长度2) 各图形元素选中的判断 直线和连续直线因为直线是没有宽度的,所以,直线的点选判断实际上是要判断一个点与一条直线的距离是否在一定的距离范

26、围之内。问题的实质就是,如何确定这个判断选中的距离范围和怎样计算一个点与一条直线的距离。为了完成计算点到直线距离的功能,定义了一个函数PointLine在图形元素基类CDraw中,使之在直线和连续直线类中都可以用到:Public:float PointLine(float xx,float yy,float x1,float y1,float x2,float y2); 圆和填充圆圆的选中区域非常简单,如果有效距离为j1,计算得到的鼠标按中点到圆心的距离为jl1,选中区域就是:|jl1-circle.r|jl;即按中点到圆的距离小于jl。对于填充圆,选中区域则是:jl1=jl; 圆弧圆弧的选中

27、区域同圆类似,首先要确定按中点是否在圆弧所在的圆上。即按中点到圆心的距离jl1符合:|jl1-circle.r|Draw(pDC,0,0,m_bColor);m_MapMode=pDC-SetMapMode(1);这样在以当前的屏幕参数(m_xStart ,m_yStart ,blc)绘制图形前,把视图屏幕的左下角和右上角的实际坐标计算出来。4 矢量图形工具系统的设计4.1 类的实现1) 面向对象的文档组织机制管理矢量图形系统图形数据的方法即文档管理机制。在本设计的开发中,采用一套完全面向对象的文档组织机制。这种机制就是通过图形元素类创建很多图形元素对象,每个图形元素对象作为一个整体来组织存储

28、空间的分配、存取等各种管理功能。然后通过建立一种存储机制,来管理指向所有图形元素对象的指针,达到管理所有图形元素对象的目的。这种文档管理机制具有组织简单、结构化和移植性好,以及比较容易利用VC+程序设计语言的开发功能等优点。缺点是需要较大的内存空间。管理一个矢量图形系统文档的思路是:每个图形元素是图形元素类创建的一个对象,在创建这个对象时得到指向这个对象的指针,建立一个对象指针数组来管理这些指针,以达到管理所有图形元素对象的目的。在VC+下可以较容易地实现对指向图形元素对象的指针的组织和管理。在MFC中有一个类模班CTypedPtrArray,可以用它来创建一个管理类指针的对象。例如,可以定义

29、一个管理CLine类指针的对象如下:CTypedPtrArraym_LineArray;其他各图形类的管理类指针对象和Cline类指针的对象类似:CTypedPtrArraym_CircleArray;CTypedPtrArraym_ArcArray;CTypedPtrArraym_TextArray;CTypedPtrArraym_PLineArray;CTypedPtrArraym_PLineRgnArray;2) 增加图形元素在应用程序Draw中增加一个图形元素对象(如一条直线)时,需要进行以下两个步骤的操作:创建一个图形元素对象,并用图形元素的实际数据初始化这个图形元素对象。如增加一条

30、直线时,需要创建一个CLine对象,并用这条直线的实际数据(起终点、所在图层、颜色等)初始化这个CLine对象的成员变量。把指向新创建的图形元素对象的指针,增加到文档类中管理图形元素对象指针的对象中。如增加一条CLine对象后,需要把指向这个CLine对象的指针增加到文档类的m_LineArray对象中。为了实现增加各类图形元素的功能,在文档类CDrawDoc 中定义几个函数,分别来完成增加各类图形元素的操作功能CLine* AddLine(short ColorPen,short ColorBrush,float LineWide,short LineType,short Layer,int

31、 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_o

32、nly,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 T

33、extLong,CString Text);CPline* AddPLine(short ColorPen,short ColorBrush,float LineWide,short LineType,short Layer,int id_only,int Numble,PointStruct *PointList);CPlineRgn* AddPLineRgn(short ColorPen,short ColorBrush,float LineWide,short LineType,short Layer,int id_only,int Numble,PointStruct *PointLi

34、st,BOOL bTransparent,BOOL bFill);这6个函数分别用来实现增加一条直线、一个圆、一个圆弧、一个标注文本、一条连续直线和一个多边形区域的功能。函数返回指向新增图形元素对象的指针。3) 得到指向图形元素对象的指针在一个矢量图形系统中,有大量的图形元素,指向图形元素对象的指针被保存在文档类对应的CObArray 对象中。在系统的操作过程中,为了实现对图形元素的各种操作功能,需要得到指向指定图形元素对象的指针,为此,在文档类CDrawDoc 中定义一个函数GetGraph如下:Public:CDraw* GetGraph(short Lb, int index );在实现

35、文件drawdoc.cpp中,加入函数的具体实现代码。4) 删除图形元素对象为了能够从CObArray 对象中删除一个指定图形元素对象指针,在文档类CDrawDoc中定义一个成员函数:Public:Void DeleteGraph(short Lb, int index);在实现文件drawdoc.cpp中,加入函数的具体实现代码。5) 得到各类图形元素的数目为了能够随时得到文档中各类图形元素对象的数目,在文档类CDrawDoc中,定义一个成员函数如下:Public:Int GetGraphNumb(short Lb);在实现文件drawdoc.cpp中,加入函数的具体实现代码。6) 得到存储

36、各类图形元素CObArray 对象数组的最大下标在对各个图形元素类的所有图形元素进行操作时,需要得到存储在各个CObArray对象中的最大数组下标,然后对各个数组项实现遍历操作。为了得到存储在各个CObArray 对象中的最大数组下标,在文档类CDrawDoc中定义一个函数如下:Public:Int GetGraphUpperBound(short Lb);在实现文件drawdoc.cpp中,加入函数的具体实现代码。7) 得到某个识别号的图形元素对象指针在CObArray 数组中的存放位置Public:Int GetGraphIndex(short Lb,int ID);在实现文件drawdo

37、c.cpp中,加入函数的具体实现代码。8) 得到图形元素的唯一识别号在应用程序Draw中,采用同类图形元素具有惟一识别号的方法,即每一类别的图形元素具有不同的成员变量m_id_only。为了得到每类图形元素的惟一识别号,在文档类CDrawDoc中定义一个成员函数:public:int GetGraphID(short Lb);函数GetGraphID用来得到要增加的各类图形元素的惟一识别号,参数Lb用来表示图形类别。在实现文件drawdoc.cpp中,加入函数的实现代码。4.2 鼠标交互绘制VC+提供了足够的窗口消息和已经保护的消息处理函数解决这个问题。在应用程序Draw中实现鼠标交互绘制图形

38、元素时,将主要用到以下三个鼠标操作:鼠标移动:OnMouseMove(UINT nFlags ,CPoint point) WM_MOUSEMOVE按下左键: OnLButtonDown(UINT nFlags.CPoint point) WM_LBUTTOND按下右键:OnRButtonDown(UINT nFlags.CPoint point) WM_RBUTTONDOWN在用鼠标交互绘制一个图形元素时,在已经开始绘图的情况下,不希望还能进行别的操作,以避免造成系统流程和变量初始化等方面的错误。VC+提供了两个成员函数来满足以上的功能需求:CWnd:SetCapture(); /捕捉所有的

39、鼠标输入CWnd:ReleaseCapture(); /释放鼠标捕捉在用鼠标交互绘制图形元素时,为了直观的看到所绘制的图形,一般采用拖动图形的方法。用鼠标交互绘制一个图形元素后,要在屏幕上马上显示出这个图形元素的实际形态,必须将图形元素以实际的形态重画。因为在VC+的R2_NOT绘制模式下,线条不是彩色的,拖动的图形都不是用图形元素的实际颜色。必须对图形元素以实际形态进行重画。在矢量图形系统设计中,一般采用CClientDC对象,在交互绘制图形元素操作完成后,即时在视图中重画这个新增的图形元素。4.3 重画技术4.3.1 图形重画在很多情况下,需要将当前视图屏幕全屏重画。所谓图形重画,就是把当

40、前视图屏幕重新绘制一次,实际上也就是让视图类的函数OnDraw(CDC* pDC)重新执行一次。根据需要重画的区域的不同,图形重画可以分为全屏重画和局部重画。1. 全屏重画全屏重画有两种方式:在视图类函数的实现代码中,用以下代码来激活重画机制:CDrawDoc* pDoc=GetDocument();pDoc-UpdateAllViews(this);函数UpdateAllViews使属于当前文档对象的所有视图重画。如果应用程序采用的是单文档结构,系统只有一个视图,执行此命令时使这个视图失效并重画,即激发视图类的OnDraw执行;如果应用程序采用的是多文档结构,一个文档对象可能具有多个视图,U

41、pdateAllViews可使属于这个文档对象的所有视图都重新绘制。在视图类函数的实现代码中,用以下代码激活重画机制:Invalidate();Invalidate函数使当前视图屏幕的客户区失效,从而激活图形重画。Invalidate函数与UpdateAllViews函数的不同点是,它只能使当前视图重画,而与其同文档的其他视图并不重画。要实现图形重画功能,需要对视图类CDrawView的OnGraphRedraw函数进行修改。修改后的代码如下:Void CDrawView:OnGraphRedraw()CDrawDoc* pDoc=GetDocument();pDoc-UpdateAllVie

42、ws(this);Invalidate();OnGraphRedraw函数首先得到指向当前文档对象的指针,然后调用UpdateAllViews函数重画此文档对象所有的视图,参数this是指向当前视图对象的指针。2. 局部重画在很多情况下,往往只希望将当前视图屏幕的一部分区域进行重画,即局部重画。在VC+中,以下两个函数可以完成此功能。1) InvalidateRect函数的定义为:Void InvalidateRect(LPCRECT lpRect ,BOOL bErase=TRUE);函数InvalidateRect 可使视图中一个指定的矩形区域重画。这个函数的调用方法与函数Invalida

43、te 类似。参数lpRect 中存储着视图中需要重画的区域,参数bErase用于指定当区域重画时,背景是否擦除,当bErase为TRUE时,背景被擦除,当bErase为FALSE,背景保持不变。2) InvalidateRgn函数InvalidateRgn函数的定义为:void InvalidateRgn(CRgn* pRgn, BOOL bErase=TRUE);函数InvalidateRgn的功能和使用方法与函数InvalidateRgn类似,惟一不同的是函数InvalidateRgn是使一个指定的区域重画。参数pRgn是指向一个CRgn对象的指针。InvalidateRgn函数可以使一个

44、已经初始化的CRgn对象所指定的区域重画。以下代码可使CRgn对象rgn指定的区域重画:InvalidateRgn(&rgn);4.3.2 重画上屏、首屏和显示全图1) 重画上屏要实现重画上屏的操作功能,只需把m_CurrentScreen的值减去1,从结构数组m_Screen中取出屏幕参数重画图形即可。在实现文件drawview.cpp中,将“重画上屏”菜单项的消息处理函数OnGraphUp的实现代码修改如下:void CDrawView:OnGraphUp()CDrawDoc* pDoc=(CDrawDoc*)GetDocument();if(pDoc-m_CurrentScreen0)/

45、如果当前不是首屏,当前图形屏幕序号减1pDoc-m_CurrentScreen-;/得到上一屏幕的图形参数并重画图形m_xStart=p_ScreenpDoc-m_CurrentScreen.sx;m_yStart=p_ScreenpDoc-m_CurrentScreen.sy;blc=p_ScreenpDoc-m_CurrentScreen.blc;Invalidate(); /重画图形p_Screen是CDrawView类中定义的指向文档对象中的结构数组m_Screen的指针,它在视图类CDrawView中定义:ScreenStruct *p_Screen;在实现文件drawview.cp

46、p中,在重载的虚函数OnActiveView中对p_Screen进行初始化,将它指向当前文档对象中的结构数组m_Screen:void CDrawView:OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView) p_View=this;CDrawDoc* pDoc=(CDrawDoc*)GetDocument();p_Screen=pDoc-m_Screen;CView:OnActivateView(bActivate, pActivateView, pDeactiveView);2) 重画首屏对于重

47、画首屏的功能来说,只要取出存储在结构数组m_Screen中的首屏参数,并对视图重画即可。修改实现文件drawview.cpp中的消息处理函数OnGraphFirst,得到实现代码如下:void CDrawView:OnGraphFirst() /重画首屏/ TODO: Add your command handler code hereCDrawDoc* pDoc=GetDocument();if(pDoc-m_CurrentScreen=0)return ;m_xStart=p_Screen0.sx;m_yStart=p_Screen0.sy;blc=p_Screen0.blc;pDoc-A

48、ddScreen(m_xStart,m_yStart,blc);Invalidate();3) 显示全图得到边界矩形在矢量图形系统中,有一种情况是,图形中所有的图形元素都在视图屏幕的一个角上,只占图幅的一小部分。这是就需要一个操作功能,调整视图屏幕左下角原点的实际坐标(m_xStart ,m_yStart)和显示比例blc,使所有的图形元素正好能够绘制到视图屏幕中(在屏幕上留有一部分边界区域),显示全图功能就是为完成此功能而设置的。实现显示全图功能的思路是,通过得到每一类图形元素(如直线、连续直线)的边界矩形,然后根据视图屏幕的大小(逻辑坐标)进行计算,得到屏幕的参数m_xStart,m_yS

49、tart,blc。所以,解决问题的关键在于得到各类图形元素的边界矩形。在3.3.2节中我们已经介绍了边界矩形的实现方法,把所有图形元素的边界矩形坐标进行比较,就可以得到所有图形元素的边界矩形。为了实现这个功能,在文档类CDrawDoc中定义一个函数:Public:BOOL GetRect(float *m_Xmin,float *m_Ymin,float *m_Xmax,float *m_Ymax);指针参数用来返回边界矩形的最小和最大坐标,当能计算得到边界矩形时,函数返回TRUE,否则,函数返回FALSE。在实现文件drawdoc.cpp中,加入这个函数的实现代码。在函数GetRect中,首

50、先对记录最小值和最大值的变量初始化,然后对所有的直线连续直线圆圆弧标注文本多边形区域网络点等类图形元素进行循环,得到每个图形元素的边界矩形,并比较运算得到所有图形元素的边界矩形。当至少有一个图形元素时,函数返回TRUE,没有任何图形元素时,函数返回FALSE。显示全屏在得到所有图形元素的边界矩形后,就可以调整视图屏幕的基点和比例,使当前视图正好能够绘制下所有的图形元素。在实现文件drawview.cpp中,对菜单项“重画全屏”的消息处理函数OnGraphAll进行修改:void CDrawView:OnGraphAll() float minx,miny,maxx,maxy,bl1;CDraw

51、Doc* pDoc=GetDocument();SetCapture();SetCursor(LoadCursor(NULL,IDC_WAIT);BOOL pb=pDoc-GetRect(&minx,&miny,&maxx,&maxy);SetCursor(LoadCursor(NULL,IDC_ARROW);ReleaseCapture();if(!pb)return ;bl1=(maxx-minx)/(m_wScreen-20);blc=(maxy-miny)/(m_hScreen-20);if(bl1blc)blc=bl1;m_xStart=minx-10*blc;m_yStart=mi

52、ny-10*blc;p_Screen0.sx=m_xStart;p_Screen0.sy=m_yStart;p_Screen0.blc=blc;pDoc-m_CurrentScreen=0;Invalidate();4.4 图形移动和选中后操作4.4.1 图形点选功能1) 保留选中的图形元素数据保留要实现数据保留,就需要建立数据结构来存储选中的图形元素。在文档类CDrawDoc中,定义一个结构数组和一个变量:Protected:GraphSelectStruct *GraphSelect; /存储选中的图形元素Int n_GraphSelect; /选中图形元素的数目结构GraphSelect

53、Struct在头文件drawdoc.h中(CDrawDoc类前)定义为:Typedef struct Short int Lb; Int Index; Int id_only;GraphSelectStruct;将选中的图形元素存储在结构数组GraphSelect中,成员变量Lb存储选中图形元素的类别;成员变量Index存储图形元素的序列号,即图形元素在指针数组中的下标;成员变量id_only存储这个图形元素惟一的识别号,即图形元素中的成员变量m_id_only。在实现文件drawdoc.cpp中,在CDrawDoc文档类的构造函数内动态分配结构数组GraphSelect:CDrawDoc:C

54、DrawDoc()GraphSelect=new GraphSelectStruct10000; 在CDrawDoc类的析构函数中,删除动态分配的结构数组:CDrawDoc:CDrawDoc()Delete GraphSelect;为了将一个选中的图形元素存储到结构数组GraphSelect中,在文档类CDrawDoc中定义一个函数:Public:BOOL AddSelectList(int Lb ,int index ,int id_only);函数AddSelectList实现在结构数组GraphSelect中增加一个选中的图形元素,增加成功是返回TRUE,否则函数返回FALSE。函数的实

55、现代码如下:BOOL CDrawDoc:AddSelectList(int Lb,int index,int id_only)for(int i=0;iDraw(pDC,DrawMode,DrawModel,BackColor);在文档类CDrawDoc的视图绘制函数Draw中增加代码,以实现对被选中的图形元素的特殊:void CDrawDoc:Draw(CDC* pDC,int m_DrawMode,int m_DrawModel,short BackColor)for(int i;iDraw(pDC,m_DrawMode,m_DrawModel,BackColor);/实现对被选中的图形元素的特殊绘制for(i=0;in_GraphSelect;i+)DrawGraph(pDC,GraphSelecti.Lb,GraphSelecti.index,0,1,BackColor);2) 放弃选中的图形元素所谓“放弃”,就是取消对图形元素的选

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!