📄 tag.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 + -