?? drawdoc.cpp
字號:
GetLine(nn)->Save(file1,1);
}
}
if(n_PLineNumb>0)
{
nn=m_PLineArray.GetUpperBound()+1;
while(nn--)
{
if(m_PLineArray.GetAt(nn))
GetPLine(nn)->Save(file1,1);
}
}
if(n_CircleNumb>0)
{
nn=m_CircleArray.GetUpperBound()+1;
while(nn--)
{
if(m_CircleArray.GetAt(nn))
GetCircle(nn)->Save(file1,1);
}
}
if(n_ArcNumb>0)
{
nn=m_ArcArray.GetUpperBound()+1;
while(nn--)
{
if(m_ArcArray.GetAt(nn))
GetArc(nn)->Save(file1,1);
}
}
if(n_TextNumb>0)
{
nn=m_TextArray.GetUpperBound();
while(nn--)
{
if(m_TextArray.GetAt(nn))
GetText(nn)->Save(file1,1);
}
}
}
else
{
file1->Read((unsigned char *)&n_LineNumb,sizeof(int));
file1->Read((unsigned char *)&n_PLineNumb,sizeof(int));
file1->Read((unsigned char *)&n_CircleNumb,sizeof(int));
file1->Read((unsigned char *)&n_ArcNumb,sizeof(int));
file1->Read((unsigned char *)&n_TextNumb,sizeof(int));
for(int i=0;i<n_LineNumb;i++)
{
CLine* p_Line=new CLine();
p_Line->Save(file1,0);
m_LineArray.Add(p_Line);
}
for(i=0;i<n_PLineNumb;i++)
{
CPline* p_PLine=new CPline();
p_PLine->Save(file1,0);
m_PLineArray.Add(p_PLine);
}
for(i=0;i<n_CircleNumb;i++)
{
CCircle* p_Circle=new CCircle();
p_Circle->Save(file1,0);
m_CircleArray.Add(p_Circle);
}
for(i=0;i<n_ArcNumb;i++)
{
CArc* p_Arc=new CArc();
p_Arc->Save(file1,0);
m_ArcArray.Add(p_Arc);
}
for(i=0;i<n_TextNumb;i++)
{
CText* p_Text=new CText();
p_Text->Save(file1,0);
m_TextArray.Add(p_Text);
}
// TODO: add loading code here
}
SetModifiedFlag(0);
n_CurUnIndex=0;
COleDocument::Serialize(ar);
}
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;
}
CLine * CDrawDoc::GetLine(int Index)
{
if(Index<0||Index>m_LineArray.GetUpperBound())
return 0;
return m_LineArray.GetAt(Index);
}
int CDrawDoc::GetNumbLines()
{
return m_LineArray.GetSize();
}
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;
}
CPline* CDrawDoc::GetPLine(int Index)
{
if(Index<0||Index>m_PLineArray.GetUpperBound())
return 0;
return m_PLineArray.GetAt(Index);
}
int CDrawDoc::GetNumbPLines()
{
return m_PLineArray.GetSize();
}
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;
}
CCircle* CDrawDoc::GetCircle(int Index)
{
if(Index<0||Index>m_CircleArray.GetUpperBound())
return 0;
return m_CircleArray.GetAt(Index);
}
int CDrawDoc::GetNumbCircles()
{
return m_CircleArray.GetSize();
}
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;
}
int CDrawDoc::GetNumbArcs()
{
return m_ArcArray.GetSize();
}
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;
}
CText* CDrawDoc::GetText(int Index)
{
if(Index<0||Index>m_TextArray.GetUpperBound())
return 0;
return m_TextArray.GetAt(Index);
}
int CDrawDoc::GetNumbTexts()
{
return m_TextArray.GetSize();
}
//在歷史屏幕中增加一個屏幕,以供屏幕回溯操作
//(StartX,StartY)屏幕起點,blc為屏幕的比例尺
void CDrawDoc::AddScreen(float StartX,float StartY,float blc)
{
int i;
if(m_CurrentScreen==m_MaxScreen)//如果當前屏幕在50屏上,即沒有數組空間再存信息
{
//將數組做堆式滾動將第二屏去掉(screenxy[0]中存儲的是首屏信息,操作時不改變)
for(i=1;i<m_MaxScreen-1;i++)
m_Screen[i]=m_Screen[i+1];
}
else //如果不是最大屏,屏幕記錄號增加1
m_CurrentScreen++;
//記錄下本屏幕的參數
m_Screen[m_CurrentScreen].sx=StartX;
m_Screen[m_CurrentScreen].sy=StartY;
m_Screen[m_CurrentScreen].blc=blc;
}
/////////////////////////////////////////////////////////////////////////////
// CDrawDoc diagnostics
#ifdef _DEBUG
void CDrawDoc::AssertValid() const
{
COleDocument::AssertValid();
}
void CDrawDoc::Dump(CDumpContext& dc) const
{
COleDocument::Dump(dc);
}
#endif //_DEBUG
COLORREF CGraphPara::GetColor(int n)
{
return m_ColorList[n]; //返回第n種顏色的實際值
}
BOOL CGraphPara::GetDisplayStatue(int n)
{
return m_LayerList[n].b_Display;
}
//計算點(x1,y1)與點(x2,y2)間的距離
float CDraw::CalDisp(float x1,float y1,float x2,float y2)
{
return (float)sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
//作用:計算點(xx,yy)到線段(x1,y1)(x2,y2)的距離,返回計算的距離值
float CDraw::PointLine(float xx,float yy,float x1,float y1,float x2,float y2)
{
float a,b,c,ang1,ang2,ang;
//計算三條邊的距離
a=CalDisp(x1,y1,xx,yy);if(a==0.0)return 0.0;
b=CalDisp(x2,y2,xx,yy);if(b==0.0)return 0.0;
c=CalDisp(x1,y1,x2,y2);
//如果(x1,y1)和(x2,y2)是一個點直接返回距離
if(c==0.0) return a;
if(a<b) //如果(xx,yy)的點(x1,y1)這條邊較短
{
if(y1==y2)
{
if(x1<x2)
ang1=0;
else
ang1=(float)pi;
}
else
{
ang1=(float)acos((x2-x1)/c);
if(y1>y2)ang1=(float)pi*2-ang1; //直線(x1,y1)-(x2,y2)的弧度
}
ang2=(float)acos((xx-x1)/a);
if(y1>yy)ang2=(float)pi*2-ang2; //直線(x1,y1)-(xx,yy)的弧度
ang=ang2-ang1;
if(ang<0)ang=-ang;
if(ang>pi) ang=(float)pi*2-ang; //交角的大小
if(ang>pi/2) return a; //如果為鈍角,直接返回距離
else
return (a*(float)sin(ang)); //否則返回計算得到的距離
}
else //如果(xx,yy)的點(x2,y2)這條邊較短
{
if(y1==y2)
{
if(x1<x2)
ang1=(float)pi;
else
ang1=0;
}
else
{
ang1=(float)acos((x1-x2)/c); //直線(x2,y2)-(x1,y1)的斜率的弧度
if(y2>y1)ang1=(float)pi*2-ang1;
}
ang2=(float)acos((xx-x2)/b); //直線(x2,x1)-(xx,yy)的斜率的弧度
if(y2>yy)ang2=(float)pi*2-ang2;
ang=ang2-ang1;
if(ang<0) ang=-ang;
if(ang>pi) ang=(float)pi*2-ang; //交角的大小
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -