www.pudn.com > RMS2000_C.rar > DrawDoc.cpp
// DrawDoc.cpp : implementation of the CDrawDoc class
//
#include "stdafx.h"
#include "DrawCli.h"
#include "DrawDoc.h"
#include "CntrItem.h"
#include "DrawObj.h"
#include "DrawVw.h"
#include "mainfrm.h"
#include "DocSizeDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDrawDoc
IMPLEMENT_DYNCREATE(CDrawDoc, COleDocument)
BEGIN_MESSAGE_MAP(CDrawDoc, COleDocument)
//{{AFX_MSG_MAP(CDrawDoc)
ON_COMMAND(ID_VIEW_PAPERCOLOR, OnViewPapercolor)
ON_COMMAND(ID_VIEW_SIZE, OnViewSize)
//}}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_RANGE(ID_OLE_VERB_FIRST, ID_OLE_VERB_LAST, COleDocument::OnUpdateObjectVerbMenu)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDrawDoc construction/destruction
CDrawDoc::CDrawDoc()
{
// Use OLE compound files
EnableCompoundFile();
m_nMapMode = MM_ANISOTROPIC;
m_paperColor = RGB(255, 255, 255);
// ComputePageSize();
InitDocument();
}
CDrawDoc::~CDrawDoc()
{
}
BOOL CDrawDoc::OnNewDocument()
{
if (!COleDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
static int count=0;
char message[10];
wsprintf (message,"%s%d","¶¯Ì¬Í¼",count);
SetTitle (message);
count++;
InitDocument();
CDocSizeDlg dlg;
dlg.m_width = m_size.cx;
dlg.m_height = m_size.cy;
if (dlg.DoModal() != IDOK)
return FALSE;
m_size.cx = dlg.m_width;
m_size.cy = dlg.m_height;
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CDrawDoc serialization
void CDrawDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
ar << m_size;
ar << m_paperColor;
m_objects.Serialize(ar);
}
else
{
ar >> m_size;
ar >> m_paperColor;
m_objects.Serialize(ar);
}
// Calling the base class COleDocument enables serialization
// of the container document's COleClientItem objects.
COleDocument::Serialize(ar);
}
/////////////////////////////////////////////////////////////////////////////
// CDrawDoc diagnostics
#ifdef _DEBUG
void CDrawDoc::AssertValid() const
{
COleDocument::AssertValid();
}
void CDrawDoc::Dump(CDumpContext& dc) const
{
COleDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDrawDoc commands
void CDrawDoc::Add(CDrawObj *pObj)
{
m_objects.AddTail(pObj);
pObj->m_pDocument = this;
SetModifiedFlag();
}
CDrawObj* CDrawDoc::ObjectAt(const CPoint& point)
{
CRect rect(point, CSize(1, 1));
POSITION pos = m_objects.GetTailPosition();
while (pos != NULL)
{
CDrawObj* pObj = m_objects.GetPrev(pos);
if (pObj->Intersects(rect))
return pObj;
}
return NULL;
}
void CDrawDoc::Remove(CDrawObj* pObj)
{
// Find and remove from document
POSITION pos = m_objects.Find(pObj);
if (pos != NULL)
m_objects.RemoveAt(pos);
// set document modified flag
SetModifiedFlag();
// call remove for each view so that the view can remove from m_selection
pos = GetFirstViewPosition();
while (pos != NULL)
((CDrawView*)GetNextView(pos))->Remove(pObj);
}
void CDrawDoc::Draw(CDC* pDC,CDrawView* pView)
{
POSITION pos = m_objects.GetHeadPosition();
while (pos != NULL)
{
CDrawObj* pObj = m_objects.GetNext(pos);
pObj->Draw(pDC);
if (pView->m_bActive && !pDC->IsPrinting() && pView->IsSelected(pObj))
pObj->DrawTracker(pDC, CDrawObj::selected);
}
}
void CDrawDoc::ComputePageSize()
{
CSize new_size(1024,768); //850x1100 8.5" x 11" default
CPrintDialog dlg(FALSE);
if (AfxGetApp()->GetPrinterDeviceDefaults(&dlg.m_pd))
{
// GetPrinterDC returns a HDC so attach it
CDC dc;
HDC hDC= dlg.CreatePrinterDC();
ASSERT(hDC != NULL);
dc.Attach(hDC);
// Get the size of the page in loenglish
// new_size.cx = MulDiv(dc.GetDeviceCaps(HORZSIZE), 1000, 254);
// new_size.cy = MulDiv(dc.GetDeviceCaps(VERTSIZE), 1000, 254);
}
// if size changed then iterate over views and reset
if (new_size != m_size)
{
m_size = new_size;
POSITION pos = GetFirstViewPosition();
while (pos != NULL)
((CDrawView*)GetNextView(pos))->SetPageSize(m_size);
}
}
void CDrawDoc::OnViewPapercolor()
{
CColorDialog dlg;
if (dlg.DoModal() != IDOK)
return;
m_paperColor = dlg.GetColor();
SetModifiedFlag();
UpdateAllViews(NULL);
}
void CDrawDoc::OnCloseDocument()
{
// TODO: Add your specialized code here and/or call the base class
COleDocument::OnCloseDocument();
}
void CDrawDoc::InitDocument()
{
m_size = CSize(1024,768); //850x1100 8.5" x 11" default
}
BOOL CDrawDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
InitDocument();
if (!COleDocument::OnOpenDocument(lpszPathName))
return FALSE;
return TRUE;
}
void CDrawDoc::OnViewSize()
{
CDocSizeDlg dlg;
dlg.m_width = m_size.cx;
dlg.m_height = m_size.cy;
if (dlg.DoModal() != IDOK)
return;
}