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

📄 drawdoc.cpp

📁 在vc下编写的一个开发地理信息系统的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// DrawDoc.cpp : implementation of the CDrawDoc class
//
#include <float.h>
#include "stdafx.h"
#include "Draw.h"
#include <float.h>
#include <math.h>
#include "DrawDoc.h"
#include "Drawview.h"
#include "CntrItem.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CGraphPara *p_GraphPara;	//初试化一个公用的关于图形参数的实例
extern CDrawView *p_View;
extern CMemFile pFile;
float xMinScreen,yMinScreen,xMaxScreen,yMaxScreen;
int RunTimes=0;
extern BOOL b_Draw;
void DPtoVP(float x,float y,int *X,int *Y);
void VPtoDP(int x,int y,float *X,float *Y);
int DLtoVL(float l);
float VLtoDL(int l);

BOOL IsRectCross(float minx,float miny,float maxx,float maxy);
BOOL IsRectCross(float minx,float miny,float maxx,float maxy)
{
	if(minx>xMaxScreen||maxx<xMinScreen||miny>yMaxScreen||maxy<yMinScreen) //两个矩形区域不相交
		return 0; //如不相交函数返回0
	else 
		return 1; //如果相交就返回1
}

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);
}

	/////////////////////////////////////////////////////////////////////////////
// CDrawDoc

IMPLEMENT_DYNCREATE(CDrawDoc, COleDocument)

BEGIN_MESSAGE_MAP(CDrawDoc, COleDocument)
	//{{AFX_MSG_MAP(CDrawDoc)
	ON_UPDATE_COMMAND_UI(ID_SELECT_CLEAR, OnUpdateSelectClear)
	ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
	ON_UPDATE_COMMAND_UI(ID_SELECT_DELETE, OnUpdateSelectClear)
	ON_UPDATE_COMMAND_UI(ID_EDIT_CUT, OnUpdateSelectClear)
	ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateSelectClear)
	ON_COMMAND(IDC_TEST, OnTest)
	//}}AFX_MSG_MAP
	// Enable default OLE container implementation
	ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, COleDocument::OnUpdatePasteMenu)
	ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE_LINK, COleDocument::OnUpdatePasteLinkMenu)
	ON_UPDATE_COMMAND_UI(ID_OLE_EDIT_CONVERT, COleDocument::OnUpdateObjectVerbMenu)
	ON_COMMAND(ID_OLE_EDIT_CONVERT, COleDocument::OnEditConvert)
	ON_UPDATE_COMMAND_UI(ID_OLE_EDIT_LINKS, COleDocument::OnUpdateEditLinksMenu)
	ON_COMMAND(ID_OLE_EDIT_LINKS, COleDocument::OnEditLinks)
	ON_UPDATE_COMMAND_UI(ID_OLE_VERB_FIRST, COleDocument::OnUpdateObjectVerbMenu)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDrawDoc construction/destruction

CDrawDoc::CDrawDoc()
{

b_IsOleSelect=0;
	p_GraphPara=&m_GraphPara;	//将公用的GraphPara类的指针指向当前文档的GraphPara对象
	n_GraphSelect=0;
	GraphSelect=new GraphSelectStruct[2000];	//最多可选中2000个图形元素
	n_MaxUnIndex=10000;	//规定可以进行1万步的逆操作
	m_UndoList=new UndoStruct[n_MaxUnIndex];	
	m_UndoList[0].l_Start=0;
	char p1[4];
	sprintf(p1,"%d",RunTimes);
	FileName="c:\\draw";
	FileName+=p1;
	FileName+=".tmp";
	Fundo.Open(FileName,CFile::modeCreate|CFile::modeReadWrite|CFile::typeBinary);
	RunTimes++;
	n_CurUnIndex=0;		//当前的逆操作序号为0
	EnableCompoundFile();
	m_Index=new int[20000];
	m_MaxScreen=1000;		//最多能够记录在100个历史屏幕
	m_Screen=new ScreenStruct[m_MaxScreen];//给记录历史屏幕的数组分配空间
	//以下设置首屏的参数并将目前屏幕设置为首屏
	m_CurrentScreen=0;
	m_Screen[0].sx=0;
	m_Screen[0].sy=0;
	m_Screen[0].blc=1;
	
	strcpy(DataInfo[0].Name,"城市信息");
	DataInfo[0].only_ID=1;
	strcpy(DataInfo[1].Name,"矿产信息");
	DataInfo[1].only_ID=2;
	m_NumbData=2;	
}

