📄 geogisdoc.cpp
字号:
// GeoGisDoc.cpp : implementation of the CGeoGisDoc class
//
#include "stdafx.h"
#include "GeoGis.h"
#include "GeoGisDoc.h"
#include "GeoGisView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CGeoGisDoc
CGraphPara *p_GraphPara;
void VPtoDP(int x,int y,float *X,float *Y);
void DPtoVP(float x,float y,int *X,int *Y);
int DLtoVL(float l);
float VLtoDL(int l);
extern CGeoGisView *p_View;
IMPLEMENT_DYNCREATE(CGeoGisDoc, CDocument)
BEGIN_MESSAGE_MAP(CGeoGisDoc, CDocument)
//{{AFX_MSG_MAP(CGeoGisDoc)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGeoGisDoc construction/destruction
void DPtoVP(float x, float y, int *X, int *Y)
{
p_View->DPtoVP(x,y,X,Y);
}
void VPtoDP(int x, int y, float *X, float *Y)
{
p_View->VPtoDP(x,y,X,Y);
}
int DLtoVL(float l)
{
return p_View->DLtoVL(l);
}
float VLtoDL(int l)
{
return p_View->VLtoDL(l);
}
CGeoGisDoc::CGeoGisDoc()
{
p_GraphPara=&m_GraphPara;
m_Index =new int[2000];
}
CGeoGisDoc::~CGeoGisDoc()
{
delete m_Index;
}
BOOL CGeoGisDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CGeoGisDoc serialization
void CGeoGisDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
/////////////////////////////////////////////////////////////////////////////
// CGeoGisDoc diagnostics
#ifdef _DEBUG
void CGeoGisDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CGeoGisDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CGeoGisDoc commands
COLORREF CGraphPara::GetColor(int n)
{
return m_ColorList[n];
}
BOOL CGraphPara::GetDisplayStatue(int n)
{
return m_LayerList[n].b_Display;
}
Cpoint* CGeoGisDoc::AddPoint(short ColorPen, short ColorBrush, short LineWide, short LineType,
short Layer, int id_only, float x, float y)
{
Cpoint *p_Point= new Cpoint(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,0,x,y);
m_PointArray.Add(p_Point);
return p_Point;
}
CLine* CGeoGisDoc::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;
}
CPline* CGeoGisDoc::AddPline(short ColorPen, short ColorBrush, short LineWide, short LineType,
short Layer, int id_only, int Number, PointStruct *PointList, BOOL b_Fill)
{
CPline *p_Pline= new CPline(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,0,Number,PointList,b_Fill);
m_PlineArray.Add(p_Pline);
return p_Pline;
}
CCircle* CGeoGisDoc::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;
}
CDraw* CGeoGisDoc::GetGraph(short Lb, int Index)
{
switch(Lb)
{
case 0:
if(Index<0||Index>m_PointArray.GetUpperBound())
return 0;
return m_PointArray.GetAt(Index);
break;
case 1:
if(Index<0||Index>m_LineArray.GetUpperBound())
return 0;
return m_LineArray.GetAt(Index);
break;
case 2:
if(Index<0||Index>m_PlineArray.GetUpperBound())
return 0;
return m_PlineArray.GetAt(Index);
break;
case 3:
if(Index<0||Index>m_CircleArray.GetUpperBound())
return 0;
return m_CircleArray.GetAt(Index);
break;
default:
return 0;
}
}
void CGeoGisDoc::DeleteGraph(short Lb, int Index)
{
switch(Lb)
{
case 0:
if(Index<0||Index>m_PointArray.GetUpperBound())
return;
m_PointArray.RemoveAll();
break;
case 1:
if(Index<0||Index>m_LineArray.GetUpperBound())
return;
m_LineArray.RemoveAll();
break;
case 2:
if(Index<0||Index>m_PlineArray.GetUpperBound())
return;
m_PlineArray.RemoveAll();
break;
case 3:
if(Index<0||Index>m_CircleArray.GetUpperBound())
return;
m_CircleArray.RemoveAll();
break;
default:
return;
}
}
int CGeoGisDoc::GetGraphNumb(short Lb)
{
switch(Lb)
{
case 0:
return m_PointArray.GetSize();
break;
case 1:
return m_LineArray.GetSize();
break;
case 2:
return m_PlineArray.GetSize();
break;
case 3:
return m_CircleArray.GetSize();
break;
default:
return 0;
}
}
int CGeoGisDoc::GetGraphUpperBound(short Lb)
{
switch(Lb)
{
case 0:
return m_PointArray.GetUpperBound();
break;
case 1:
return m_LineArray.GetUpperBound();
break;
case 2:
return m_PlineArray.GetUpperBound();
break;
case 3:
return m_CircleArray.GetUpperBound();
}
return -1;
}
void Cpoint::Draw(CDC *pDC, int m_DrawMode, int m_DrawMode1, short BackColor)
{
int x,y;
if(b_Delete)
return;
short ColorPen=m_ColorPen;
if(m_DrawMode1==2)
{
ColorPen=BackColor;
}
if(m_DrawMode1==2)
ColorPen=BackColor;
if(m_DrawMode==0)
pDC->SetROP2(R2_COPYPEN);
else if(m_DrawMode==1)
pDC->SetROP2(R2_NOT);
if(b_Delete)
pDC->SelectStockObject(NULL_BRUSH);
DPtoVP(m_x,m_y,&x,&y);
pDC->SetPixel(x,y,BackColor);
}
void CLine::Draw(CDC *pDC, int m_DrawMode, int m_DrawMode1, short BackColor)
{
int x1,y1,x2,y2;
if(b_Delete)
return;
short LineType=m_LineType;
short ColorPen=m_ColorPen;
if(m_DrawMode1==1)
{
if(m_LineType!=2)
LineType=2;
else
LineType++;
}
else if(m_DrawMode1==2)
ColorPen=BackColor;
CPen pen((int)LineType,(int)m_LineWide,p_GraphPara->GetColor(ColorPen));
CPen *pOldPen =pDC->SelectObject(&pen);
if(m_DrawMode==0)
pDC->SetROP2(R2_COPYPEN);
else if(m_DrawMode==1)
pDC->SetROP2(R2_NOT);
DPtoVP(m_x1,m_y1,&x1,&y1);
DPtoVP(m_x2,m_y2,&x2,&y2);
pDC->MoveTo(x1,y1);
pDC->LineTo(x2,y2);
pDC->SelectObject(pOldPen);
}
void CPline::Draw(CDC *pDC, int m_DrawMode, int m_DrawMode1, short BackColor)
{
int x1,y1;
if(b_Delete)
return;
short LineType=m_LineType;
short ColorPen=m_ColorPen;
short ColorBrush=m_ColorBrush;
if(m_DrawMode1==1)
{
if(LineType!=2)
LineType=2;
else
LineType++;
}
else if(m_DrawMode1==2)
{
ColorPen=BackColor;
ColorBrush=BackColor;
}
CPen pen((int)LineType,(int)m_LineWide,p_GraphPara->GetColor(ColorPen));
CPen *pOldPen=pDC->SelectObject(&pen);
CBrush brush(p_GraphPara->GetColor(ColorBrush));
CBrush *pOldBrush=pDC->SelectObject(&brush);
POINT *point;
CRgn m_Rgn;
if(m_DrawMode==0)
pDC->SetROP2(R2_COPYPEN);
else if(m_DrawMode==1)
pDC->SetROP2(R2_NOT);
point=new POINT[m_Number+1];
for(int i=0;i<m_Number;i++)
{
DPtoVP(m_PointList[i].x,m_PointList[i].y,&x1,&y1);
point[i].x=x1;
point[i].y=y1;
}
if(!b_Delete)
{
point[m_Number]=point[0];
pDC->MoveTo(point[0].x,point[0].y);
for(i=0;i<m_Number;i++)
pDC->LineTo(point[i].x,point[i].y);
}
else
{
if(m_DrawMode1==0||m_DrawMode1==2)
pDC->Polygon(point,m_Number);
else if(m_DrawMode1==1)
{
m_Rgn.CreatePolygonRgn(point,m_Number,0);
pDC->InvertRgn(&m_Rgn);
}
}
delete point;
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
void CCircle::Draw(CDC *pDC, int m_DrawMode, int m_DrawMode1, short BackColor)
{
int x,y,r;
if(b_Delete)
return;
short LineType=m_LineType;
short ColorPen=m_ColorPen;
short ColorBrush=m_ColorBrush;
if(m_DrawMode1==1)
{
if(LineType!=2)
LineType=2;
else
LineType++;
}
else if(m_DrawMode1==2)
{
ColorPen=BackColor;
ColorBrush=BackColor;
}
CPen pen((int)LineType,(int)m_LineWide,p_GraphPara->GetColor(ColorPen));
CPen *pOldPen=pDC->SelectObject(&pen);
CBrush brush(p_GraphPara->GetColor(m_ColorBrush));
CBrush *pOldBrush=pDC->SelectObject(&brush);
if(m_DrawMode==0)
pDC->SetROP2(R2_COPYPEN);
else if(m_DrawMode==1)
pDC->SetROP2(R2_NOT);
if(b_Delete)
pDC->SelectStockObject(NULL_BRUSH);
DPtoVP(m_CircleX,m_CircleY,&x,&y);
r=DLtoVL(m_CircleR);
pDC->Ellipse(x-r,y-r,x+r,y+r);
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
void CGeoGisDoc::Draw(CDC *pDC, int m_DrawMode, int m_DrawMode1, short BackColor)
{
for(int i=1;i<=4;i++)
{
int nn=GetGraphUpperBound(i)+1;
while(nn--)
GetGraph(i,nn)->Draw(pDC,m_DrawMode,m_DrawMode1,BackColor);
}
}
int CGeoGisDoc::GetGraphID(short Lb)
{
int nn=GetGraphUpperBound(Lb);
for(int i=0;i<2000;i++)
m_Index[i]=0;
for(i=0;i<=nn;i++)
{
if(GetGraph(Lb,i))
m_Index[GetGraph(Lb,i)->GetID()]=1;
}
for(i=0;i<2000;i++)
{
if(m_Index[i]==0)
return i;
}
return -1;
}
int CDraw::GetID()
{
return m_id_only;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -