www.pudn.com > subject_1_113294.rar > PaintDoc.cpp, change:2002-05-23,size:5106b


// PaintDoc.cpp : implementation of the CPaintDoc class 
// 
 
#include "stdafx.h" 
#include "Paint.h" 
 
#include "PaintDoc.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CPaintDoc 
 
IMPLEMENT_DYNCREATE(CPaintDoc, CDocument) 
 
BEGIN_MESSAGE_MAP(CPaintDoc, CDocument) 
	//{{AFX_MSG_MAP(CPaintDoc) 
		// 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() 
 
///////////////////////////////////////////////////////////////////////////// 
// CPaintDoc construction/destruction 
 
CPaintDoc::CPaintDoc() 
{ 
	// TODO: add one-time construction code here 
	m_Element=new CPtrList(); 
	m_TypeList=new int[2000]; 
	for(int i=0;i<2000;i++) 
		m_TypeList[i]=0; 
	Pointer=0; 
} 
 
CPaintDoc::~CPaintDoc() 
{ 
} 
 
BOOL CPaintDoc::OnNewDocument() 
{ 
	if (!CDocument::OnNewDocument()) 
		return FALSE; 
 
	// TODO: add reinitialization code here 
	// (SDI documents will reuse this document) 
	return TRUE; 
} 
 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CPaintDoc serialization 
 
void CPaintDoc::Serialize(CArchive& ar) 
{ 
	CLine *Line; 
	CRectangle *Rect; 
	CCircle *Circle; 
	CEllisp *Ellispe; 
	CArc *Arc; 
	CPolyline *Pline; 
	CPolygon *Pgon; 
	CText *Text; 
	POSITION Head=m_Element->GetHeadPosition(); 
	POSITION Tail=m_Element->GetTailPosition(); 
	POSITION Pos; 
	int i=0; 
	int index=0; 
	bool BreakFlag=false; 
	if (ar.IsStoring()) 
	{ 
		// TODO: add storing code here	 
		ar<<Pointer; 
		for(int i=0;i<Pointer;i++) 
			ar<<m_TypeList[i];		 
 
		for(Pos=Head;Pos=Tail;) 
		{ 
			if(BreakFlag) 
				break; 
			switch(m_TypeList[index]) 
			{ 
			case P_LINE: 
				if(Pos==Tail) 
				{ 
					Line=(CLine *)m_Element->GetAt(Pos); 
					BreakFlag=true; 
				} 
				else  
					Line=(CLine *)m_Element->GetNext(Pos); 
				Line->Serialize(ar); 
				break; 
			case P_RECTANGLE: 
				if(Pos==Tail) 
				{ 
					Rect=(CRectangle *)m_Element->GetAt(Pos); 
					BreakFlag=true; 
				} 
				else 
					Rect=(CRectangle *)m_Element->GetNext(Pos); 
				Rect->Serialize(ar); 
				break; 
			case P_CIRCLE: 
				if(Pos==Tail) 
				{ 
					Circle=(CCircle *)m_Element->GetAt(Pos); 
					BreakFlag=true; 
				} 
				else 
					Circle=(CCircle *)m_Element->GetNext(Pos); 
				Circle->Serialize(ar); 
				break; 
			case P_ELLISPE: 
				if(Pos==Tail) 
				{ 
					Ellispe=(CEllisp *)m_Element->GetAt(Pos); 
					BreakFlag=true; 
				} 
				else 
					Rect=(CRectangle *)m_Element->GetNext(Pos); 
				Rect->Serialize(ar); 
				break; 
			case P_ARC: 
				if(Pos==Tail) 
				{ 
					Arc=(CArc *)m_Element->GetAt(Pos); 
					BreakFlag=true; 
				} 
				else 
					Arc=(CArc *)m_Element->GetNext(Pos); 
				Arc->Serialize(ar); 
				break; 
			case P_POLYLINE: 
				if(Pos==Tail) 
				{ 
					Pline=(CPolyline *)m_Element->GetAt(Pos); 
					BreakFlag=true; 
				} 
				else  
					Pline=(CPolyline *)m_Element->GetNext(Pos); 
				Pline->Serialize(ar); 
				break; 
			case P_POLYGON: 
				if(Pos==Tail) 
				{ 
					Pgon=(CPolygon *)m_Element->GetAt(Pos); 
					BreakFlag=true; 
				} 
				else 
					Pgon=(CPolygon *)m_Element->GetNext(Pos); 
				Pgon->Serialize(ar); 
				break; 
			case P_TEXT: 
				if(Pos==Tail) 
				{ 
					Text=(CText *)m_Element->GetAt(Pos); 
					BreakFlag=true; 
				} 
				else 
					Text=(CText *)m_Element->GetNext(Pos); 
				Text->Serialize(ar); 
				break; 
			} 
			index++; 
		} 
	} 
	else 
	{ 
		// TODO: add loading code here 
		ar>>Pointer; 
		for(int i=0;i<Pointer;i++) 
			ar>>m_TypeList[i];		 
		for(i=0;i<Pointer;i++) 
		{ 
			switch(m_TypeList[i]) 
			{ 
			case P_LINE: 
				Line=new CLine(); 
				Line->Serialize(ar); 
				m_Element->AddTail(Line); 
				break; 
			case P_RECTANGLE: 
				Rect=new CRectangle(); 
				Rect->Serialize(ar); 
				m_Element->AddTail(Rect); 
				break; 
			case P_CIRCLE: 
				Circle=new CCircle(); 
				Circle->Serialize(ar); 
				m_Element->AddTail(Circle); 
				break; 
			case P_ELLISPE: 
				Ellispe=new CEllisp(); 
				Ellispe->Serialize(ar); 
				m_Element->AddTail(Ellispe); 
				break; 
			case P_ARC: 
				Arc=new CArc(); 
				Arc->Serialize(ar); 
				m_Element->AddTail(Arc); 
				break; 
			case P_POLYLINE: 
				Pline=new CPolyline(); 
				Pline->Serialize(ar); 
				m_Element->AddTail(Pline); 
				break; 
			case P_POLYGON: 
				Pgon=new CPolygon(); 
				Pgon->Serialize(ar); 
				m_Element->AddTail(Pgon); 
				break; 
			case P_TEXT: 
				Text=new CText(); 
				Text->Serialize(ar); 
				m_Element->AddTail(Text); 
			} 
		} 
	} 
	 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CPaintDoc diagnostics 
 
#ifdef _DEBUG 
void CPaintDoc::AssertValid() const 
{ 
	CDocument::AssertValid(); 
} 
 
void CPaintDoc::Dump(CDumpContext& dc) const 
{ 
	CDocument::Dump(dc); 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CPaintDoc commands