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

📄 geogisdoc.cpp

📁 用vc和cj60lib做的读取shape文件的源代码.还有些小问题没做完。
💻 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 + -