CDrawDoc::~CDrawDoc()
{
	delete GraphSelect;
	delete m_UndoList;
	delete m_Index;
	delete m_Screen;
	Fundo.Close();
	remove(FileName);
}

//绘制选中的图形元素
//Lb-图形类别 Index-绘制图形的序列号 Mode-绘制覆盖模式 Mode1-绘制方式
void CDrawDoc::DrawGraph(CDC* pDC,int Lb,int Index,int Mode,int Mode1,short BackColor)
{
	if(Lb==1)		//如果是直线
		GetLine(Index)->Draw(pDC,Mode,Mode1,BackColor);
	else if(Lb==2)	//如果是连续直线
		GetPLine(Index)->Draw(pDC,Mode,Mode1,BackColor);
	else if(Lb==3)	//如果圆
		GetCircle(Index)->Draw(pDC,Mode,Mode1,BackColor);
	else if(Lb==4)	//如果是圆弧
		GetArc(Index)->Draw(pDC,Mode,Mode1,BackColor);
	else if(Lb==5)	//如果是标注文字
		GetText(Index)->Draw(pDC,Mode,Mode1,BackColor);
}

void CDrawDoc::Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor)
{
	int nn=GetNumbLines();//得到直线的数目	
	while(b_Draw&&nn--)					//绘制所有直线
		GetLine(nn)->Draw(pDC,m_DrawMode,m_DrawMode1,BackColor);
	nn=GetNumbPLines();	//得到连续直线和多边形区域数目
	while(b_Draw&&nn--)					//绘制所有连续直线和多边形区域
		GetPLine(nn)->Draw(pDC,m_DrawMode,m_DrawMode1,BackColor);
	nn=GetNumbCircles();	//得到圆的数目
	while(b_Draw&&nn--)					//绘制所有圆
		GetCircle(nn)->Draw(pDC,m_DrawMode,m_DrawMode1,BackColor);
	nn=GetNumbArcs();		//得到圆弧的数目
	while(b_Draw&&nn--)					//绘制所有圆弧
		GetArc(nn)->Draw(pDC,m_DrawMode,m_DrawMode1,BackColor);
	nn=GetNumbTexts();	//得到文本的数目
	while(b_Draw&&nn--)					//绘制所有文本
		GetText(nn)->Draw(pDC,m_DrawMode,m_DrawMode1,BackColor);
	for(int i=0;i<n_GraphSelect;i++)	
		DrawGraph(pDC,GraphSelect[i].Lb,GraphSelect[i].Index,0,1,BackColor);
}

