管理矢量图形系统图形数据的方法即文档管理机制。在本设计的开发中,采用一套完全面向对象的文档组织机制。这种机制就是通过图形元素类创建很多图形元素对象,每个图形元素对象作为一个整体来组织存储空间的分配、存取等各种管理功能。然后通过建立一种存储机制,来管理指向所有图形元素对象的指针,达到管理所有图形元素对象的目的。这种文档管理机制具有组织简单、结构化和移植性好,以及比较容易利用VC++程序设计语言的开发功能等优点。缺点是需要较大的内存空间。 paper51.com 管理一个矢量图形系统文档的思路是:每个图形元素是图形元素类创建的一个对象,在创建这个对象时得到指向这个对象的指针,建立一个对象指针数组来管理这些指针,以达到管理所有图形元素对象的目的。 内容来自论文无忧网 www.paper51.com 在VC++下可以较容易地实现对指向图形元素对象的指针的组织和管理。在MFC中有一个类模班CTypedPtrArray,可以用它来创建一个管理类指针的对象。例如,可以定义一个管理CLine类指针的对象如下: 内容来自论文无忧网 www.paper51.com CTypedPtrArray<CObArray,Cline*>m_LineArray; copyright paper51.com
其他各图形类的管理类指针对象和Cline类指针的对象类似: copyright paper51.com CTypedPtrArray<CObArray,CCircle*>m_CircleArray; 内容来自论文无忧网 www.paper51.com CTypedPtrArray<CObArray,CArc*>m_ArcArray; paper51.com CTypedPtrArray<CObArray,CText*>m_TextArray; 内容来自论文无忧网 www.paper51.com CTypedPtrArray<CObArray,CPline*>m_PLineArray; 内容来自www.paper51.com CTypedPtrArray<CObArray,CPlineRgn*>m_PLineRgnArray; http://www.paper51.com 2) 增加图形元素 copyright paper51.com 在应用程序Draw中增加一个图形元素对象(如一条直线)时,需要进行以下两个步骤的操作: copyright paper51.com ①创建一个图形元素对象,并用图形元素的实际数据初始化这个图形元素对象。如增加一条直线时,需要创建一个CLine对象,并用这条直线的实际数据(起终点、所在图层、颜色等)初始化这个CLine对象的成员变量。 http://www.paper51.com ②把指向新创建的图形元素对象的指针,增加到文档类中管理图形元素对象指针的对象中。如增加一条CLine对象后,需要把指向这个CLine对象的指针增加到文档类的m_LineArray对象中。 内容来自论文无忧网 www.paper51.com 为了实现增加各类图形元素的功能,在文档类CDrawDoc 中定义几个函数,分别来完成增加各类图形元素的操作功能 内容来自www.paper51.com CLine* AddLine(short ColorPen,shortColorBrush,float LineWide,short LineType,short Layer,int id_only,float X1,floatY1,float X2,float Y2); http://www.paper51.com CCircle* AddCircle(short ColorPen,shortColorBrush,float LineWide,short LineType,short Layer,int id_only,floatCircleX,float CircleY,float CircleR,BOOL bFill); copyright paper51.com
CArc* AddArc(short ColorPen,shortColorBrush,float LineWide,short LineType,short Layer,int id_only,floatCircleX,float CircleY,float CircleR,float Angle1,float Angle2); 内容来自www.paper51.com CText* AddText(short ColorPen,shortColorBrush,float LineWide,short LineType,short Layer,int id_only,floatStartX,float StartY,float Angle1,float Angle2,float TextHeight,floatTextWide,float OffWide,unsigned char TextFont,int TextLong,CString Text); http://www.paper51.com CPline* AddPLine(short ColorPen,shortColorBrush,float LineWide,short LineType,short Layer,int id_only,intNumble,PointStruct *PointList); paper51.com CPlineRgn* AddPLineRgn(shortColorPen,short ColorBrush,float LineWide,short LineType,short Layer,intid_only,int Numble,PointStruct *PointList,BOOL bTransparent,BOOL bFill); copyright paper51.com
这6个函数分别用来实现增加一条直线、一个圆、一个圆弧、一个标注文本、一条连续直线和一个多边形区域的功能。函数返回指向新增图形元素对象的指针。 copyright paper51.com 3) 得到指向图形元素对象的指针 http://www.paper51.com 在一个矢量图形系统中,有大量的图形元素,指向图形元素对象的指针被保存在文档类对应的CObArray对象中。在系统的操作过程中,为了实现对图形元素的各种操作功能,需要得到指向指定图形元素对象的指针,为此,在文档类CDrawDoc 中定义一个函数GetGraph如下: paper51.com
Public: http://www.paper51.com CDraw* GetGraph(short Lb, int index ); copyright paper51.com 在实现文件drawdoc.cpp中,加入函数的具体实现代码。 copyright paper51.com 4) 删除图形元素对象 paper51.com 为了能够从CObArray 对象中删除一个指定图形元素对象指针,在文档类CDrawDoc中定义一个成员函数: 内容来自论文无忧网 www.paper51.com
Public: paper51.com Void DeleteGraph(short Lb, int index); copyright paper51.com 在实现文件drawdoc.cpp中,加入函数的具体实现代码。 paper51.com 5) 得到各类图形元素的数目 http://www.paper51.com
为了能够随时得到文档中各类图形元素对象的数目,在文档类CDrawDoc中,定义一个成员函数如下: http://www.paper51.com Public: 内容来自www.paper51.com
Int GetGraphNumb(short Lb); 内容来自论文无忧网 www.paper51.com 在实现文件drawdoc.cpp中,加入函数的具体实现代码。 copyright paper51.com
6) 得到存储各类图形元素CObArray 对象数组的最大下标 copyright paper51.com 在对各个图形元素类的所有图形元素进行操作时,需要得到存储在各个CObArray对象中的最大数组下标,然后对各个数组项实现遍历操作。为了得到存储在各个CObArray 对象中的最大数组下标,在文档类CDrawDoc中定义一个函数如下: 内容来自www.paper51.com Public: http://www.paper51.com Int GetGraphUpperBound(short Lb); copyright paper51.com 在实现文件drawdoc.cpp中,加入函数的具体实现代码。 copyright paper51.com 7) 得到某个识别号的图形元素对象指针在CObArray 数组中的存放位置 内容来自www.paper51.com Public: http://www.paper51.com Int GetGraphIndex(short Lb,int ID); 内容来自论文无忧网 www.paper51.com 在实现文件drawdoc.cpp中,加入函数的具体实现代码。 http://www.paper51.com 8) 得到图形元素的唯一识别号 内容来自论文无忧网 www.paper51.com 在应用程序Draw中,采用同类图形元素具有惟一识别号的方法,即每一类别的图形元素具有不同的成员变量m_id_only。 paper51.com 为了得到每类图形元素的惟一识别号,在文档类CDrawDoc中定义一个成员函数: 内容来自论文无忧网 www.paper51.com public: paper51.com int GetGraphID(short Lb); 内容来自www.paper51.com 函数GetGraphID用来得到要增加的各类图形元素的惟一识别号,参数Lb用来表示图形类别。在实现文件drawdoc.cpp中,加入函数的实现代码。 paper51.com
|