drawdoc.h

来自「VC做的矢量画图程序!」· C头文件 代码 · 共 675 行 · 第 1/2 页

H
675
字号
// 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 "bmapdlg.h"

class CBlock;
class CTag;
class CGraphObject;
class CForm;
class CViewForm;
class CDataBaseSet;
class CPline;

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_ColorNumb;	//系统当前具有的颜色数
public:
	int n_LayerNumbAll;	//总的图层数
	long* m_ColorList;	//用来存储颜色列表
	int n_LayerNumb;	//系统当前具有的图层数
	LayerStruct* m_LayerList;//用来存储层的列表
	CGraphPara()
	{
		n_ColorNumbAll=100;	//最多具有100种颜色
		n_LayerNumbAll=100;	//最多具有100层
		m_ColorList=new long[n_ColorNumbAll];
		m_LayerList=new LayerStruct[n_LayerNumbAll];
		n_ColorNumb=10;	//目前有4种颜色
		n_LayerNumb=4;	//目前有4层
		//以下初始化几种颜色和一个层
		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_ColorList[4]=RGB(255,255,255);
		m_ColorList[5]=RGB(255,255,0);
		m_ColorList[6]=RGB(0,255,0);
		m_ColorList[7]=RGB(128,128,0);
		m_ColorList[8]=RGB(0,255,255);
		m_ColorList[0]=RGB(15,240,49);
		m_LayerList[0].b_Display=1;
		m_LayerList[1].b_Display=1;
		m_LayerList[2].b_Display=1;
		m_LayerList[3].b_Display=1;
		strcpy(m_LayerList[0].m_Name,"Layer 0");
		strcpy(m_LayerList[1].m_Name,"给水层");
		strcpy(m_LayerList[2].m_Name,"排水层");
		strcpy(m_LayerList[3].m_Name,"电力层");
	}
	
	~CGraphPara()
	{
		delete m_LayerList;
		delete m_ColorList;
	}
public:
	COLORREF GetColor(int n);		//得到第n种颜色的实际颜色
	BOOL GetDisplayStatue(int n);	//得到第n层的显示状态
	void Serialize(CArchive& ar);
};

typedef struct
{
	float x;	//横坐标
	float y;	//纵坐标
	float z;	//Z坐标,备用
}PointStruct;	//连续直线的顶点结构

class CDraw:public CObject	//基本图形类,用来存储图形的颜色、线型、层等信息,是具体图形元素类的基类
{
protected:
	CDraw(){}			//构造函数
	//	DECLARE_SERIAL(CDraw);		//串形化
public:
	short m_LineWide;	//线宽(像素)
	short m_LineType;	//线型(像素)
	short m_Layer;		//所处层
	int m_id_only;		//图形元素唯一的识别号
	BOOL b_Delete;		//是否处于删除状态
	short m_Lb;			//图形元素类别
	short m_ColorPen;	//笔色
	short m_ColorBrush;	//填充刷颜色
	CDraw(short ColorPen,short ColorBrush,short LineWide,
		short LineType,short Layer,int id_only,BOOL Delete,short Lb)
	//构造函数
	{
		m_ColorPen=ColorPen;
		m_ColorBrush=ColorBrush;
		m_LineWide=LineWide;
		m_LineType=LineType;
		m_Layer=Layer;
		b_Delete=Delete;
		m_id_only=id_only;
		m_Lb=Lb;
	}
	virtual void toChar(char *p_Char);
	virtual char *toData(char *p_Char);
	virtual void Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor)=0;
	virtual void Draw1(CDC *pDC,float x_Insert,float y_Insert,float x_Base,float y_Base,float x_Scale,float y_Scale,int m_DrawMode,int m_DrawMode1,short BackColor);	//得到边界矩形的函数
	virtual void Save(CFile* file,BOOL Yn);	//从一个文件中存储或读出图形坐标数据的函数
	virtual void Serialize(CArchive& ar);	//文档串形化函数
	virtual void GetRect(float *minX,float *minY,float *maxX,float *maxY)=0;
	virtual BOOL IsPoint(float x,float y,float jl,float blc)=0;	//判断是否被点选中的函数
