CntrItem.cpp
上传用户:y440e3
上传日期:2010-03-08
资源大小:200k
文件大小:4k
源码类别:

GIS编程

开发平台:

Visual C++

  1. // CntrItem.cpp : implementation of the CDrawCntrItem class
  2. //
  3. #include "stdafx.h"
  4. #include "Draw.h"
  5. #include "DrawDoc.h"
  6. #include "DrawView.h"
  7. #include "CntrItem.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. extern void DPtoVP(float x,float y,int *X,int *Y);
  14. extern void VPtoDP(int x,int y,float *X,float *Y);
  15. extern BOOL IsRectCross(float minx,float miny,float maxx,float maxy);
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CDrawCntrItem implementation
  18. IMPLEMENT_SERIAL(CDrawCntrItem, COleClientItem, 0)
  19. CDrawCntrItem::CDrawCntrItem(CDrawDoc* pContainer)
  20. : COleClientItem(pContainer)
  21. {
  22. // TODO: add one-time construction code here
  23. VPtoDP(10,210,&m_X1,&m_Y1);
  24. VPtoDP(210,10,&m_X2,&m_Y2);
  25. b_Select=FALSE;
  26. }
  27. CDrawCntrItem::~CDrawCntrItem()
  28. {
  29. // TODO: add cleanup code here
  30. }
  31. void CDrawCntrItem::OnChange(OLE_NOTIFICATION nCode, DWORD dwParam)
  32. {
  33. ASSERT_VALID(this);
  34. COleClientItem::OnChange(nCode, dwParam);
  35. // When an item is being edited (either in-place or fully open)
  36. //  it sends OnChange notifications for changes in the state of the
  37. //  item or visual appearance of its content.
  38. // TODO: invalidate the item by calling UpdateAllViews
  39. //  (with hints appropriate to your application)
  40. GetDocument()->UpdateAllViews(NULL);
  41. // for now just update ALL views/no hints
  42. }
  43. BOOL CDrawCntrItem::OnChangeItemPosition(const CRect& rectPos)
  44. {
  45. ASSERT_VALID(this);
  46. // During in-place activation CDrawCntrItem::OnChangeItemPosition
  47. //  is called by the server to change the position of the in-place
  48. //  window.  Usually, this is a result of the data in the server
  49. //  document changing such that the extent has changed or as a result
  50. //  of in-place resizing.
  51. //
  52. // The default here is to call the base class, which will call
  53. //  COleClientItem::SetItemRects to move the item
  54. //  to the new position.
  55. if (!COleClientItem::OnChangeItemPosition(rectPos))
  56. return FALSE;
  57. // TODO: update any cache you may have of the item's rectangle/extent
  58. return TRUE;
  59. }
  60. void CDrawCntrItem::OnGetItemPosition(CRect& rPosition)
  61. {
  62. ASSERT_VALID(this);
  63. // During in-place activation, CDrawCntrItem::OnGetItemPosition
  64. //  will be called to determine the location of this item.  The default
  65. //  implementation created from AppWizard simply returns a hard-coded
  66. //  rectangle.  Usually, this rectangle would reflect the current
  67. //  position of the item relative to the view used for activation.
  68. //  You can obtain the view by calling CDrawCntrItem::GetActiveView.
  69. // TODO: return correct rectangle (in pixels) in rPosition
  70. rPosition.SetRect(10, 10, 210, 210);
  71. }
  72. void CDrawCntrItem::OnActivate()
  73. {
  74.     // Allow only one inplace activate item per frame
  75.     CDrawView* pView = GetActiveView();
  76.     ASSERT_VALID(pView);
  77.     COleClientItem* pItem = GetDocument()->GetInPlaceActiveItem(pView);
  78.     if (pItem != NULL && pItem != this)
  79.         pItem->Close();
  80.     
  81.     COleClientItem::OnActivate();
  82. }
  83. void CDrawCntrItem::OnDeactivateUI(BOOL bUndoable)
  84. {
  85. COleClientItem::OnDeactivateUI(bUndoable);
  86.     // Hide the object if it is not an outside-in object
  87.     DWORD dwMisc = 0;
  88.     m_lpObject->GetMiscStatus(GetDrawAspect(), &dwMisc);
  89.     if (dwMisc & OLEMISC_INSIDEOUT)
  90.         DoVerb(OLEIVERB_HIDE, NULL);
  91. }
  92. void CDrawCntrItem::Serialize(CArchive& ar)
  93. {
  94. ASSERT_VALID(this);
  95. COleClientItem::Serialize(ar);
  96. if (ar.IsStoring())
  97. {
  98. ar<<m_X1<<m_Y1<<m_X2<<m_Y2;
  99. }
  100. else
  101. {
  102. ar>>m_X1>>m_Y1>>m_X2>>m_Y2;
  103. b_Select=FALSE;
  104. }
  105. }
  106. /////////////////////////////////////////////////////////////////////////////
  107. // CDrawCntrItem diagnostics
  108. #ifdef _DEBUG
  109. void CDrawCntrItem::AssertValid() const
  110. {
  111. COleClientItem::AssertValid();
  112. }
  113. void CDrawCntrItem::Dump(CDumpContext& dc) const
  114. {
  115. COleClientItem::Dump(dc);
  116. }
  117. #endif
  118. /////////////////////////////////////////////////////////////////////////////
  119. void CDrawCntrItem::Draw(CDC * pDC)
  120. {
  121. int x1,y1,x2,y2;
  122. CRect m_rect;
  123. //加入判断是否在
  124. if(!IsRectCross(m_X1,m_Y1,m_X2,m_Y2))
  125. return;
  126. DPtoVP(m_X1,m_Y1,&x1,&y1);
  127. DPtoVP(m_X2,m_Y2,&x2,&y2);
  128. m_rect.SetRect(x1,y2,x2,y1);
  129. COleClientItem::Draw(pDC,m_rect);
  130. if(b_Select)
  131. pDC->InvertRect(&m_rect);
  132. }
  133. BOOL CDrawCntrItem::IsPoint(CPoint point)
  134. {
  135. float x1,y1;
  136. VPtoDP(point.x,point.y,&x1,&y1);
  137. if(x1>=m_X1&&x1<=m_X2&&y1>=m_Y1&&y1<=m_Y2)
  138. return TRUE;
  139. return FALSE;
  140. }