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


阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页