⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tag.cpp

📁 VC做的矢量画图程序!
💻 CPP
字号:
// Tag.cpp: implementation of the CTag class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "draw.h"
#include "drawdoc.h"
#include "drawview.h"
#include "Tag.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
extern CDrawView* p_View;
extern void VPtoDP(int x,int y,float *X,float *Y);
extern float VLtoDL(int l);

IMPLEMENT_SERIAL(CBlock,CObject,1)

//图形块类的串行化函数
void CBlock::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		if(!IsOpen)			//如果没有从图形块文件中读入图形块
			ReadFile(1);	//读入图形块
	}
	m_GraphArray.Serialize(ar);	
	if (ar.IsStoring())		//如果是保存操作
	{
		if(!IsOpen)			//如果没有打开文件
			ReadFile(1);
		ar<<fileName<<m_Name;
		ar<<IsOpen;
		ar<<x<<y<<m_xMin<<m_xMax<<m_yMin<<m_yMax;
		ar<<m_iD;
		ar<<m_DatabaseID;	
	}
	else					//如果是读取操作
	{
		ar>>fileName>>m_Name;
		ar>>IsOpen;
		ar>>x>>y>>m_xMin>>m_xMax>>m_yMin>>m_yMax;
		ar>>m_iD;
		ar>>m_DatabaseID;	
		ReadFile(0);		//将图形块写入图形块文件
	}
}

//图形块类的构造函数
CBlock::CBlock(int iD,CString fName)
{
	CBlock();
	m_iD=iD;			//图形块的识别号
	fileName=fName;		//图形块的文件名称
}

//图形块(或电子表格)类的构造函数
CBlock::CBlock(int iD,CString fName,CString Name,short DatabaseID)
{
	CBlock();
	m_iD=iD;					//图形块(或电子表格)的识别号
	fileName=fName;				//图形块(电子表格)外部文件名称
	m_Name=Name;				//图形块(电子表格)名称
	m_DatabaseID=DatabaseID;	//电子表格连接的记录集合对象识别号
}

CBlock::~CBlock()
{

}

//在图形块中增加一个图形元素
CDraw* CBlock::AddGraph(CDraw *pDraw)	
{
	m_GraphArray.Add((CObject *)pDraw);
	return pDraw;
}

//从图形块中读出第Index个图形元素
CDraw* CBlock::GetGraph(int Index)
{
	return (CDraw *)m_GraphArray.GetAt(Index);
}

