www.pudn.com > VC++-develop-GIS.rar > drawDoc.h


// DrawDoc.h : interface of the CDrawDoc class 
// 
///////////////////////////////////////////////////////////////////////////// 
 
#if !defined(AFX_DrawDOC_H__0EFFC62E_8953_11D2_AE7B_444553540000__INCLUDED_) 
#define AFX_DrawDOC_H__0EFFC62E_8953_11D2_AE7B_444553540000__INCLUDED_ 
 
#if _MSC_VER >= 1000 
#pragma once 
#endif // _MSC_VER >= 1000 
 
#define pi 3.1415926 
#include "data1ret.h" 
#include "data2set.h" 
#include "linkdataset.h" 
typedef struct	//用来存储逆操作信息的结构 
{ 
	unsigned char Lb;	//操作的类别 
	long l_Start;		//在外部文件中的位置 
	int	Index;			//在删除和增加操作操作时是删除图形元素的数量 
}UndoStruct; 
 
typedef struct	//用来存储层的信息的结构 
{ 
	char m_Name[21];//层的名称 
	BOOL b_Display;	//是否显示1-显示0-隐藏 
	int reserved;	//备用 
}LayerStruct; 
 
 
class CGraphPara	//用来存储图形的基本参数的类 
{ 
protected: 
	int n_ColorNumbAll;	//总的颜色数 
	int n_LayerNumbAll;	//总的图层数 
	int n_ColorNumb;	//系统当前具有的颜色数 
	int n_LayerNumb;	//系统当前具有的图层数 
	long* m_ColorList;	//用来存储颜色列表 
	LayerStruct* m_LayerList;//用来存储层的列表 
public: 
	CGraphPara() 
	{ 
		n_ColorNumb=100;	//最多具有100种颜色 
		n_LayerNumb=100;	//最多具有100层 
		m_ColorList=new long[n_ColorNumb]; 
		m_LayerList=new LayerStruct[n_LayerNumb]; 
		n_ColorNumb=4;	//目前有4种颜色 
		n_LayerNumb=1;	//目前有一层 
		//以下初始化几种颜色和一个层 
		m_ColorList[0]=RGB(0,0,0); 
		m_ColorList[1]=RGB(255,0,0); 
		m_ColorList[2]=RGB(0,255,0); 
		m_ColorList[3]=RGB(0,0,255); 
		m_LayerList[0].b_Display=1; 
		strcpy(m_LayerList[0].m_Name,"Layer 0"); 
	} 
	 
	~CGraphPara() 
	{ 
		delete m_LayerList; 
		delete m_ColorList; 
	} 
public: 
	COLORREF GetColor(int n);		//得到第n种颜色的实际颜色 
	BOOL GetDisplayStatue(int n);	//得到第n层的显示状态 
}; 
 
typedef struct 
{ 
	float x; 
	float y; 
	float z; 
}PointStruct; 
 
class CDraw:public CObject	//基本图形类,用来存储图形的颜色、线型、层等信息 
{ 
protected: 
	CDraw(){}	//构造函数 
	short m_ColorPen;	//笔色 
	short m_ColorBrush;	//填充刷颜色 
	short m_LineWide;	//线宽(像素) 
	short m_LineType;	//线型(像素) 
	short m_Layer;		//所处层 
	int m_id_only;		//图形元素唯一的识别号 
	BOOL b_Delete;				//是否处于删除状态 
//	DECLARE_SERIAL(CDraw);		//串形化 
public: 
	CDraw(short ColorPen,short ColorBrush,short LineWide, 
		short LineType,short Layer,int id_only,BOOL Delete) 
	//构造函数 
	{ 
		m_ColorPen=ColorPen; 
		m_ColorBrush=ColorBrush; 
		m_LineWide=LineWide; 
		m_LineType=LineType; 
		m_Layer=Layer; 
		b_Delete=Delete; 
		m_id_only=id_only; 
	} 
	//计算点到直线的距离的函数 
	float PointLine(float xx,float yy,float x1,float y1,float x2,float y2); 
	//判断点是否在一个多边形区域中的函数 
	BOOL PointRgn(float x,float y,int Numble,PointStruct *PointList,float blc); 
	BOOL IsDelete();		//判断一个图形元素是否删除的函数 
	float CalDisp(float x1,float y1,float x2,float y2);//计算两点间的距离的函数 
	void Delete(BOOL Is);	//删除或恢复删除图形元素的函数 
	//从一个文件中存储或读出图形坐标数据的函数 
	virtual void Save(CFile* file,BOOL Yn);	 
	virtual void Serialize(CArchive& ar);	//文档串形化函数 
	void toChar(char *p_Char); 
	char *toData(char *p_Char); 
	virtual void Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor)=0; 
	int GetID(); 
