projDoc.cpp
上传用户:ywlong9188
上传日期:2022-05-31
资源大小:2656k
文件大小:6k
源码类别:

远程控制编程

开发平台:

C/C++

  1. // ProjDoc.cpp : implementation of the CProjDoc class
  2. //
  3. #include "stdafx.h"
  4. #include "Proj.h"
  5. #include "ProjDoc.h"
  6. #include "ProjView.h"
  7. #include "drawobj.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CProjDoc
  15. IMPLEMENT_DYNCREATE(CProjDoc, CDocument)
  16. BEGIN_MESSAGE_MAP(CProjDoc, CDocument)
  17. //{{AFX_MSG_MAP(CProjDoc)
  18. ON_COMMAND(ID_VIEW_PAPERCOLOR, OnViewPaperColor)
  19. //}}AFX_MSG_MAP
  20. END_MESSAGE_MAP()
  21. /////////////////////////////////////////////////////////////////////////////
  22. // CProjDoc construction/destruction
  23. CProjDoc::CProjDoc()
  24. {
  25. m_nMapMode = MM_ANISOTROPIC;
  26. m_paperColor = RGB(192, 192, 192);
  27. ComputePageSize();
  28. char path[100];
  29. CString temp;
  30. GetCurrentDirectory(100,path);
  31. temp.Format("%s\grf.lib",path);
  32. m_filename.Format("%s\lib",path);
  33. CreateDirectory(m_filename,NULL);
  34. m_directory = m_filename;
  35. m_filename=m_filename+"\grf.lib";
  36. if(MoveFile(temp,m_filename) == TRUE)
  37. ::MessageBox(NULL,"成功加载图形库!","图形组态",MB_ICONEXCLAMATION+MB_OK);
  38. if(!IsExist())
  39. ::MessageBox(NULL,"没有发现图形库!","图形组态",MB_ICONEXCLAMATION+MB_OK);
  40. }
  41. CProjDoc::~CProjDoc()
  42. {
  43. while(m_customList.GetHeadPosition())
  44. delete m_customList.RemoveHead();
  45. }
  46. BOOL CProjDoc::IsExist()
  47. {
  48. CFile file;
  49. if(file.Open(m_filename,CFile::modeReadWrite))
  50. {
  51. file.Close();
  52. return TRUE;
  53. }
  54. return FALSE;
  55. }
  56. BOOL CProjDoc::CreateLib()
  57. {
  58. CFile file;
  59. if(file.Open(m_filename,CFile::modeCreate))
  60. {
  61. file.Close();
  62. return TRUE;
  63. }
  64. return FALSE;
  65. }
  66. BOOL CProjDoc::LoadFromLib()
  67. {
  68. CFile file;
  69. try{
  70. if(!file.Open(m_filename,CFile::modeReadWrite))
  71. {
  72. return FALSE;
  73. }
  74. while(m_customList.GetHeadPosition())
  75. delete m_customList.RemoveHead();
  76. try{
  77. CArchive ar(&file,CArchive::load);
  78. m_customList.Serialize(ar);
  79. }
  80. catch(CException* e)
  81. {
  82. //e->ReportError();
  83. e->Delete();
  84. }
  85. }
  86. catch(CException* e)
  87. {
  88. e->Delete();
  89. if(file.m_hFile != CFile::hFileNull)
  90. file.Close();
  91. AfxMessageBox("Can't open graphics library!");
  92. return FALSE;
  93. }
  94. if(file.m_hFile != CFile::hFileNull)
  95. file.Close();
  96. return TRUE;
  97. }
  98. void CProjDoc::StoreToLib()
  99. {
  100. CFile file;
  101. try{
  102. if(!file.Open(m_filename,CFile::modeReadWrite))
  103. {
  104. AfxMessageBox("Can't open graphics library!");
  105. return ;
  106. }
  107. CArchive ar(&file,CArchive::store);
  108. ar.m_pDocument = this;
  109. m_customList.Serialize(ar);
  110. }
  111. catch(CException* e)
  112. {
  113. e->Delete();
  114. if(file.m_hFile != CFile::hFileNull)
  115. file.Close();
  116. AfxMessageBox("Can't open graphics library!");
  117. return ;
  118. }
  119. if(file.m_hFile != CFile::hFileNull)
  120. file.Close();
  121. }
  122. BOOL CProjDoc::OnNewDocument()
  123. {
  124. if (!CDocument::OnNewDocument())
  125. return FALSE;
  126. // TODO: add reinitialization code here
  127. // (SDI documents will reuse this document)
  128. m_paperColor = RGB(192,192,192);
  129. return TRUE;
  130. }
  131. /////////////////////////////////////////////////////////////////////////////
  132. // CProjDoc serialization
  133. void CProjDoc::Serialize(CArchive& ar)
  134. {
  135. if (ar.IsStoring())
  136. {
  137. ar << m_paperColor;
  138. }
  139. else
  140. {
  141. ar >> m_paperColor;
  142. }
  143. m_objects.Serialize(ar);
  144. }
  145. /////////////////////////////////////////////////////////////////////////////
  146. // CProjDoc diagnostics
  147. #ifdef _DEBUG
  148. void CProjDoc::AssertValid() const
  149. {
  150. CDocument::AssertValid();
  151. }
  152. void CProjDoc::Dump(CDumpContext& dc) const
  153. {
  154. CDocument::Dump(dc);
  155. }
  156. #endif //_DEBUG
  157. /////////////////////////////////////////////////////////////////////////////
  158. // CProjDoc commands
  159. void CProjDoc::Draw(CDC* pDC, CProjView* pView)
  160. {
  161. POSITION pos = m_objects.GetHeadPosition();
  162. while (pos != NULL)
  163. {
  164. CDrawObj* pObj = m_objects.GetNext(pos);
  165. if( pObj != NULL)
  166. pObj->Draw(pDC);
  167. if (pView->m_bActive && !pDC->IsPrinting() && pView->IsSelected(pObj))
  168. if( pObj != NULL)
  169. pObj->DrawTracker(pDC, CDrawObj::selected);
  170. }
  171. }
  172. void CProjDoc::AddToList(CDrawObj* pObj)
  173. {
  174. m_customList.AddTail(pObj);
  175. SetModifiedFlag();
  176. }
  177. void CProjDoc::Add(CDrawObj* pObj)
  178. {
  179. m_objects.AddTail(pObj);
  180. pObj->m_pDocument = this;
  181. SetModifiedFlag();
  182. }
  183. void CProjDoc::RemoveFromList(CDrawObj* pObj)
  184. {
  185. POSITION pos = m_customList.Find(pObj);
  186. if (pos != NULL){
  187. CDrawObj* p = m_customList.GetAt(pos);
  188. m_customList.RemoveAt(pos);
  189. p->Remove();
  190. }
  191. // set document modified flag
  192. SetModifiedFlag();
  193. }
  194. void CProjDoc::Remove(CDrawObj* pObj)
  195. {
  196. // Find and remove from document
  197. POSITION pos = m_objects.Find(pObj);
  198. if (pos != NULL)
  199. m_objects.RemoveAt(pos);
  200. // set document modified flag
  201. SetModifiedFlag();
  202. // call remove for each view so that the view can remove from m_selection
  203. pos = GetFirstViewPosition();
  204. while (pos != NULL)
  205. ((CProjView*)GetNextView(pos))->Remove(pObj);
  206. }
  207. // point is in logical coordinates
  208. CDrawObj* CProjDoc::ObjectAt(const CPoint& point)
  209. {
  210. CRect rect(point, CSize(1, 1));
  211. POSITION pos = m_objects.GetTailPosition();
  212. while (pos != NULL)
  213. {
  214. CDrawObj* pObj = m_objects.GetPrev(pos);
  215. if(pObj != NULL )
  216. if (pObj->Intersects(rect))
  217. return pObj;
  218. }
  219. return NULL;
  220. }
  221. void CProjDoc::ComputePageSize()
  222. {
  223. CSize new_size(2000, 1500);  // 8.5" x 11" default
  224. /*CPrintDialog dlg(FALSE);
  225. if (AfxGetApp()->GetPrinterDeviceDefaults(&dlg.m_pd))
  226. {
  227. // GetPrinterDC returns a HDC so attach it
  228. CDC dc;
  229. HDC hDC= dlg.CreatePrinterDC();
  230. ASSERT(hDC != NULL);
  231. dc.Attach(hDC);
  232. // Get the size of the page in loenglish
  233. int n =dc.GetDeviceCaps(HORZSIZE);
  234. int m= dc.GetDeviceCaps(VERTSIZE);
  235. new_size.cx = MulDiv(dc.GetDeviceCaps(HORZSIZE), 1000, 254);
  236. new_size.cy = MulDiv(dc.GetDeviceCaps(VERTSIZE), 1000, 254);
  237. }*/
  238. // if size changed then iterate over views and reset
  239. if (new_size != m_size)
  240. {
  241. m_size = new_size;
  242. POSITION pos = GetFirstViewPosition();
  243. while (pos != NULL)
  244. ((CProjView*)GetNextView(pos))->SetPageSize(m_size);
  245. }
  246. }
  247. void CProjDoc::OnViewPaperColor()
  248. {
  249. CColorDialog dlg;
  250. if (dlg.DoModal() != IDOK)
  251. return;
  252. m_paperColor = dlg.GetColor();
  253. SetModifiedFlag();
  254. UpdateAllViews(NULL);
  255. }
  256. /////////////////////////////////////////////////////////////////////////////
  257. void CProjDoc::DeleteContents()
  258. {
  259. while(m_objects.GetHeadPosition())
  260. {
  261. delete m_objects.RemoveHead();
  262. }
  263. CDrawObj::c_identify = 1;
  264. }