//	virtual BOOL IsWindowSelect(short lb,float minX,float minY,float maxX,float maxY,float blc)=0;//lb=1;窗口内lb=2相交;lb=3;窗口内或相交
	virtual BOOL IsCircleSelect(short lb,float minX,float minY,float maxX,float maxY,float blc)=0;//lb=1;窗口内lb=2相交;lb=3;窗口内或相交
	virtual BOOL IsRgnSelect(short lb,float minX,float minY,float maxX,float maxY,BOOL IsWindow)=0;//lb=1;多边形区域内lb=2相交;lb=3;多边形区域内或相交

	virtual BOOL IsFill();
	virtual void Move(float x_Move,float y_Move);
	virtual void Scale(float x_Base,float y_Base,float x_scale,float y_scale);
	virtual BOOL dxfRead(CStdioFile* pFile);
	virtual void dxfWrite(CStdioFile* pFile);
	int GetID();
	void SetID(int only_id);
	short GetGraphLb();
	//计算点到直线的距离的函数
	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);	//删除或恢复删除图形元素的函数
	float GetAngle(float x,float y,float xx,float yy);
}
;
class CLine:public CDraw	//管理图形元素直线的类
{
protected:
	DECLARE_SERIAL(CLine);		//声明串形化

public:
	float m_X1,m_X2,m_Y1,m_Y2;	//直线的起点和终点
	CLine()
	{
		m_Lb=1;
	}	//不带任何参数的构造函数
	//以下是有初始化参数的构造函数
	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,1)
	{
		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);
	//得到边界矩形的函数
	virtual void GetRect(float *minX,float *minY,float *maxX,float *maxY);
	virtual void Serialize(CArchive& ar);	//串形化函数
	virtual void Save(CFile* file,BOOL Yn);
	virtual BOOL IsPoint(float x,float y,float jl,float blc);	//判断是否被点选中的函数
//	virtual BOOL IsWindowSelect(short lb,float minX,float minY,float maxX,float maxY,float blc);//lb=1;窗口内lb=2相交;lb=3;窗口内或相交
	virtual BOOL IsCircleSelect(short lb,float minX,float minY,float maxX,float maxY,float blc);//lb=1;圆内lb=2相交;lb=3;圆内或相交
	virtual BOOL IsRgnSelect(short lb,float minX,float minY,float maxX,float maxY,BOOL IsWindow);//lb=1;多边形区域内lb=2相交;lb=3;多边形区域内或相交
	virtual void Draw1(CDC *pDC,float x_Insert,float y_Insert,float x_Base,float y_Base,float x_Scale,float y_Scale,int m_DrawMode,int m_DrawMode1,short BackColor);
	virtual void Move(float x_Move,float y_Move);
	virtual void Scale(float x_Base,float y_Base,float x_scale,float y_scale);
	//从剪裁板中读出或写入剪裁板的函数
	virtual void toChar(char *p_Char);
	virtual char *toData(char *p_Char);
	int	LineLine(CLine* line1,float *xxx1,float *yyy1,float *xxx2,float *yyy2);
	virtual BOOL dxfRead(CStdioFile* pFile);
	virtual void dxfWrite(CStdioFile* pFile);
};

class CCircle:public CDraw	//管理图形元素圆及圆形区域类
{
protected:
	DECLARE_SERIAL(CCircle);
public:
	BOOL b_Fill;			//是否填充	1-圆形区域 0-普通圆
	float m_CircleX,m_CircleY,m_CircleR;	//圆心及半径
	CCircle()	//不带任何参数的构造函数
	{
		m_Lb=3;
	}
	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,3)
	{
		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);
	virtual void Draw1(CDC *pDC,float x_Insert,float y_Insert,float x_Base,float y_Base,float x_Scale,float y_Scale,int m_DrawMode,int m_DrawMode1,short BackColor);
	virtual void GetRect(float *minX,float *minY,float *maxX,float *maxY);
	virtual BOOL IsPoint(float x,float y,float jl,float blc);
//	virtual BOOL IsWindowSelect(short lb,float minX,float minY,float maxX,float maxY,float blc);//lb=1;窗口内lb=2相交;lb=3;窗口内或相交
	virtual BOOL IsCircleSelect(short lb,float minX,float minY,float maxX,float maxY,float blc);//lb=1;圆内lb=2相交;lb=3;圆内或相交
	virtual BOOL IsRgnSelect(short lb,float minX,float minY,float maxX,float maxY,BOOL IsWindow);//lb=1;多边形区域内lb=2相交;lb=3;多边形区域内或相交
	virtual void Save(CFile* file,BOOL Yn);
	virtual void Serialize(CArchive& ar);
	virtual BOOL IsFill();
	virtual void Move(float x_Move,float y_Move);
	virtual void Scale(float x_Base,float y_Base,float x_scale,float y_scale);
	virtual BOOL dxfRead(CStdioFile* pFile);
	virtual void dxfWrite(CStdioFile* pFile);
	BOOL IsCircle();
	virtual void toChar(char *p_Char);
	virtual char *toData(char *p_Char);
	int CircleLine(CLine* line1,float *angle1,float *angle2,float *X1, float *Y1, float *X2, float *Y2);
	int CircleCircle(CCircle* cir1,float *angl1,float *angl2);
	int LineCircleRgn(CLine* line1,int *nCross,PointStruct* Pointxy1);
	int PlineCircleRgn(CPline* pline1,int *nCross,PointStruct* Pointxy1);
};