//	int ArcRgn(float x,float y,float r,float angl1,float angl2,int nPoint,PointStruct* Pointxy,int *nCross,PointStruct *Pointxy1); 
	float GetAngle(float x,float y,float xx,float yy); 
//	int ArcLine(float x,float y,float r,float *angl1,float *angl2,float *X1,float *Y1,float *X2,float *Y2); 
//	int CircleLine(float x,float y,float r,float *X1,float *Y1,float *X2,float *Y2); 
//	int PLineRgn(int nPoint1,PointStruct* Pointxy1,int nPoint2,PointStruct* Pointxy2,int *nCross,PointStruct* Pointxy3); 
//	int CircleCircle(CCircle* cir1,CCircle* cir2,float *angl1,float *angl2); 
//	int ArcCircle(CArc* arc1,CCircle* cir2,int *nCross,PointStruct* Pointxy1); 
} 
; 
class CLine:public CDraw	//直线类 
{ 
protected: 
	DECLARE_SERIAL(CLine);		//声明串形化 
 
public: 
	float m_X1,m_X2,m_Y1,m_Y2;	//直线的起点和终点 
	CLine(){}	//不带任何参数的构造函数 
	//以下是有初始化参数的构造函数 
	CLine(short ColorPen,short ColorBrush, 
		short LineWide,short LineType,short Layer,int id_only, 
		BOOL Delete,float X1,float Y1,float X2,float Y2) 
		:CDraw(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,Delete) 
	{ 
		m_X1=X1; 
		m_Y1=Y1; 
		m_X2=X2; 
		m_Y2=Y2; 
	} 
	//直线的绘制函数 
	virtual void Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor); 
	//得到边界矩形的函数 
	void GetRect(float *minX,float *minY,float *maxX,float *maxY); 
	BOOL IsPoint(float x,float y,float jl);	//判断是否被点选中的函数 
	virtual void Serialize(CArchive& ar);	//串形化函数 
	//从剪裁板中读出或写入剪裁板的函数 
	void Save(CFile* file,BOOL Yn); 
	void toChar(char *p_Char); 
	char *toData(char *p_Char); 
	void Move(float x_Move,float y_Move); 
	int	LineLine(CLine* line1,float *xxx1,float *yyy1,float *xxx2,float *yyy2); 
}; 
 
 
class CCircle:public CDraw	//圆及圆形区域类 
{ 
protected: 
	DECLARE_SERIAL(CCircle); 
public: 
	float m_CircleX,m_CircleY,m_CircleR;	//圆心及半径 
	BOOL b_Fill;			//是否填充	1-圆形区域 0-普通圆 
	CCircle()	//不带任何参数的构造函数 
	{} 
	CCircle(short ColorPen,short ColorBrush, 
		short LineWide,short LineType,short Layer,int id_only, 
		BOOL Delete,float CircleX,float CircleY,float CircleR,BOOL Fill) 
		:CDraw(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,Delete) 
	{ 
		m_CircleX=CircleX; 
		m_CircleY=CircleY; 
		m_CircleR=CircleR; 
		b_Fill=Fill; 
	} 
	virtual void Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor); 
	void GetRect(float *minX,float *minY,float *maxX,float *maxY); 
	virtual IsPoint(float x,float y,float jl); 
	BOOL IsCircle(); 
	virtual void Save(CFile* file,BOOL Yn); 
	virtual void Serialize(CArchive& ar); 
	void toChar(char *p_Char); 
	char *toData(char *p_Char); 
	void Move(float x_Move,float y_Move); 
	int CircleLine(CLine* line1,float *angle1,float *angle2,float *X1, float *Y1, float *X2, float *Y2); 
	int CircleCircle(CCircle* cir1,float *angl1,float *angl2); 
}; 
 
