DrawDoc.cpp
上传用户:seaboy_04
上传日期:2013-02-24
资源大小:284k
文件大小:5k
源码类别:

其他行业

开发平台:

Visual C++

  1. // DrawDoc.cpp : implementation of the CDrawDoc class
  2. //
  3. #include "stdafx.h"
  4. #include "DrawCli.h"
  5. #include "DrawDoc.h"
  6. #include "CntrItem.h"
  7. #include "DrawObj.h"
  8. #include "DrawVw.h"
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. /////////////////////////////////////////////////////////////////////////////
  15. // CDrawDoc
  16. IMPLEMENT_DYNCREATE(CDrawDoc, COleDocument)
  17. BEGIN_MESSAGE_MAP(CDrawDoc, COleDocument)
  18. //{{AFX_MSG_MAP(CDrawDoc)
  19. ON_COMMAND(ID_VIEW_PAPERCOLOR, OnViewPapercolor)
  20. //}}AFX_MSG_MAP
  21. // Enable default OLE container implementation
  22. ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, COleDocument::OnUpdatePasteMenu)
  23. ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE_LINK, COleDocument::OnUpdatePasteLinkMenu)
  24. ON_UPDATE_COMMAND_UI(ID_OLE_EDIT_CONVERT, COleDocument::OnUpdateObjectVerbMenu)
  25. ON_COMMAND(ID_OLE_EDIT_CONVERT, COleDocument::OnEditConvert)
  26. ON_UPDATE_COMMAND_UI(ID_OLE_EDIT_LINKS, COleDocument::OnUpdateEditLinksMenu)
  27. ON_COMMAND(ID_OLE_EDIT_LINKS, COleDocument::OnEditLinks)
  28. ON_UPDATE_COMMAND_UI_RANGE(ID_OLE_VERB_FIRST, ID_OLE_VERB_LAST, COleDocument::OnUpdateObjectVerbMenu)
  29. END_MESSAGE_MAP()
  30. /////////////////////////////////////////////////////////////////////////////
  31. // CDrawDoc construction/destruction
  32. CDrawDoc::CDrawDoc()
  33. {
  34. // Use OLE compound files
  35. EnableCompoundFile();
  36. m_nMapMode = MM_ANISOTROPIC;
  37. m_paperColor = RGB(255, 255, 255);
  38. ComputePageSize();
  39. }
  40. CDrawDoc::~CDrawDoc()
  41. {
  42. }
  43. BOOL CDrawDoc::OnNewDocument()
  44. {
  45. if (!COleDocument::OnNewDocument())
  46. return FALSE;
  47. // TODO: add reinitialization code here
  48. // (SDI documents will reuse this document)
  49. return TRUE;
  50. }
  51. /////////////////////////////////////////////////////////////////////////////
  52. // CDrawDoc serialization
  53. void CDrawDoc::Serialize(CArchive& ar)
  54. {
  55. if (ar.IsStoring())
  56. {
  57. ar << m_paperColor;
  58. m_objects.Serialize(ar);
  59. }
  60. else
  61. {
  62. ar >> m_paperColor;
  63. m_objects.Serialize(ar);
  64. }
  65. // Calling the base class COleDocument enables serialization
  66. //  of the container document's COleClientItem objects.
  67. COleDocument::Serialize(ar);
  68. }
  69. /////////////////////////////////////////////////////////////////////////////
  70. // CDrawDoc diagnostics
  71. #ifdef _DEBUG
  72. void CDrawDoc::AssertValid() const
  73. {
  74. COleDocument::AssertValid();
  75. }
  76. void CDrawDoc::Dump(CDumpContext& dc) const
  77. {
  78. COleDocument::Dump(dc);
  79. }
  80. #endif //_DEBUG
  81. /////////////////////////////////////////////////////////////////////////////
  82. // CDrawDoc commands
  83. void CDrawDoc::Add(CDrawObj *pObj)
  84. {
  85. m_objects.AddTail(pObj);
  86. pObj->m_pDocument = this;
  87. SetModifiedFlag();
  88. }
  89. CDrawObj* CDrawDoc::ObjectAt(const CPoint& point)
  90. {
  91. CRect rect(point, CSize(1, 1));
  92. POSITION pos = m_objects.GetTailPosition();
  93. while (pos != NULL)
  94. {
  95. CDrawObj* pObj = m_objects.GetPrev(pos);
  96. if (pObj->Intersects(rect))
  97. return pObj;
  98. }
  99. return NULL;
  100. }
  101. void CDrawDoc::Remove(CDrawObj* pObj)
  102. {
  103. // Find and remove from document
  104. POSITION pos = m_objects.Find(pObj);
  105. if (pos != NULL)
  106. m_objects.RemoveAt(pos);
  107. // set document modified flag
  108. SetModifiedFlag();
  109. // call remove for each view so that the view can remove from m_selection
  110. pos = GetFirstViewPosition();
  111. while (pos != NULL)
  112. ((CDrawView*)GetNextView(pos))->Remove(pObj);
  113. }
  114. void CDrawDoc::Draw(CDC* pDC,CDrawView* pView)
  115. {
  116.     POSITION pos = m_objects.GetHeadPosition();
  117. while (pos != NULL)
  118. {
  119. CDrawObj* pObj = m_objects.GetNext(pos);
  120. pObj->Draw(pDC);
  121. if (pView->m_bActive && !pDC->IsPrinting() && pView->IsSelected(pObj))
  122. pObj->DrawTracker(pDC, CDrawObj::selected);
  123. }
  124. }
  125. void CDrawDoc::ComputePageSize()
  126. {
  127. CSize new_size(800, 600);  // 8.5" x 11" default
  128. CPrintDialog dlg(FALSE);
  129. if (AfxGetApp()->GetPrinterDeviceDefaults(&dlg.m_pd))
  130. {
  131. // GetPrinterDC returns a HDC so attach it
  132. CDC dc;
  133. HDC hDC= dlg.CreatePrinterDC();
  134. ASSERT(hDC != NULL);
  135. dc.Attach(hDC);
  136. // Get the size of the page in loenglish
  137. new_size.cx = MulDiv(dc.GetDeviceCaps(HORZSIZE), 1000, 254);
  138. new_size.cy = MulDiv(dc.GetDeviceCaps(VERTSIZE), 1000, 254);
  139. }
  140. // if size changed then iterate over views and reset
  141. if (new_size != m_size)
  142. {
  143. m_size = new_size;
  144. POSITION pos = GetFirstViewPosition();
  145. while (pos != NULL)
  146. ((CDrawView*)GetNextView(pos))->SetPageSize(m_size);
  147. }
  148. }
  149. void CDrawDoc::OnViewPapercolor() 
  150. {
  151. CColorDialog dlg;
  152. if (dlg.DoModal() != IDOK)
  153. return;
  154. m_paperColor = dlg.GetColor();
  155. SetModifiedFlag();
  156. UpdateAllViews(NULL);
  157. }