📄 drawdoc.cpp
字号:
// 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 + -