rectitem.cpp
上传用户:biuytresa
上传日期:2007-12-07
资源大小:721k
文件大小:7k
源码类别:

DNA

开发平台:

Visual C++

  1. // rectitem.cpp : implementation of the CRectItem class
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12. #include "stdafx.h"
  13. #include <afxpriv.h>
  14. #include "oclient.h"
  15. #include "maindoc.h"
  16. #include "mainview.h"
  17. #include "rectitem.h"
  18. #ifdef _DEBUG
  19. #undef THIS_FILE
  20. static char BASED_CODE THIS_FILE[] = __FILE__;
  21. #endif
  22. /////////////////////////////////////////////////////////////////////////////
  23. IMPLEMENT_SERIAL(CRectItem, COleClientItem, 0)
  24. CRectItem::CRectItem(COleDocument* pContainer) : COleClientItem(pContainer) ,
  25. m_ptPos(10, -10), m_sizeContent(0,0), m_sizeIcon(0,0),
  26. m_sizeContentExtent(0, 0), m_sizeIconExtent(0, 0)
  27. {
  28. }
  29. CRectItem::CRectItem() : m_ptPos(10, -10), m_sizeContent(0,0), m_sizeIcon(0,0),
  30. m_sizeContentExtent(0, 0), m_sizeIconExtent(0, 0)
  31. {
  32. }
  33. CRectItem::~CRectItem()
  34. {
  35. }
  36. void CRectItem::Invalidate(CView* pNotThisView)
  37. {
  38. GetDocument()->UpdateAllViews(pNotThisView, 0, this);
  39. }
  40. /////////////////////////////////////////////////////////////////////////////
  41. CSize CRectItem::GetSize()
  42. {
  43. DVASPECT dv = GetDrawAspect();
  44. if (dv == DVASPECT_ICON)
  45. return m_sizeIcon;
  46. else
  47. return m_sizeContent;
  48. }
  49. CSize CRectItem::GetBaseSize()
  50. {
  51. DVASPECT dv = GetDrawAspect();
  52. if (dv == DVASPECT_ICON)
  53. return m_sizeIconExtent;
  54. else
  55. return m_sizeContentExtent;
  56. }
  57. void CRectItem::SetSize(CSize size)
  58. {
  59. DVASPECT dv = GetDrawAspect();
  60. if (dv == DVASPECT_ICON)
  61. m_sizeIcon = size;
  62. else
  63. m_sizeContent = size;
  64. }
  65. void CRectItem::SetBaseSize(CSize size)
  66. {
  67. DVASPECT dv = GetDrawAspect();
  68. if (dv == DVASPECT_ICON)
  69. m_sizeIconExtent = size;
  70. else
  71. m_sizeContentExtent = size;
  72. }
  73. void CRectItem::SetRect(CRect& rect)
  74. {
  75. m_ptPos = rect.TopLeft();
  76. SetSize(rect.Size());
  77. }
  78. BOOL CRectItem::UpdateExtent()
  79. {
  80. // get size in pixels
  81. CSize size;
  82. if (!GetCachedExtent(&size))
  83. return FALSE;       // blank
  84. Invalidate();   // invalidate the old size/position
  85. CSize sizeBase = GetBaseSize();
  86. if (size == sizeBase) // no change
  87. return FALSE;
  88. // if new object (i.e. m_extent is empty) setup position
  89. if (sizeBase == CSize(0,0))
  90. {
  91. // convert to document coords
  92. CSize sizeNew(MulDiv(size.cx, 10, 254), - MulDiv(size.cy, 10, 254));
  93. SetSize(sizeNew);
  94. }
  95. else
  96. {
  97. if (!IsInPlaceActive() && size != sizeBase)
  98. {
  99. // data changed and not inplace, so scale up rect as well
  100. CSize sizeCur = GetSize();
  101. sizeCur.cx = MulDiv(sizeCur.cx, size.cx, sizeBase.cx);
  102. sizeCur.cy = - MulDiv(-sizeCur.cy, size.cy, sizeBase.cy);
  103. SetSize(sizeCur);
  104. }
  105. }
  106. SetBaseSize(size);
  107. Invalidate();   // as well as the new size/position
  108. return TRUE;
  109. }
  110. BOOL CRectItem::OnChangeItemPosition(const CRect& rectPos)
  111. {
  112. CMainView* pView = GetActiveView();
  113. if (pView == NULL)
  114. return FALSE;
  115. ASSERT_VALID(pView);
  116. CRect rc = rectPos;
  117. pView->ClientToDoc(rc);
  118. if (rc != GetRect())
  119. {
  120. // invalidate old item
  121. Invalidate();
  122. // update to new rectangle
  123. SetRect(rc);
  124. GetDocument()->SetModifiedFlag();
  125. CSize sizeExtent;
  126. GetCachedExtent(&sizeExtent);
  127. SetBaseSize(sizeExtent);
  128. // and invalidate new
  129. Invalidate();
  130. }
  131. return COleClientItem::OnChangeItemPosition(rectPos);
  132. }
  133. void CRectItem::OnActivate()
  134. {
  135. // allow only one inplace active item per frame
  136. CMainView* pView = GetActiveView();
  137. ASSERT_VALID(pView);
  138. COleClientItem* pItem = GetDocument()->GetInPlaceActiveItem(pView);
  139. if (pItem != NULL && pItem != this)
  140. pItem->Close();
  141. COleClientItem::OnActivate();
  142. // set selection to an item when it becomes active
  143. pView->SetSelection(this);
  144. }
  145. void CRectItem::OnDeactivateUI(BOOL bUndoable)
  146. {
  147. COleClientItem::OnDeactivateUI(bUndoable);
  148. // hide the object if it is not an outside-in object
  149. DWORD dwMisc = 0;
  150. m_lpObject->GetMiscStatus(GetDrawAspect(), &dwMisc);
  151. if (dwMisc & OLEMISC_INSIDEOUT)
  152. DoVerb(OLEIVERB_HIDE, NULL);
  153. }
  154. void CRectItem::OnChange(OLE_NOTIFICATION nCode, DWORD dwParam)
  155. {
  156. COleClientItem::OnChange(nCode, dwParam);
  157. switch(nCode)
  158. {
  159. case OLE_CHANGED:
  160. UpdateExtent();
  161. Invalidate();
  162. break;
  163. case OLE_CHANGED_ASPECT:
  164. case OLE_CHANGED_STATE:
  165. Invalidate();
  166. break;
  167. }
  168. }
  169. void CRectItem::OnGetItemPosition(CRect& rPosition)
  170. {
  171. ASSERT_VALID(this);
  172. if (GetSize() == CSize(0,0))
  173. UpdateExtent();
  174. // copy m_rect, which is in document coordinates
  175. rPosition = GetRect();
  176. CMainView* pView = GetActiveView();
  177. ASSERT_VALID(pView);
  178. pView->DocToClient(rPosition);
  179. }
  180. void CRectItem::Move(CRect &rc)
  181. {
  182. // invalidate old rect
  183. Invalidate();
  184. // invalidate new
  185. SetRect(rc);
  186. Invalidate();
  187. // update item rect when in-place active
  188. if (IsInPlaceActive())
  189. SetItemRects();
  190. }
  191. void CRectItem::Serialize(CArchive& ar)
  192. {
  193. CRect rect;
  194. // IMPORTANT: when using "easy" serialize -- call base class FIRST!
  195. //  (not strictly necessary, but a good idea)
  196. COleClientItem::Serialize(ar);
  197. // now store/retrieve data specific to CRectItem
  198. if (ar.IsStoring())
  199. {
  200. WORD w = 0x5500;        // magic value
  201. ar << w << m_ptPos << m_sizeIcon << m_sizeIconExtent <<
  202. m_sizeContent << m_sizeContentExtent;
  203. }
  204. else
  205. {
  206. WORD w;
  207. ar >> w >> m_ptPos >> m_sizeIcon >> m_sizeIconExtent >>
  208. m_sizeContent >> m_sizeContentExtent;
  209. if (w != 0x5500)
  210. {
  211. TRACE0("Bad magic number in front of an item wndn");
  212. AfxThrowArchiveException(CArchiveException::generic);
  213. }
  214. }
  215. }
  216. void CRectItem::ResetSize()
  217. {
  218. ASSERT_VALID(this);
  219. Invalidate();
  220. SetBaseSize(CSize(0, 0));
  221. UpdateExtent();
  222. }
  223. // OnGetClipboardData is used by CopyToClipboard and DoDragDrop
  224. COleDataSource* CRectItem::OnGetClipboardData(
  225. BOOL bIncludeLink, LPPOINT lpOffset, LPSIZE lpSize)
  226. {
  227. ASSERT_VALID(this);
  228. COleDataSource* pDataSource = new COleDataSource;
  229. TRY
  230. {
  231. GetNativeClipboardData(pDataSource);
  232. GetClipboardData(pDataSource, bIncludeLink, lpOffset, lpSize);
  233. }
  234. CATCH_ALL(e)
  235. {
  236. delete pDataSource;
  237. THROW_LAST();
  238. }
  239. END_CATCH_ALL
  240. ASSERT_VALID(pDataSource);
  241. return pDataSource;
  242. }
  243. void CRectItem::GetNativeClipboardData(COleDataSource* pDataSource)
  244. {
  245. ASSERT_VALID(this);
  246. ASSERT_VALID(GetDocument());
  247. // Create a shared file and associate a CArchive with it
  248. CSharedFile file;
  249. CArchive ar(&file, CArchive::store);
  250. // Serialize selected objects to the archive
  251. Serialize(ar);
  252. ar.Close();
  253. pDataSource->CacheGlobalData(CMainDoc::m_cfPrivate, file.Detach());
  254. }
  255. /////////////////////////////////////////////////////////////////////////////