home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tricks of the Windows Gam…ming Gurus (2nd Edition)
/
Disc2.iso
/
msdn_vcb
/
samples
/
vc98
/
mfc
/
ole
/
drawcli
/
drawdoc.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1998-03-26
|
8KB
|
285 lines
// drawdoc.cpp : implementation of the CDrawDoc class
//
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include "stdafx.h"
#include "drawcli.h"
#include "drawdoc.h"
#include "drawvw.h"
#include "drawobj.h"
#include "cntritem.h"
#include "summpage.h"
#include "statpage.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE 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_FILE_SUMMARYINFO, OnFileSummaryInfo)
//}}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_LINKS, COleDocument::OnUpdateEditLinksMenu)
ON_COMMAND(ID_OLE_EDIT_LINKS, COleDocument::OnEditLinks)
ON_UPDATE_COMMAND_UI(ID_OLE_VERB_FIRST, COleDocument::OnUpdateObjectVerbMenu)
// MAPI support
ON_COMMAND(ID_FILE_SEND_MAIL, OnFileSendMail)
ON_UPDATE_COMMAND_UI(ID_FILE_SEND_MAIL, OnUpdateFileSendMail)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDrawDoc construction/destruction
CDrawDoc::CDrawDoc()
{
EnableCompoundFile();
m_nMapMode = MM_ANISOTROPIC;
m_paperColor = RGB(255, 255, 255);
m_pSummInfo = NULL;
ComputePageSize();
}
CDrawDoc::~CDrawDoc()
{
POSITION pos = m_objects.GetHeadPosition();
while (pos != NULL)
delete m_objects.GetNext(pos);
delete m_pSummInfo;
}
BOOL CDrawDoc::OnNewDocument()
{
if (!COleDocument::OnNewDocument())
return FALSE;
// reinitialization code
// (SDI documents will reuse this document)
if(m_pSummInfo != NULL)
delete m_pSummInfo;
m_pSummInfo = new CSummInfo;
// Title, Subject, Author, Keywords default to empty string
// Comments, Template, SavedBy default to empty string
// LastSave, LastPrint, EditTime, RevNum default to 0
m_pSummInfo->StartEditTimeCount();
m_pSummInfo->RecordCreateDate();
m_pSummInfo->SetNumPages(1);
// NumWords, NumChars default to 0
m_pSummInfo->SetAppname( _T("DrawCli") );
// Security defaults to 0
return TRUE;
}
BOOL CDrawDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if( m_pSummInfo != NULL)
delete m_pSummInfo;
m_pSummInfo = new CSummInfo;
m_pSummInfo->StartEditTimeCount();
return COleDocument::OnOpenDocument(lpszPathName);
}
BOOL CDrawDoc::OnSaveDocument(LPCTSTR lpszPathName)
{
m_pSummInfo->RecordSaveDate();
m_pSummInfo->IncrRevNum();
m_pSummInfo->SetLastAuthor(m_pSummInfo->GetAuthor());
m_pSummInfo->AddCountToEditTime();
m_pSummInfo->StartEditTimeCount();
return COleDocument::OnSaveDocument(lpszPathName);
}
/////////////////////////////////////////////////////////////////////////////
// CDrawDoc serialization
void CDrawDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
ar << m_paperColor;
m_objects.Serialize(ar);
m_pSummInfo->WriteToStorage(m_lpRootStg);
}
else
{
ar >> m_paperColor;
m_objects.Serialize(ar);
m_pSummInfo->ReadFromStorage(m_lpRootStg);
}
// By calling the base class COleDocument, we enable serialization
// of the container document's COleClientItem objects automatically.
COleDocument::Serialize(ar);
}
/////////////////////////////////////////////////////////////////////////////
// CDrawDoc implementation
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::Add(CDrawObj* pObj)
{
m_objects.AddTail(pObj);
pObj->m_pDocument = this;
SetModifiedFlag();
}
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);
}
// point is in logical coordinates
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::ComputePageSize()
{
CSize new_size(850, 1100); // 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);
}
/////////////////////////////////////////////////////////////////////////////
// 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::OnFileSummaryInfo()
{
ASSERT_VALID(this);
CPropertySheet sheet( _T("Document Properties") );
CSummPage summ;
CStatPage stat;
sheet.AddPage( &summ );
sheet.AddPage( &stat );
summ.m_strAppname = m_pSummInfo->GetAppname();
summ.m_strTitle = m_pSummInfo->GetTitle();
summ.m_strSubj = m_pSummInfo->GetSubject();
summ.m_strAuthor = m_pSummInfo->GetAuthor();
summ.m_strKeywd = m_pSummInfo->GetKeywords();
summ.m_strCmt = m_pSummInfo->GetComments();
summ.m_strTempl = m_pSummInfo->GetTemplate();
stat.m_strSavedBy = m_pSummInfo->GetLastAuthor();
stat.m_strRevNum = m_pSummInfo->GetRevNum();
stat.m_strEditTime = m_pSummInfo->GetEditTime();
stat.m_strLastPrint = m_pSummInfo->GetLastPrintDate();
stat.m_strCreateDate = m_pSummInfo->GetCreateDate();
stat.m_strLastSave = m_pSummInfo->GetLastSaveDate();
stat.m_strNumPages = m_pSummInfo->GetNumPages();
stat.m_strNumWords = m_pSummInfo->GetNumWords();
stat.m_strNumChars = m_pSummInfo->GetNumChars();
stat.m_strSecurity = m_pSummInfo->GetSecurity();
if (sheet.DoModal() != IDOK)
return;
m_pSummInfo->SetAuthor(summ.m_strAuthor);
m_pSummInfo->SetKeywords(summ.m_strKeywd);
m_pSummInfo->SetSubject(summ.m_strSubj);
m_pSummInfo->SetComments(summ.m_strCmt);
m_pSummInfo->SetTemplate(summ.m_strTempl);
m_pSummInfo->SetTitle(summ.m_strTitle);
SetModifiedFlag();
}