?? 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 + -