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

对话框与窗口

开发平台:

Visual C++

  1. // cntritem.h : interface of the CDrawItem 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 "drawobj.h"
  24. #include "drawvw.h"
  25. #include "cntritem.h"
  26. #ifdef _DEBUG
  27. #undef THIS_FILE
  28. static char BASED_CODE THIS_FILE[] = __FILE__;
  29. #endif
  30. /////////////////////////////////////////////////////////////////////////////
  31. // CDrawItem implementation
  32. IMPLEMENT_SERIAL(CDrawItem, COleClientItem, 0)
  33. CDrawItem::CDrawItem(CDrawDoc* pContainer, CDrawOleObj* pDrawObj)
  34. : COleClientItem(pContainer)
  35. {
  36. m_pDrawObj = pDrawObj;
  37. }
  38. CDrawItem::~CDrawItem()
  39. {
  40. if (m_pDrawObj != NULL)
  41. m_pDrawObj->m_pClientItem = NULL;
  42. }
  43. void CDrawItem::OnChange(OLE_NOTIFICATION nCode, DWORD dwParam)
  44. {
  45. ASSERT_VALID(this);
  46. COleClientItem::OnChange(nCode, dwParam);
  47. switch(nCode)
  48. {
  49. case OLE_CHANGED_STATE:
  50. case OLE_CHANGED_ASPECT:
  51. m_pDrawObj->Invalidate();
  52. break;
  53. case OLE_CHANGED:
  54. UpdateExtent(); // extent may have changed
  55. m_pDrawObj->Invalidate();
  56. break;
  57. }
  58. }
  59. BOOL CDrawItem::OnChangeItemPosition(const CRect& rectPos)
  60. {
  61. ASSERT_VALID(this);
  62. CDrawView* pView = GetActiveView();
  63. ASSERT_VALID(pView);
  64. CRect rect = rectPos;
  65. pView->ClientToDoc(rect);
  66. if (rect != m_pDrawObj->m_position)
  67. {
  68. // invalidate old rectangle
  69. m_pDrawObj->Invalidate();
  70. // update to new rectangle
  71. m_pDrawObj->m_position = rect;
  72. GetExtent(&m_pDrawObj->m_extent);
  73. // and invalidate new rectangle
  74. m_pDrawObj->Invalidate();
  75. // mark document as dirty
  76. GetDocument()->SetModifiedFlag();
  77. }
  78. return COleClientItem::OnChangeItemPosition(rectPos);
  79. }
  80. void CDrawItem::OnGetItemPosition(CRect& rPosition)
  81. {
  82. ASSERT_VALID(this);
  83. // update to extent of item if m_position is not initialized
  84. if (m_pDrawObj->m_position.IsRectEmpty())
  85. UpdateExtent();
  86. // copy m_position, which is in document coordinates
  87. CDrawView* pView = GetActiveView();
  88. ASSERT_VALID(pView);
  89. rPosition = m_pDrawObj->m_position;
  90. pView->DocToClient(rPosition);
  91. }
  92. void CDrawItem::Serialize(CArchive& ar)
  93. {
  94. ASSERT_VALID(this);
  95. // Call base class first to read in COleClientItem data.
  96. // Note: this sets up the m_pDocument pointer returned from
  97. //  CDrawItem::GetDocument, therefore it is a good idea
  98. //  to call the base class Serialize first.
  99. COleClientItem::Serialize(ar);
  100. // now store/retrieve data specific to CDrawItem
  101. if (ar.IsStoring())
  102. {
  103. // TODO: add storing code here
  104. }
  105. else
  106. {
  107. // TODO: add loading code here
  108. }
  109. }
  110. BOOL CDrawItem::UpdateExtent()
  111. {
  112. CSize size;
  113. if (!GetExtent(&size) || size == m_pDrawObj->m_extent)
  114. return FALSE;       // blank
  115. // if new object (i.e. m_extent is empty) setup position
  116. if (m_pDrawObj->m_extent == CSize(0, 0))
  117. {
  118. m_pDrawObj->m_position.right =
  119. m_pDrawObj->m_position.left + MulDiv(size.cx, 10, 254);
  120. m_pDrawObj->m_position.bottom =
  121. m_pDrawObj->m_position.top - MulDiv(size.cy, 10, 254);
  122. }
  123. // else data changed so scale up rect as well
  124. else if (!IsInPlaceActive() && size != m_pDrawObj->m_extent)
  125. {
  126. m_pDrawObj->m_position.right = m_pDrawObj->m_position.left +
  127. MulDiv(m_pDrawObj->m_position.Width(), size.cx, m_pDrawObj->m_extent.cx);
  128. m_pDrawObj->m_position.bottom = m_pDrawObj->m_position.top +
  129. MulDiv(m_pDrawObj->m_position.Height(), size.cy, m_pDrawObj->m_extent.cy);
  130. }
  131. m_pDrawObj->m_extent = size;
  132. m_pDrawObj->Invalidate();   // redraw to the new size/position
  133. return TRUE;
  134. }
  135. void CDrawItem::ActiveStateChanged(BOOL bActive)
  136. {
  137. CMainFrame* pFrame = DYNAMIC_DOWNCAST(CMainFrame, AfxGetMainWnd());
  138. if (!pFrame)
  139. return;
  140. pFrame->m_paneManager.OnSetPreviewMode(bActive);
  141. pFrame->GetCommandBars()->OnSetPreviewMode(bActive);
  142. if (bActive)
  143. {
  144. CDocTemplate* pTemplate = GetDocument()->GetDocTemplate();
  145. HMENU hMenuOLE = pTemplate->m_hMenuInPlace;
  146. ::SetMenu(pFrame->GetSafeHwnd(), hMenuOLE);
  147. }
  148. pFrame->DelayRecalcLayout(FALSE);
  149. }
  150. void CDrawItem::OnActivate()
  151. {
  152. // allow only one inplace active item per frame
  153. CView* pView = GetActiveView();
  154. ASSERT_VALID(pView);
  155. COleClientItem* pItem = GetDocument()->GetInPlaceActiveItem(pView);
  156. if (pItem != NULL && pItem != this)
  157. pItem->Close();
  158. ActiveStateChanged(TRUE);
  159. COleClientItem::OnActivate();
  160. }
  161. void CDrawItem::OnDeactivateUI(BOOL bUndoable)
  162. {
  163. COleClientItem::OnDeactivateUI(bUndoable);
  164. // hide the object if it is not an outside-in object
  165. DWORD dwMisc = 0;
  166. m_lpObject->GetMiscStatus(GetDrawAspect(), &dwMisc);
  167. if (dwMisc & OLEMISC_INSIDEOUT)
  168. DoVerb(OLEIVERB_HIDE, NULL);
  169. ActiveStateChanged(FALSE);
  170. }
  171. /////////////////////////////////////////////////////////////////////////////
  172. // CDrawItem diagnostics
  173. #ifdef _DEBUG
  174. void CDrawItem::AssertValid() const
  175. {
  176. COleClientItem::AssertValid();
  177. }
  178. void CDrawItem::Dump(CDumpContext& dc) const
  179. {
  180. COleClientItem::Dump(dc);
  181. }
  182. #endif