GIS程序设计(七)实现基本矢量图形系统的文档和视图(2) 组织矢量图形系统的文档
GIS程序设计(七)实现基本矢量图形系统的文档和视图(2)
组织矢量图形系统的文档
上一节实现了一个基本矢量图形系统的图形类元素。本节将使用这些类,利用MFC应用程序的文档管理体系组织文档,实现基本矢量图形系统的文档管理功能。
1、在应用程序【Draw】中,派生几个CObArray对象来分别管理几类图形元素。在文档类【CDrawDoc】中创建对象如下:
CTypedPtrArray<CObArray,CLine*>m_LineArray;//管理直线对象指针的对象
CTypedPtrArray<CObArray,CPline*>m_PLineArray; //管理连续直线对象指针的对象
CTypedPtrArray<CObArray,CCircle*>m_CircleArray;//管理圆对象指针的对象
CTypedPtrArray<CObArray,CArc*>m_ArcArray; //管理圆弧对象指针的对象
CTypedPtrArray<CObArray,CText*>m_TextArray; //管理标注文字对象指针的对象
注意:添加了此代码后系统会报错,需要在头文件中添加一个引用。
#include <afxtempl.h> //支持模板类的使用
为了管理一个矢量图形的图形参数,在文档类【CDrawDoc】中定义一个【CGraphPara 】对象,
CGraphPara m_GraphPara; //定义一个管理图形参数的对象
为了在各个图形元素类以及一些对话框类使用这个图形参数对象m_GraphPara,可以定义一个全局的【CGraphPara 】指针。在在实现文件【Drawdoc.cpp】中,定义一个全局变量【CGraphPara 】类指针。
CGraphPara *p_GraphPara; //初试化一个公用的关于图形参数的实例
为了把这个指针指向当前文档中的CGraphPara 对象m_GraphPara;在文档类的构造函数中加入如下代码:
p_GraphPara=&m_GraphPara; //将公用的GraphPara类的指针指向当前文档的GraphPara对象
如果要在其他别的实现文件中使用这个对象指针,只需在其他实现文件中加入这个全局指针的外部引用。
extern CGraphPara *p_GraphPara; //初试化一个公用的关于图形参数的实例
2、实现文档的管理功能
在应用程序中增加一个图形元素对象,需要进行以下两个步骤的操作:
①需要创建一个图形元素对象,并用图形元素的实际数据初始化这个图像元素对象。
②需要把指向新创建的图形元素对象的指针,增加到文档类中管理图像元素对象指针的对象中。
为了实现增加各类图像元素对象的功能,在文档类中定义几个函数,分别来完成增加各类图形对象的操作功能:
在实现文件中加入这五个函数的实现代码:
CLine* CDrawDoc::AddLine(short ColorPen,short ColorBrush,short LineWide,short LineType,short Layer,int id_only,float X1,float Y1,float X2,float Y2)
{
CLine* p_Line=new CLine(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,0,X1,Y1,X2,Y2);
m_LineArray.Add(p_Line);
return p_Line;
}
CLine* CDrawDoc::AddLine()
{
CLine* p_Line=new CLine();
m_LineArray.Add(p_Line);
return p_Line;
}
CPline* CDrawDoc::AddPLine(short ColorPen,short ColorBrush,short LineWide,short LineType,short Layer,int id_only,int Numble,PointStruct* PointList,BOOL Fill)
{
CPline* p_Pline=new CPline(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,0,Numble,PointList,Fill);
m_PLineArray.Add(p_Pline);
return p_Pline;
}
CPline* CDrawDoc::AddPLine()
{
CPline* p_Pline=new CPline();
m_PLineArray.Add(p_Pline);
return p_Pline;
}
CCircle* CDrawDoc::AddCircle(short ColorPen,short ColorBrush,short LineWide,short LineType,short Layer,int id_only,float CircleX,float CircleY,float CircleR,BOOL Fill)
{
CCircle* p_Circle=new CCircle(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,0,CircleX,CircleY,CircleR,Fill);
m_CircleArray.Add(p_Circle);
return p_Circle;
}
CCircle* CDrawDoc::AddCircle()
{
CCircle* p_Circle=new CCircle();
m_CircleArray.Add(p_Circle);
return p_Circle;
}
CArc* CDrawDoc::AddArc(short ColorPen,short ColorBrush,short LineWide,short LineType,short Layer,int id_only,float CircleX,float CircleY,float CircleR,BOOL Fill,float Angle1,float Angle2)
{
CArc* p_Arc=new CArc(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,0,CircleX,CircleY,CircleR,Fill,Angle1,Angle2);
m_ArcArray.Add(p_Arc);
return p_Arc;
}
CArc* CDrawDoc::AddArc()
{
CArc* p_Arc=new CArc();
m_ArcArray.Add(p_Arc);
return p_Arc;
}
CText* CDrawDoc::AddText(short ColorPen,short ColorBrush,short 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)
{
CText* p_Text=new CText(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,0,StartX,StartY,Angle1,Angle2,TextHeight,TextWide,OffWide,0,Text);
m_TextArray.Add(p_Text);
return p_Text;
}
CText* CDrawDoc::AddText()
{
CText* p_Text=new CText();
m_TextArray.Add(p_Text);
return p_Text;
}
注意:在实现各类图形元素的时候,一定要注意重载基类的纯虚函数,并且实现之,一定要实现,不然会报错。同时注意串行化的声明和实现。
3、得到指向图形元素对象的指针
现在介绍获得图形元素对象指针的方法,在一个图形系统中,有大量的图形元素。指向图像元素对象的指针被保存在文档类对象的CObArray对象中。在系统的操作过程中,为了对图形元素实现各种操作功能,需要得到指向指定图形元素对象的指针。为了获得指向指定图形元素对象的指针,在文档类中定义一个函数如下:
CDraw* GetGraph(short Lb,int Index); //得到指向图形元素对象的指针
参数Lb用来表示要返回的图形类别:1-直线 2-连续直线或多边形区域 3-圆或圆形区域
4-圆弧 5-标注文本
参数Index是要得到的图形元素对象指针在相应CObArray对象中的0基序号(数组的下标)。
在实现文件【Drawdoc.cpp】中添加如下实现代码:
CDraw* CDrawDoc::GetGraph(short Lb,int Index)
{
switch(Lb)
{
case 1:
if(Index<0||Index>m_LineArray.GetUpperBound())
return 0;
return m_LineArray.GetAt(Index);
break;
case 2:
if(Index<0||Index>m_PLineArray.GetUpperBound())
return 0;
return m_PLineArray.GetAt(Index);
break;
case 3:
if(Index<0||Index>m_CircleArray.GetUpperBound())
return 0;
return m_CircleArray.GetAt(Index);
break;
case 4:
if(Index<0||Index>m_ArcArray.GetUpperBound())
return 0;
return m_ArcArray.GetAt(Index);
break;
case 5:
if(Index<0||Index>m_TextArray.GetUpperBound())
return 0;
return m_TextArray.GetAt(Index);
break;
default:
return 0;
}
}
4、得到各类图形元素的数目
在文档类【CDrawDoc】类中定义一个函数如下:
int GetGraphNumb(short Lb); //得到各类图形元素的数目
在实现文件中添加实现代码:
int CDrawDoc::GetGraphNumb(short Lb)
{
switch(Lb)
{
case 1:
return m_LineArray.GetSize();
break;
case 2:
return m_PLineArray.GetSize();
break;
case 3:
return m_CircleArray.GetSize();
break;
case 4:
return m_ArcArray.GetSize();
break;
case 5:
return m_TextArray.GetSize();
break;
default:
return 0;
}
}
6、得到存储各类图形元素CObArray对象数组的上标
在文档类【CDrawDoc】类中定义一个函数如下:
int GetGraphUpperBound(short Lb); //得到存储各类图形元素CObArray对象数组的上标
在实现文件中添加实现代码:
int CDrawDoc::GetGraphUpperBound(short Lb)
{
switch(Lb)
{
case 1:
return m_LineArray.GetUpperBound();
break;
case 2:
return m_PLineArray.GetUpperBound();
break;
case 3:
return m_CircleArray.GetUpperBound();
break;
case 4:
return m_ArcArray.GetUpperBound();
break;
case 5:
return m_TextArray.GetUpperBound();
break;
default:
return -1;
}
}
参考资料:陈建春,Visual C++开发GIS系统--开发实例剖析。
地理信息科学
Writed By NX
QQ:1051926720