class CArc:public CCircle		//圆弧类 
{ 
protected: 
	DECLARE_SERIAL(CArc); 
public: 
	float m_Angle1,m_Angle2;	//圆弧的起点和终点角度 
	CArc()	//不带任何参数的构造函数 
	{} 
	CArc(short ColorPen,short ColorBrush,short LineWide 
		,short LineType,short Layer,int id_only,BOOL Delete,float CircleX 
		,float CircleY,float CircleR,BOOL Fill,float Angle1,float Angle2) 
		:CCircle(ColorPen,ColorBrush,LineWide,LineType,Layer,Delete,id_only,CircleX, 
		CircleY,CircleR,Fill) 
	{ 
		m_Angle1=Angle1; 
		m_Angle2=Angle2; 
	} 
	virtual void Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor); 
	void Init(short ColorPen,short ColorBrush,short LineWide,short LineType,short Layer,float CircleX,float CircleY,float CircleR,BOOL Fill,float Angle1,float Angle2); 
	void GetRect(float *minX,float *minY,float *maxX,float *maxY); 
	virtual BOOL IsPoint(float x,float y,float jl); 
	BOOL IsInArc(float angle); 
	void Save(CFile* file,BOOL Yn); 
	virtual void Serialize(CArchive& ar); 
	void toChar(char *p_Char); 
	char *toData(char *p_Char); 
	int ArcLine(CLine *line1, float *angle1, float *angle2, float *X1, float *Y1, float *X2, float *Y2); 
	int ArcCircle(CCircle* cir1,int *nCross,PointStruct* Pointxy1); 
}; 
 
class CPline:public CDraw	//连续直线或多边形区域类 
{ 
protected: 
	int m_Numble;	//连续直线或多边形区域的顶点数 
	BOOL b_Fill;	//是否为连续直线 
	DECLARE_SERIAL(CPline);		//声明串形化 
	; 
public: 
	PointStruct* m_PointList;	//存储顶点的数组指针 
	CPline()	//不带任何参数的构造函数 
	{ m_Numble=0;} 
	CPline(short ColorPen,short ColorBrush, 
		short LineWide,short LineType,short Layer,int id_only, 
		BOOL Delete,int Numble,PointStruct* PointList,BOOL Fill) 
		:CDraw(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,Delete) 
	{ 
		m_Numble=Numble; 
		b_Fill=Fill; 
		m_PointList=new PointStruct[Numble+1];	//分配空间 
		if(Numble>0)	 
		{ 
			for(int i=0;i0) 
			delete m_PointList; 
	} 
	virtual void Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor); 
	void GetRect(float *minX,float *minY,float *maxX,float *maxY); 
	BOOL IsPoint(float x,float y,float jl,float blc); 
	BOOL IsPLine(); 
	void Save(CFile* file,BOOL Yn); 
	virtual void Serialize(CArchive& ar); 
	void toChar(char *p_Char); 
	char *toData(char *p_Char); 
	int GetNumb(); 
	void Move(float x_Move,float y_Move); 
	int LineRgn(CLine* line1,int *nCross,PointStruct* Pointxy1); 
	int PLineRgn(CPline* pline1,int *nCross,PointStruct* Pointxy1); 
	int ArcRgn(CArc* arc1,int *nCross,PointStruct *Pointxy1); 
}; 
 
