drawdoc.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:8k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // drawdoc.cpp : implementation of the CDrawDoc class
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "drawcli.h"
  22. #include "drawdoc.h"
  23. #include "drawvw.h"
  24. #include "drawobj.h"
  25. #include "cntritem.h"
  26. #include "summpage.h"
  27. #include "statpage.h"
  28. #ifdef _DEBUG
  29. #undef THIS_FILE
  30. static char BASED_CODE THIS_FILE[] = __FILE__;
  31. #endif
  32. /////////////////////////////////////////////////////////////////////////////
  33. // CDrawDoc
  34. IMPLEMENT_DYNCREATE(CDrawDoc, COleDocument)
  35. BEGIN_MESSAGE_MAP(CDrawDoc, COleDocument)
  36. //{{AFX_MSG_MAP(CDrawDoc)
  37. ON_COMMAND(ID_VIEW_PAPERCOLOR, OnViewPaperColor)
  38. ON_COMMAND(ID_FILE_SUMMARYINFO, OnFileSummaryInfo)
  39. //}}AFX_MSG_MAP
  40. // Enable default OLE container implementation
  41. ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, COleDocument::OnUpdatePasteMenu)
  42. ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE_LINK, COleDocument::OnUpdatePasteLinkMenu)
  43. ON_UPDATE_COMMAND_UI(ID_OLE_EDIT_LINKS, COleDocument::OnUpdateEditLinksMenu)
  44. ON_COMMAND(ID_OLE_EDIT_LINKS, COleDocument::OnEditLinks)
  45. ON_UPDATE_COMMAND_UI(ID_OLE_VERB_FIRST, COleDocument::OnUpdateObjectVerbMenu)
  46. // MAPI support
  47. ON_COMMAND(ID_FILE_SEND_MAIL, OnFileSendMail)
  48. ON_UPDATE_COMMAND_UI(ID_FILE_SEND_MAIL, OnUpdateFileSendMail)
  49. END_MESSAGE_MAP()
  50. /////////////////////////////////////////////////////////////////////////////
  51. // CDrawDoc construction/destruction
  52. CDrawDoc::CDrawDoc()
  53. {
  54. EnableCompoundFile();
  55. m_nMapMode = MM_ANISOTROPIC;
  56. m_paperColor = RGB(255, 255, 255);
  57. m_pSummInfo = NULL;
  58. ComputePageSize();
  59. }
  60. CDrawDoc::~CDrawDoc()
  61. {
  62. POSITION pos = m_objects.GetHeadPosition();
  63. while (pos != NULL)
  64. delete m_objects.GetNext(pos);
  65. delete m_pSummInfo;
  66. }
  67. BOOL CDrawDoc::OnNewDocument()
  68. {
  69. if (!COleDocument::OnNewDocument())
  70. return FALSE;
  71. // reinitialization code
  72. // (SDI documents will reuse this document)
  73. if(m_pSummInfo != NULL)
  74. delete m_pSummInfo;
  75. m_pSummInfo = new CSummInfo;
  76. // Title, Subject, Author, Keywords default to empty string
  77. // Comments, Template, SavedBy default to empty string
  78. // LastSave, LastPrint, EditTime, RevNum default to 0
  79. m_pSummInfo->StartEditTimeCount();
  80. m_pSummInfo->RecordCreateDate();
  81. m_pSummInfo->SetNumPages(1);
  82. // NumWords, NumChars default to 0
  83. m_pSummInfo->SetAppname( _T("DrawCli") );
  84. // Security defaults to 0
  85. return TRUE;
  86. }
  87. BOOL CDrawDoc::OnOpenDocument(LPCTSTR lpszPathName)
  88. {
  89. if( m_pSummInfo != NULL)
  90. delete m_pSummInfo;
  91. m_pSummInfo = new CSummInfo;
  92. m_pSummInfo->StartEditTimeCount();
  93. return COleDocument::OnOpenDocument(lpszPathName);
  94. }
  95. BOOL CDrawDoc::OnSaveDocument(LPCTSTR lpszPathName)
  96. {
  97. m_pSummInfo->RecordSaveDate();
  98. m_pSummInfo->IncrRevNum();
  99. m_pSummInfo->SetLastAuthor(m_pSummInfo->GetAuthor());
  100. m_pSummInfo->AddCountToEditTime();
  101. m_pSummInfo->StartEditTimeCount();
  102. return COleDocument::OnSaveDocument(lpszPathName);
  103. }
  104. /////////////////////////////////////////////////////////////////////////////
  105. // CDrawDoc serialization
  106. void CDrawDoc::Serialize(CArchive& ar)
  107. {
  108. if (ar.IsStoring())
  109. {
  110. ar << m_paperColor;
  111. m_objects.Serialize(ar);
  112. m_pSummInfo->WriteToStorage(m_lpRootStg);
  113. }
  114. else
  115. {
  116. ar >> m_paperColor;
  117. m_objects.Serialize(ar);
  118. m_pSummInfo->ReadFromStorage(m_lpRootStg);
  119. }
  120. // By calling the base class COleDocument, we enable serialization
  121. //  of the container document's COleClientItem objects automatically.
  122. COleDocument::Serialize(ar);
  123. }
  124. /////////////////////////////////////////////////////////////////////////////
  125. // CDrawDoc implementation
  126. void CDrawDoc::Draw(CDC* pDC, CDrawView* pView)
  127. {
  128. POSITION pos = m_objects.GetHeadPosition();
  129. while (pos != NULL)
  130. {
  131. CDrawObj* pObj = m_objects.GetNext(pos);
  132. pObj->Draw(pDC);
  133. if (pView->m_bActive && !pDC->IsPrinting() && pView->IsSelected(pObj))
  134. pObj->DrawTracker(pDC, CDrawObj::selected);
  135. }
  136. }
  137. void CDrawDoc::Add(CDrawObj* pObj)
  138. {
  139. m_objects.AddTail(pObj);
  140. pObj->m_pDocument = this;
  141. SetModifiedFlag();
  142. }
  143. void CDrawDoc::Remove(CDrawObj* pObj)
  144. {
  145. // Find and remove from document
  146. POSITION pos = m_objects.Find(pObj);
  147. if (pos != NULL)
  148. m_objects.RemoveAt(pos);
  149. // set document modified flag
  150. SetModifiedFlag();
  151. // call remove for each view so that the view can remove from m_selection
  152. pos = GetFirstViewPosition();
  153. while (pos != NULL)
  154. ((CDrawView*)GetNextView(pos))->Remove(pObj);
  155. }
  156. // point is in logical coordinates
  157. CDrawObj* CDrawDoc::ObjectAt(const CPoint& point)
  158. {
  159. CRect rect(point, CSize(1, 1));
  160. POSITION pos = m_objects.GetTailPosition();
  161. while (pos != NULL)
  162. {
  163. CDrawObj* pObj = m_objects.GetPrev(pos);
  164. if (pObj->Intersects(rect))
  165. return pObj;
  166. }
  167. return NULL;
  168. }
  169. void CDrawDoc::ComputePageSize()
  170. {
  171. CSize new_size(850, 1100);  // 8.5" x 11" default
  172. CPrintDialog dlg(FALSE);
  173. if (AfxGetApp()->GetPrinterDeviceDefaults(&dlg.m_pd))
  174. {
  175. // GetPrinterDC returns a HDC so attach it
  176. CDC dc;
  177. HDC hDC= dlg.CreatePrinterDC();
  178. ASSERT(hDC != NULL);
  179. dc.Attach(hDC);
  180. // Get the size of the page in loenglish
  181. new_size.cx = MulDiv(dc.GetDeviceCaps(HORZSIZE), 1000, 254);
  182. new_size.cy = MulDiv(dc.GetDeviceCaps(VERTSIZE), 1000, 254);
  183. }
  184. // if size changed then iterate over views and reset
  185. if (new_size != m_size)
  186. {
  187. m_size = new_size;
  188. POSITION pos = GetFirstViewPosition();
  189. while (pos != NULL)
  190. ((CDrawView*)GetNextView(pos))->SetPageSize(m_size);
  191. }
  192. }
  193. void CDrawDoc::OnViewPaperColor()
  194. {
  195. CColorDialog dlg;
  196. if (dlg.DoModal() != IDOK)
  197. return;
  198. m_paperColor = dlg.GetColor();
  199. SetModifiedFlag();
  200. UpdateAllViews(NULL);
  201. }
  202. /////////////////////////////////////////////////////////////////////////////
  203. // CDrawDoc diagnostics
  204. #ifdef _DEBUG
  205. void CDrawDoc::AssertValid() const
  206. {
  207. COleDocument::AssertValid();
  208. }
  209. void CDrawDoc::Dump(CDumpContext& dc) const
  210. {
  211. COleDocument::Dump(dc);
  212. }
  213. #endif //_DEBUG
  214. /////////////////////////////////////////////////////////////////////////////
  215. // CDrawDoc commands
  216. void CDrawDoc::OnFileSummaryInfo()
  217. {
  218. ASSERT_VALID(this);
  219. CPropertySheet sheet( _T("Document Properties") );
  220. CSummPage summ;
  221. CStatPage stat;
  222. sheet.AddPage( &summ );
  223. sheet.AddPage( &stat );
  224. summ.m_strAppname = m_pSummInfo->GetAppname();
  225. summ.m_strTitle   = m_pSummInfo->GetTitle();
  226. summ.m_strSubj    = m_pSummInfo->GetSubject();
  227. summ.m_strAuthor  = m_pSummInfo->GetAuthor();
  228. summ.m_strKeywd   = m_pSummInfo->GetKeywords();
  229. summ.m_strCmt     = m_pSummInfo->GetComments();
  230. summ.m_strTempl   = m_pSummInfo->GetTemplate();
  231. stat.m_strSavedBy    = m_pSummInfo->GetLastAuthor();
  232. stat.m_strRevNum     = m_pSummInfo->GetRevNum();
  233. stat.m_strEditTime   = m_pSummInfo->GetEditTime();
  234. stat.m_strLastPrint  = m_pSummInfo->GetLastPrintDate();
  235. stat.m_strCreateDate = m_pSummInfo->GetCreateDate();
  236. stat.m_strLastSave   = m_pSummInfo->GetLastSaveDate();
  237. stat.m_strNumPages   = m_pSummInfo->GetNumPages();
  238. stat.m_strNumWords   = m_pSummInfo->GetNumWords();
  239. stat.m_strNumChars   = m_pSummInfo->GetNumChars();
  240. stat.m_strSecurity   = m_pSummInfo->GetSecurity();
  241. if (sheet.DoModal() != IDOK)
  242. return;
  243. m_pSummInfo->SetAuthor(summ.m_strAuthor);
  244. m_pSummInfo->SetKeywords(summ.m_strKeywd);
  245. m_pSummInfo->SetSubject(summ.m_strSubj);
  246. m_pSummInfo->SetComments(summ.m_strCmt);
  247. m_pSummInfo->SetTemplate(summ.m_strTempl);
  248. m_pSummInfo->SetTitle(summ.m_strTitle);
  249. SetModifiedFlag();
  250. }