BOOL CDrawDoc::OnNewDocument()
{
	if (!COleDocument::OnNewDocument())
		return FALSE;
	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CDrawDoc serialization

/*
void CDrawDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
	}
	else
	{
		//line1=new CLine	(0,0,0,0,0,0,0,0,100,100);
//		ar>>line1;
		// TODO: add loading code here
	}
	int nn=m_LineArray.GetSize();
	while(nn--)
	{
		if(m_LineArray.GetAt(nn)->IsDelete())
		{	
			delete m_LineArray.GetAt(nn);
			m_LineArray.RemoveAt(nn);
		}
	}
	nn=m_PLineArray.GetSize();
	while(nn--)
	{
		if(m_PLineArray.GetAt(nn)->IsDelete())
		{
			delete m_PLineArray.GetAt(nn);
			m_PLineArray.RemoveAt(nn);			
		}
	}
	nn=m_CircleArray.GetSize();
	while(nn--)
	{
		if(m_CircleArray.GetAt(nn)->IsDelete())
		{
			delete m_CircleArray.GetAt(nn);
			m_CircleArray.RemoveAt(nn);
		}
	}
	nn=m_ArcArray.GetSize();
	while(nn--)
	{
		if(m_ArcArray.GetAt(nn)->IsDelete())
		{
			delete m_ArcArray.GetAt(nn);
			m_ArcArray.RemoveAt(nn);
		}
	}
	nn=m_TextArray.GetSize();
	while(nn--)
	{
		if(m_TextArray.GetAt(nn)->IsDelete())
		{
			delete m_TextArray.GetAt(nn);
			m_TextArray.RemoveAt(nn);		
		}
	}
	m_LineArray.Serialize(ar);
	m_PLineArray.Serialize(ar);
	m_CircleArray.Serialize(ar);
	m_ArcArray.Serialize(ar);
	m_TextArray.Serialize(ar);
	n_CurUnIndex=0;
	SetModifiedFlag(0);
	// Calling the base class COleDocument enables serialization
	//  of the container document's COleClientItem objects.
	COleDocument::Serialize(ar);
}
*/

void CDrawDoc::Serialize(CArchive& ar)
{
	CFile *file1;
	int n_LineNumb,n_PLineNumb,n_CircleNumb,n_ArcNumb,n_TextNumb;
	file1=ar.GetFile();
	if (ar.IsStoring())
	{
		int nn=m_LineArray.GetUpperBound()+1;
		while(nn--)
		{
			if(m_LineArray.GetAt(nn)->IsDelete())
			{	
				delete m_LineArray.GetAt(nn);
				m_LineArray.RemoveAt(nn);
			}
		}
		nn=m_PLineArray.GetUpperBound()+1;
		while(nn--)
		{
			if(m_PLineArray.GetAt(nn)->IsDelete())
			{
				delete m_PLineArray.GetAt(nn);
				m_PLineArray.RemoveAt(nn);			
			}
		}
		nn=m_CircleArray.GetUpperBound()+1;
		while(nn--)
		{
			if(m_CircleArray.GetAt(nn)->IsDelete())
			{
				delete m_CircleArray.GetAt(nn);
				m_CircleArray.RemoveAt(nn);
			}
		}
		nn=m_ArcArray.GetUpperBound()+1;
		while(nn--)
		{
			if(m_ArcArray.GetAt(nn)->IsDelete())
			{
				delete m_ArcArray.GetAt(nn);
				m_ArcArray.RemoveAt(nn);
			}
		}
		nn=m_TextArray.GetUpperBound()+1;
		while(nn--)
		{
			if(m_TextArray.GetAt(nn)->IsDelete())
			{
				delete m_TextArray.GetAt(nn);
				m_TextArray.RemoveAt(nn);		
			}
			// TODO: add storing code here
		}
		n_LineNumb=m_LineArray.GetSize();
		n_PLineNumb=m_PLineArray.GetSize();
		n_CircleNumb=m_CircleArray.GetSize();
		n_ArcNumb=m_ArcArray.GetSize();
		n_TextNumb=m_TextArray.GetSize();
		file1->Write((unsigned char *)&n_LineNumb,sizeof(int));
		file1->Write((unsigned char *)&n_PLineNumb,sizeof(int));
		file1->Write((unsigned char *)&n_CircleNumb,sizeof(int));
		file1->Write((unsigned char *)&n_ArcNumb,sizeof(int));
		file1->Write((unsigned char *)&n_TextNumb,sizeof(int));
		if(n_LineNumb>0)
		{
			nn=m_LineArray.GetUpperBound()+1;
			while(nn--)
			{
				if(m_LineArray.GetAt(nn))

⌨️ 快捷键说明

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