class CText:public CDraw	//标注文本类 
{ 
protected: 
	float m_StartX;		//文本起点横坐标 
	float m_StartY;		//起点纵坐标 
	float m_Angle1;		//标注角度 
	float m_Angle2;		//字体旋转角度 
	float m_TextHeight;	//字体高度 
	float m_TextWide;	//字体宽度 
	float m_OffWide;	//间隔宽度 
	unsigned char m_TextFont;	//字体 
	CString c_Text;		//标注的文本信息 
	int m_TextLong;		//标注信息的长度 
	DECLARE_SERIAL(CText); 
public: 
	CText()		//不带任何参数的构造函数 
	{} 
	CText(short ColorPen,short ColorBrush,short LineWide 
		,short LineType,short Layer,int id_only,BOOL Delete,float StartX, 
		float StartY,float Angle1,float Angle2,float TextHeight,float TextWide, 
		float OffWide,unsigned char TextFont,CString Text) 
		:CDraw(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,Delete) 
	{ 
		m_StartX=StartX; 
		m_StartY=StartY; 
		m_Angle1=Angle1; 
		m_Angle2=Angle2; 
		m_TextHeight=TextHeight; 
		m_TextWide=TextWide; 
		m_OffWide=OffWide; 
		m_TextLong=Text.GetLength();	//计算字符的长度 
		c_Text=Text; 
	} 
	virtual void Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor); 
	void Init(short ColorPen,short ColorBrush,short LineWide,short LineType,short Layer,float StartX,float StartY,float Angle1,float Angle2,float TextHeight,float TextWide,float OffWide,unsigned char TextFont,CString Text); 
	void GetRect(float *minX,float *minY,float *maxX,float *maxY); 
	BOOL IsPoint(float x,float y,float jl,float blc); 
	void Save(CFile* file,BOOL Yn); 
	virtual void Serialize(CArchive& ar); 
	void toChar(char *p_Char); 
	char *toData(char *p_Char); 
	int GetLong(); 
	void Move(float x_Move,float y_Move); 
}; 
 
typedef struct 
{ 
	short int Lb;		//类别 1-直线 2-连续直线或多边形区域 3-圆 4-圆弧 5-文本 
	short int Index;	//序号 
	short int pbh;		//判别号 
}GraphSelectStruct;		//用来存储选中图形元素的结构 
 
typedef struct 
{ 
	short only_ID; 
	char Name[20]; 
} DataInfoStru; 
 
typedef struct	//用来记录历史屏幕参数的结构 
{ 
	float blc;	//比例尺 
	float sx;	//屏幕左下角的横坐标 
	float sy;	//屏幕左下角的纵坐标 
}ScreenStruct;	 
 
class CDrawDoc : public COleDocument 
{ 
protected: // create from serialization only 
	CDrawDoc(); 
	DECLARE_DYNCREATE(CDrawDoc) 
 
private: 
	CTypedPtrArraym_LineArray;	//管理直线对象指针的对象 
	CTypedPtrArraym_PLineArray;	//管理连续直线对象指针的对象 
	CTypedPtrArraym_CircleArray;//管理圆对象指针的对象 
	CTypedPtrArraym_ArcArray;		//管理圆弧对象指针的对象 
	CTypedPtrArraym_TextArray;	//管理标注文字对象指针的对象 
	// Attributes 
public: 
	BOOL b_IsOleSelect;			//是否选中了OLE对象 
	CGraphPara m_GraphPara;	//定义一个管理图形参数的对象 
	GraphSelectStruct *GraphSelect;	//存储选中元素的性质 
	int n_GraphSelect;				//选中图形元素的数目 
	int m_CurrentScreen;		//当前屏幕的序号 
	int m_MaxScreen;			//最多能够有的屏幕数 
	ScreenStruct* m_Screen;		//记录屏幕参数的结构指针 
	CLine* line1; 
	Data1Set m_data1; 
	CData2Set m_data2; 
	CLinkDataSet m_linkdata1; 
	int *m_Index; 
	DataInfoStru DataInfo[30]; 
	short m_NumbData; 
protected:	 
	CString FilePath,FileName;		//存储逆操作文档的路径和文件名 
	CFile Fundo;					//用来存储逆操作信息的文件指针 
	UndoStruct* m_UndoList;			//存储逆操作的索引信息 
	int n_CurUnIndex,n_MaxUnIndex;	//当前处于操作的次数和总的操作次数 
	UINT DrawFormat; 
	// Operations 
public: 
 
// Overrides 
	// ClassWizard generated virtual function overrides 
	//{{AFX_VIRTUAL(CDrawDoc) 
	public: 
	virtual BOOL OnNewDocument();			//建立新文档时调用 
	virtual void Serialize(CArchive& ar);	//串形化函数 
	virtual void DeleteContents();			//删除文档时调用 
	virtual void OnCloseDocument();			//关闭文档时调用 
	virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);	//打开文档时调用 
	virtual BOOL OnSaveDocument(LPCTSTR lpszPathName);	//保存文档时调用 
	//}}AFX_VIRTUAL 
 