//将图形块读出或写入存储图形块的文件
BOOL CBlock::ReadFile(BOOL isRead)
{
	CString string;
	BOOL YN;
	if(isRead)	//如果是读取操作
		YN=fblock.Open(fileName,CFile::modeReadWrite|CFile::typeBinary);
	else		//如果是写入操作
		YN=fblock.Open(fileName,CFile::modeCreate|CFile::modeReadWrite|CFile::typeBinary);
	if(!YN)		//如果打开外部文件不成功,显示提示信息退出
	{
		string.Empty();
		string+="不能打开文件";
		string+=fileName;
		AfxMessageBox(string);
		return FALSE;	
	}
	fblock.Seek(0,0);
	if(isRead)	//如果是读出操作
	{
		fblock.Read((unsigned char *)&m_LineNumb,sizeof(int));
		fblock.Read((unsigned char *)&m_PLineNumb,sizeof(int));
		fblock.Read((unsigned char *)&m_CircleNumb,sizeof(int));
		fblock.Read((unsigned char *)&m_ArcNumb,sizeof(int));
		fblock.Read((unsigned char *)&m_TextNumb,sizeof(int));
		fblock.Read((unsigned char *)&m_FormrgnNumb,sizeof(int));
		for(int i=0;i<m_LineNumb;i++)
		{
			CLine* p_Line=new CLine();
			p_Line->Save(&fblock,0);
			AddGraph(p_Line);
		}
		for(i=0;i<m_PLineNumb;i++)
		{
			CPline* p_PLine=new CPline();
			p_PLine->Save(&fblock,0);
			AddGraph(p_PLine);
		}
		for(i=0;i<m_CircleNumb;i++)
		{
			CCircle* p_Circle=new CCircle();
			p_Circle->Save(&fblock,0);
			AddGraph(p_Circle);
		}
		for(i=0;i<m_ArcNumb;i++)
		{
			CArc* p_Arc=new CArc();
			p_Arc->Save(&fblock,0);
			AddGraph(p_Arc);
		}
		for(i=0;i<m_TextNumb;i++)
		{
			CText* p_Text=new CText();
			p_Text->Save(&fblock,0);
			AddGraph(p_Text);
		}
		for(i=0;i<m_FormrgnNumb;i++)
		{
			CFormrgn* p_Formrgn=new CFormrgn();
			p_Formrgn->Save(&fblock,0);
			AddGraph(p_Formrgn);
		}
		IsOpen=TRUE;
	}
	else	//如果是存储操作
	{
		m_LineNumb=GetGraphNumb(1);
		m_PLineNumb=GetGraphNumb(2);
		m_CircleNumb=GetGraphNumb(3);
		m_ArcNumb=GetGraphNumb(4);
		m_TextNumb=GetGraphNumb(5);
		m_FormrgnNumb=GetGraphNumb(7);
		fblock.Write((unsigned char *)&m_LineNumb,sizeof(int));
		fblock.Write((unsigned char *)&m_PLineNumb,sizeof(int));
		fblock.Write((unsigned char *)&m_CircleNumb,sizeof(int));
		fblock.Write((unsigned char *)&m_ArcNumb,sizeof(int));
		fblock.Write((unsigned char *)&m_TextNumb,sizeof(int));
		fblock.Write((unsigned char *)&m_FormrgnNumb,sizeof(int));
		for(int i=1;i<=7;i++)
		{
			if(i==6)	//如果是图例,则不直接写入
				continue;
			int nn=m_GraphArray.GetUpperBound()+1;
			for(int j=0;j<nn;j++)
			{
				if(GetGraph(j)->GetGraphLb()==i)
					GetGraph(j)->Save(&fblock,1);
			}
		}
	}
	fblock.Close();
	return TRUE;
}

//清空图形块中的图形元素
BOOL CBlock::Clear(BOOL all)
{
	int nn=m_GraphArray.GetUpperBound()+1;
	while(nn--&&all)
	{
		if(GetGraph(nn))
			delete GetGraph(nn);
	}
	m_GraphArray.RemoveAll();
	m_LineNumb=0;
	m_PLineNumb=0;
	m_CircleNumb=0;
	m_ArcNumb=0;
	m_TextNumb=0;
	m_FormrgnNumb=0;
	IsOpen=FALSE;
	return TRUE;
}

//计算图形块的矩形边界
void CBlock::CalRect()
{
	float m_minX,m_minY,m_maxX,m_maxY;
	BOOL pb;
	m_xMin=(float)6E10;
	m_yMin=(float)6E10;
	m_xMax=(float)6E-10;
	m_yMax=(float)6E-10;
	int nn=m_GraphArray.GetUpperBound()+1;
	pb=0;
	while(nn--)	//对所有的图形元素循环
	{
		pb=1;
		GetGraph(nn)->GetRect(&m_minX,&m_minY,&m_maxX,&m_maxY);
		if(m_xMin>m_minX)	m_xMin=m_minX;
		if(m_xMax<m_maxX)	m_xMax=m_maxX;
		if(m_yMin>m_minY)	m_yMin=m_minY;
		if(m_yMax<m_maxY)	m_yMax=m_maxY;
	}
	if(pb==0)	//如果没有图形元素,设置一个指定的矩形区域
	{
		m_xMin=0;
		m_xMax=100;
		m_yMin=0;
		m_yMax=100;
	}
}

//设置图形块的插入点,(x_Insert,y_Insert)为插入点坐标
void CBlock::SetInsertPoint(float x_Insert,float y_Insert)
{
	x=x_Insert;
	y=y_Insert;
}

