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

其他行业

开发平台:

Visual C++

  1. // CntrItem.cpp : implementation of the CDrawItem class
  2. //
  3. #include "stdafx.h"
  4. #include "DrawCli.h"
  5. #include "DrawDoc.h"
  6. #include "DrawVw.h"
  7. #include "DrawObj.h"
  8. #include "CntrItem.h"
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. /////////////////////////////////////////////////////////////////////////////
  15. // CDrawItem implementation
  16. IMPLEMENT_SERIAL(CDrawItem, COleClientItem, 0)
  17. /*
  18. CDrawItem::CDrawItem(CDrawDoc* pContainer)
  19. : COleClientItem(pContainer)
  20. {
  21. // TODO: add one-time construction code here
  22. }
  23. */
  24. CDrawItem::CDrawItem(CDrawDoc* pContainer, CDrawOleObj* pDrawObj)
  25. : COleClientItem(pContainer)
  26. {
  27. m_pDrawObj = pDrawObj;
  28. }
  29. CDrawItem::~CDrawItem()
  30. {
  31. // TODO: add cleanup code here
  32. }
  33. void CDrawItem::OnChange(OLE_NOTIFICATION nCode, DWORD dwParam)
  34. {
  35. ASSERT_VALID(this);
  36. COleClientItem::OnChange(nCode, dwParam);
  37. // When an item is being edited (either in-place or fully open)
  38. //  it sends OnChange notifications for changes in the state of the
  39. //  item or visual appearance of its content.
  40. // TODO: invalidate the item by calling UpdateAllViews
  41. //  (with hints appropriate to your application)
  42. GetDocument()->UpdateAllViews(NULL);
  43. // for now just update ALL views/no hints
  44. }
  45. BOOL CDrawItem::OnChangeItemPosition(const CRect& rectPos)
  46. {
  47. ASSERT_VALID(this);
  48. // During in-place activation CDrawItem::OnChangeItemPosition
  49. //  is called by the server to change the position of the in-place
  50. //  window.  Usually, this is a result of the data in the server
  51. //  document changing such that the extent has changed or as a result
  52. //  of in-place resizing.
  53. //
  54. // The default here is to call the base class, which will call
  55. //  COleClientItem::SetItemRects to move the item
  56. //  to the new position.
  57. if (!COleClientItem::OnChangeItemPosition(rectPos))
  58. return FALSE;
  59. // TODO: update any cache you may have of the item's rectangle/extent
  60. return TRUE;
  61. }
  62. void CDrawItem::OnGetItemPosition(CRect& rPosition)
  63. {
  64. ASSERT_VALID(this);
  65. // During in-place activation, CDrawItem::OnGetItemPosition
  66. //  will be called to determine the location of this item.  The default
  67. //  implementation created from AppWizard simply returns a hard-coded
  68. //  rectangle.  Usually, this rectangle would reflect the current
  69. //  position of the item relative to the view used for activation.
  70. //  You can obtain the view by calling CDrawItem::GetActiveView.
  71. // TODO: return correct rectangle (in pixels) in rPosition
  72. rPosition.SetRect(10, 10, 210, 210);
  73. }
  74. void CDrawItem::OnActivate()
  75. {
  76.     // Allow only one inplace activate item per frame
  77.     CDrawView* pView = GetActiveView();
  78.     ASSERT_VALID(pView);
  79.     COleClientItem* pItem = GetDocument()->GetInPlaceActiveItem(pView);
  80.     if (pItem != NULL && pItem != this)
  81.         pItem->Close();
  82.     
  83.     COleClientItem::OnActivate();
  84. }
  85. void CDrawItem::OnDeactivateUI(BOOL bUndoable)
  86. {
  87. COleClientItem::OnDeactivateUI(bUndoable);
  88.     // Hide the object if it is not an outside-in object
  89.     DWORD dwMisc = 0;
  90.     m_lpObject->GetMiscStatus(GetDrawAspect(), &dwMisc);
  91.     if (dwMisc & OLEMISC_INSIDEOUT)
  92.         DoVerb(OLEIVERB_HIDE, NULL);
  93. }
  94. void CDrawItem::Serialize(CArchive& ar)
  95. {
  96. ASSERT_VALID(this);
  97. // Call base class first to read in COleClientItem data.
  98. // Since this sets up the m_pDocument pointer returned from
  99. //  CDrawItem::GetDocument, it is a good idea to call
  100. //  the base class Serialize first.
  101. COleClientItem::Serialize(ar);
  102. // now store/retrieve data specific to CDrawItem
  103. if (ar.IsStoring())
  104. {
  105. // TODO: add storing code here
  106. }
  107. else
  108. {
  109. // TODO: add loading code here
  110. }
  111. }
  112. /////////////////////////////////////////////////////////////////////////////
  113. // CDrawItem diagnostics
  114. #ifdef _DEBUG
  115. void CDrawItem::AssertValid() const
  116. {
  117. COleClientItem::AssertValid();
  118. }
  119. void CDrawItem::Dump(CDumpContext& dc) const
  120. {
  121. COleClientItem::Dump(dc);
  122. }
  123. #endif
  124. /////////////////////////////////////////////////////////////////////////////
  125. BOOL CDrawItem::UpdateExtent()
  126. {
  127. CSize size;
  128. if (!GetExtent(&size) || size == m_pDrawObj->m_extent)
  129. return FALSE;       // blank
  130. // if new object (i.e. m_extent is empty) setup position
  131. if (m_pDrawObj->m_extent == CSize(0, 0))
  132. {
  133. m_pDrawObj->m_position.right =
  134. m_pDrawObj->m_position.left + MulDiv(size.cx, 10, 254);
  135. m_pDrawObj->m_position.bottom =
  136. m_pDrawObj->m_position.top - MulDiv(size.cy, 10, 254);
  137. }
  138. // else data changed so scale up rect as well
  139. else if (!IsInPlaceActive() && size != m_pDrawObj->m_extent)
  140. {
  141. m_pDrawObj->m_position.right = m_pDrawObj->m_position.left +
  142. MulDiv(m_pDrawObj->m_position.Width(), size.cx, m_pDrawObj->m_extent.cx);
  143. m_pDrawObj->m_position.bottom = m_pDrawObj->m_position.top +
  144. MulDiv(m_pDrawObj->m_position.Height(), size.cy, m_pDrawObj->m_extent.cy);
  145. }
  146. m_pDrawObj->m_extent = size;
  147. m_pDrawObj->Invalidate();   // redraw to the new size/position
  148. return TRUE;
  149. }