// Implementation 
public: 
	void Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor); 
	void DrawGraph(CDC* pDC,int Lb,int Index,int Mode,int Mode1,short BackColor); 
	void OnEditUndo();		//逆操作函数 
	int GetMaxIndex(int Lb);//得到各类图形元素顶最大索引号 
	//以下两个重载函数用来记录一步操作 
	BOOL AddUndo(int Lb,int Numble,GraphSelectStruct* GraphList); 
	BOOL AddUndo(float sx,float sy,float blc); 
	BOOL WriteClipBoard();							//将图形元素写入剪裁板 
	BOOL ReadClipBoard(float x,float y); 
	BOOL AddSelectList(int Lb,int Index,int Pbh);			//增加一个选中的图形元素 
	//得到所有图形元素的边界按矩形 
	BOOL GetRect(float *m_Xmin,float *m_Ymin,float *m_Xmax,float *m_Ymax); 
	//进行选中图形元素的操作 
	BOOL PointSelect(float x,float y,float jl,float blc,int *Lb,int *Index,int *pbh); 
	CLine* AddLine(short ColorPen,short ColorBrush,short 
		LineWide,short LineType,short Layer,int id_only,float X1,float Y1, 
		float X2,float Y2);		//增加一条直线 
	CLine* AddLine();			//增加一条直线 
	CLine* GetLine(int Index);	//得到第Index条直线 
	int GetNumbLines();			//得到直线的数目 
	CPline* AddPLine(short ColorPen,short ColorBrush, 
		short LineWide,short LineType,short Layer,int id_only,int Numble, 
		PointStruct* PointList,BOOL b_Fill); 
	CPline* AddPLine(); 
	CPline* GetPLine(int Index); 
	int GetNumbPLines(); 
	CCircle* AddCircle(short ColorPen,short ColorBrush, 
		short LineWide,short LineType,short Layer,int id_only, 
		float CircleX,float CircleY,float CircleR,BOOL Fill);	 
	CCircle* AddCircle(); 
	CCircle* GetCircle(int Index); 
	int GetNumbCircles(); 
	CArc* 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* AddArc(); 
	CArc* GetArc(int Index); 
	int GetNumbArcs(); 
	CText* 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);	 
	CText* AddText(); 
	void AddScreen(float StartX,float StartY,float blc);//增加一个图形屏幕 
	CText* GetText(int Index); 
	int GetNumbTexts(); 
	int GetLineId(); 
	int GetPLineId(); 
	int GetCircleId(); 
	int GetArcId(); 
	int GetTextId(); 
	CDataBaseSet *GetDataSet(int Index); 
	short GetDataID(int Index); 
	short GetDataIndex(int ID); 
 
	virtual ~CDrawDoc(); 
#ifdef _DEBUG 
	virtual void AssertValid() const; 
	virtual void Dump(CDumpContext& dc) const; 
#endif 
 
protected: 
 
// Generated message map functions 
protected: 
	//{{AFX_MSG(CDrawDoc) 
	afx_msg void OnUpdateSelectClear(CCmdUI* pCmdUI);//是否能够执行"放弃选择“ 
	afx_msg void OnUpdateEditUndo(CCmdUI* pCmdUI);	//是否能够执行"Undo"菜单 
	afx_msg void OnTest(); 
	//}}AFX_MSG 
	DECLARE_MESSAGE_MAP() 
}; 
 
///////////////////////////////////////////////////////////////////////////// 
 
 
//{{AFX_INSERT_LOCATION}} 
// Microsoft Developer Studio will insert additional declarations immediately before the previous line. 
 
#endif // !defined(AFX_DrawDOC_H__0EFFC62E_8953_11D2_AE7B_444553540000__INCLUDED_)