//图形块的绘制函数
void CBlock::Draw(CDC* pDC,float xInsert,float yInsert,float x_scale,float y_scale,int DrawMode,int DrawMode1)
{
	if(!IsOpen)			//如果没有从外部文件中打开图形块
		ReadFile(1);	//从外部文件中读出图形块
	int nn=m_GraphArray.GetUpperBound()+1;	//得到存储图形揩对象指针的对象数组的最大上标加1
	while(nn--)			//对所有的图形元素循环
	{
		if(GetGraph(nn))
			GetGraph(nn)->Draw1(pDC,xInsert,yInsert,x,y,x_scale,y_scale,DrawMode,DrawMode1,0);
	}
}

//将图形块绘制在一个矩形区域内,矩形区域的作上角坐标为(sx1,sy1),绘制区域的宽度和高度为width和height
//ScreenHigh-视图屏幕的高度,DrawMode-绘制的覆盖模式,DrawMode1-绘制方式
void CBlock::Draw1(CDC* pDC,int sx1,int sy1,int width,int height,int ScreenHeight,int DrawMode,int DrawMode1)
{
	int x1,y1;
	float xInsert,yInsert,x_Scale,y_Scale;
	int m_ScreenHeight;
	float lc,lk;
	lc=VLtoDL(width);			//得到绘制区域的实际宽度
	x_Scale=lc/(m_xMax-m_xMin);	//得到横向显示比例
	lk=VLtoDL(height);			//得到绘制区域的实际高度
	y_Scale=lk/(m_yMax-m_yMin);	//得到纵向显示比例
	if(x_Scale>y_Scale)			//去较小的一个为显示比例(横纵相同)
		x_Scale=y_Scale;
	else
		y_Scale=x_Scale;
	m_ScreenHeight=p_View->m_hScreen;	
	p_View->m_hScreen=ScreenHeight;	
	x1=sx1+(int)((x-m_xMin)/(lc/x_Scale)*width);
	y1=sy1+height-(int)((y-m_yMin)/(lk/y_Scale)*height);
	VPtoDP(x1,y1,&xInsert,&yInsert);
	Draw(pDC,xInsert,yInsert,x_Scale,y_Scale,DrawMode,DrawMode1);		
	p_View->m_hScreen=m_ScreenHeight;
}

//计算得到图形块的边界矩形
void CBlock::GetRect(float *m_Xmin,float *m_Ymin,float *m_Xmax,float *m_Ymax)
{
	*m_Xmin=m_xMin-x;
	*m_Xmax=m_xMax-x;
	*m_Ymin=m_yMin-y;
	*m_Ymax=m_yMax-y;
}

//得到并返回图形块的实际高度
float CBlock::GetHeight()
{
	return m_yMax-m_yMin;
}

//检查是否打开了图形块(将图形块从外部文件中读出)返回1-打开0-没有
BOOL CBlock::isOpen()
{
	return IsOpen;
}

//得到并返回图形块中各类图形元素的书目
//参数Lb-图形元素的类别
int CBlock::GetGraphNumb(short Lb)
{
	int Numb;
	Numb=0;
	int nn=m_GraphArray.GetUpperBound()+1;
	if(Lb==0)
		return nn;
	while(nn--)		//对所有的图形元素遍历
	{
		if(GetGraph(nn)->GetGraphLb()==Lb)	//如果图形类别好等于参数传入的图形类别,图形书目加1
			Numb++;
	}
	return Numb;	//返回这类图形元素的数目
}

//删除第Index图形元素的对象
void CBlock::DeleteGraph(int Index)
{
	if(Index<0||Index>m_GraphArray.GetUpperBound())
		return;
	delete m_GraphArray.GetAt(Index);
}

//得到电子表格属于的记录集合对象的识别号
int CBlock::GetDatabaseID()
{
	return m_DatabaseID;
}

⌨️ 快捷键说明

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