CNTRITEM.CPP
上传用户:sesekoo
上传日期:2020-07-18
资源大小:21543k
文件大小:5k
源码类别:

界面编程

开发平台:

Visual C++

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