class CArc:public CCircle		//管理图形元素圆弧的类
{
protected:
	DECLARE_SERIAL(CArc);
public:
	float m_Angle1,m_Angle2;	//圆弧的起点和终点角度
	CArc()	//不带任何参数的构造函数
	{
		m_Lb=4;
	}
	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,id_only,Delete,CircleX,
		CircleY,CircleR,Fill)
	{
		m_Angle1=Angle1;
		m_Angle2=Angle2;
		m_Lb=4;
	}
	virtual void Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor);
	virtual void Draw1(CDC *pDC,float x_Insert,float y_Insert,float x_Base,float y_Base,float x_Scale,float y_Scale,int m_DrawMode,int m_DrawMode1,short BackColor);
	virtual void GetRect(float *minX,float *minY,float *maxX,float *maxY);
	virtual BOOL IsPoint(float x,float y,float jl,float blc);
//	virtual BOOL IsWindowSelect(short lb,float minX,float minY,float maxX,float maxY,float blc);//lb=1;窗口内lb=2相交;lb=3;窗口内或相交
	virtual BOOL IsCircleSelect(short lb,float minX,float minY,float maxX,float maxY,float blc);//lb=1;圆内lb=2相交;lb=3;圆内或相交
	virtual BOOL IsRgnSelect(short lb,float minX,float minY,float maxX,float maxY,BOOL IsWindow);//lb=1;多边形区域内lb=2相交;lb=3;多边形区域内或相交
	virtual void Save(CFile* file,BOOL Yn);
	virtual void Serialize(CArchive& ar);
	virtual void toChar(char *p_Char);
	virtual char *toData(char *p_Char);
	virtual BOOL dxfRead(CStdioFile* pFile);
	virtual void dxfWrite(CStdioFile* pFile);
	void Init(short ColorPen,short ColorBrush,short LineWide,short LineType,short Layer,BOOL Delete,float CircleX,float CircleY,float CircleR,BOOL Fill,float Angle1,float Angle2);
	short GetGraphLb();
	int ArcLine(CLine *line1, float *angle1, float *angle2, float *X1, float *Y1, float *X2, float *Y2);
	int ArcCircle(CCircle* cir1,int *nCross,PointStruct* Pointxy1);
	BOOL IsInArc(float angle);
};

class CPline:public CDraw		//管理图形元素连续直线或多边形区域的类
{
public:
	int m_Numble;				//连续直线或多边形区域的顶点数
	BOOL b_Fill;				//是否为连续直线
	PointStruct* m_PointList;	//存储顶点的数组指针
	DECLARE_SERIAL(CPline);		//声明串形化
	;
	CPline()	//不带任何参数的构造函数
	{ 
		m_Numble=0;
		m_Lb=2;
	}
	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,2)
	{
		m_Numble=Numble;
		b_Fill=Fill;
		m_PointList=new PointStruct[Numble+1];	//分配空间
		if(Numble>0)	
		{
			for(int i=0;i<Numble;i++)
				m_PointList[i]=PointList[i];
		}
	}
	~CPline()	//析够函数
	{
		//if(m_Numble>0)
			delete m_PointList;
	}
	virtual void Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor);
	virtual void Draw1(CDC *pDC,float x_Insert,float y_Insert,float x_Base,float y_Base,float x_Scale,float y_Scale,int m_DrawMode,int m_DrawMode1,short BackColor);
	virtual void GetRect(float *minX,float *minY,float *maxX,float *maxY);
	virtual BOOL IsPoint(float x,float y,float jl,float blc);
//	virtual BOOL IsWindowSelect(short lb,float minX,float minY,float maxX,float maxY,float blc);//lb=1;窗口内lb=2相交;lb=3;窗口内或相交
	virtual BOOL IsCircleSelect(short lb,float minX,float minY,float maxX,float maxY,float blc);//lb=1;圆内lb=2相交;lb=3;圆内或相交
	virtual BOOL IsRgnSelect(short lb,float minX,float minY,float maxX,float maxY,BOOL IsWindow);//lb=1;多边形区域内lb=2相交;lb=3;多边形区域内或相交
	virtual void Serialize(CArchive& ar);
	virtual void Save(CFile* file,BOOL Yn);
	virtual BOOL IsFill();
	virtual void Move(float x_Move,float y_Move);
	virtual void Scale(float x_Base,float y_Base,float x_scale,float y_scale);
	virtual void toChar(char *p_Char);
	virtual char *toData(char *p_Char);
	virtual BOOL dxfRead(CStdioFile* pFile);
	virtual void dxfWrite(CStdioFile* pFile);
	BOOL IsPLine();
	int GetNumb();
	int LineRgn(CLine* line1,int *nCross,PointStruct* Pointxy1);
	int PLineRgn(CPline* pline1,int *nCross,PointStruct* Pointxy1);
	int ArcRgn(CArc* arc1,int *nCross,PointStruct *Pointxy1);
	void ModifyXyz(short PointNumb,PointStruct* PointList);
};

class CText:public CDraw		//管理图形元素标注文本的类
{
protected:
	DECLARE_SERIAL(CText);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?