DrawCircle.cpp
上传用户:mosfetic
上传日期:2022-06-16
资源大小:4612k
文件大小:4k
源码类别:

GDI/图象编程

开发平台:

Visual C++

  1. // DrawCircle.cpp: implementation of the CDrawCircle class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "DrawSys.h"
  6. #include "DrawCircle.h"
  7. #include <cmath>
  8. #include "ViewProperty.h"
  9. #ifdef _DEBUG
  10. #undef THIS_FILE
  11. static char THIS_FILE[]=__FILE__;
  12. #define new DEBUG_NEW
  13. #endif
  14. //////////////////////////////////////////////////////////////////////
  15. // Construction/Destruction
  16. //////////////////////////////////////////////////////////////////////
  17. IMPLEMENT_SERIAL(CDrawCircle, CObject, 1)
  18. CDrawCircle::CDrawCircle()
  19. {
  20. m_ptCenter.x = m_ptCenter.y = 0;
  21. m_ptTemp.x = m_ptTemp.y = 0;
  22. m_nRadius = 0;
  23. m_bStart = FALSE;
  24. }
  25. CDrawCircle::~CDrawCircle()
  26. {
  27. }
  28. void CDrawCircle::Draw(CDC* pDC)
  29. {
  30. CRect rcDraw;
  31. CBrush* pBrush = NULL;
  32. CBrush* pOldBrush = NULL;
  33. pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
  34. pOldBrush = pDC->SelectObject(pBrush);
  35. rcDraw.left = m_ptCenter.x - m_nRadius;
  36. rcDraw.top = m_ptCenter.y  - m_nRadius;
  37. rcDraw.right = m_ptCenter.x + m_nRadius;
  38. rcDraw.bottom = m_ptCenter.y + m_nRadius;
  39. pDC->Ellipse(&rcDraw);
  40. pDC->SelectObject(pOldBrush);
  41. }
  42. void CDrawCircle::OnMouseMove(CDC* pDC, UINT nFlags, CPoint point)
  43. {
  44. int iDrawMode = 0;
  45. CRect rcDraw;
  46. CBrush* pBrush = NULL;
  47. CBrush* pOldBrush = NULL;
  48. if(m_bStart)
  49. {
  50. if(pDC)
  51. {
  52. pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
  53. pOldBrush = pDC->SelectObject(pBrush);
  54. iDrawMode = pDC->SetROP2(R2_NOTXORPEN);
  55. rcDraw.left = m_ptCenter.x - m_nRadius;
  56. rcDraw.top = m_ptCenter.y  - m_nRadius;
  57. rcDraw.right = m_ptCenter.x + m_nRadius;
  58. rcDraw.bottom = m_ptCenter.y + m_nRadius;
  59. pDC->Ellipse(&rcDraw);
  60. m_ptTemp = point;
  61. m_nRadius = CalcRadius(m_ptCenter, m_ptTemp);
  62. rcDraw.left = m_ptCenter.x - m_nRadius;
  63. rcDraw.top = m_ptCenter.y  - m_nRadius;
  64. rcDraw.right = m_ptCenter.x + m_nRadius;
  65. rcDraw.bottom = m_ptCenter.y + m_nRadius;
  66. pDC->Ellipse(&rcDraw);
  67. pDC->SetROP2(iDrawMode);
  68. pDC->SelectObject(pOldBrush);
  69. }
  70. }
  71. }
  72. void CDrawCircle::OnLButtonDown(CDC* pDC, UINT nFlags, CPoint point)
  73. {
  74. m_ptCenter = point;
  75. m_ptTemp = point;
  76. m_bStart = TRUE;
  77. }
  78. BOOL CDrawCircle::OnLButtonUp(CDC* pDC, UINT nFlags, CPoint point)
  79. {
  80. int iDrawMode = 0;
  81. CRect rcDraw;
  82. CBrush* pBrush = NULL;
  83. CBrush* pOldBrush = NULL;
  84. if(m_bStart)
  85. {
  86. if(pDC)
  87. {
  88. pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
  89. pOldBrush = pDC->SelectObject(pBrush);
  90. iDrawMode = pDC->SetROP2(R2_NOTXORPEN);
  91. rcDraw.left = m_ptCenter.x - m_nRadius;
  92. rcDraw.top = m_ptCenter.y  - m_nRadius;
  93. rcDraw.right = m_ptCenter.x + m_nRadius;
  94. rcDraw.bottom = m_ptCenter.y + m_nRadius;
  95. pDC->Ellipse(&rcDraw);
  96. m_ptTemp = point;
  97. m_nRadius = CalcRadius(m_ptCenter, m_ptTemp);
  98. rcDraw.left = m_ptCenter.x - m_nRadius;
  99. rcDraw.top = m_ptCenter.y  - m_nRadius;
  100. rcDraw.right = m_ptCenter.x + m_nRadius;
  101. rcDraw.bottom = m_ptCenter.y + m_nRadius;
  102. pDC->SetROP2(R2_COPYPEN);
  103. Draw(pDC);
  104. pDC->SetROP2(iDrawMode);
  105. pDC->SelectObject(pOldBrush);
  106. }
  107. m_bStart = FALSE;
  108. }
  109. return (!rcDraw.IsRectEmpty());
  110. }
  111. LONG CDrawCircle::CalcRadius(CPoint& ptFirst, CPoint& ptSecond)
  112. {
  113. double dRadius = 0.0;
  114. dRadius = pow(ptSecond.x-ptFirst.x, 2) + pow(ptSecond.y-ptFirst.y, 2);
  115. dRadius = sqrt(dRadius);
  116. return (LONG)dRadius;
  117. }
  118. void CDrawCircle::Serialize(CArchive& ar)
  119. {
  120. if (ar.IsStoring())
  121. {
  122. // TODO: add storing code here
  123. ar << m_ptCenter << m_nRadius;
  124. }
  125. else
  126. {
  127. // TODO: add loading code here
  128. ar >> m_ptCenter >> m_nRadius;
  129. }
  130. }
  131. BOOL CDrawCircle::PtInShape(CPoint point)
  132. {
  133. CRgn rgn;
  134. CRect rcDraw;
  135. BOOL m_bRetVal = FALSE;
  136. rcDraw.left = m_ptCenter.x - m_nRadius;
  137. rcDraw.top = m_ptCenter.y  - m_nRadius;
  138. rcDraw.right = m_ptCenter.x + m_nRadius;
  139. rcDraw.bottom = m_ptCenter.y + m_nRadius;
  140. rgn.CreateEllipticRgnIndirect(&rcDraw);
  141. m_bRetVal = rgn.PtInRegion(point);
  142. rgn.DeleteObject();
  143. return m_bRetVal;
  144. }
  145. void CDrawCircle::ShowProperty()
  146. {
  147. CRect rcDraw;
  148. CString strID;
  149. CString strTime;
  150. CViewProperty dlg;
  151. rcDraw.left = m_ptCenter.x - m_nRadius;
  152. rcDraw.top = m_ptCenter.y  - m_nRadius;
  153. rcDraw.right = m_ptCenter.x + m_nRadius;
  154. rcDraw.bottom = m_ptCenter.y + m_nRadius;
  155. dlg.m_strType = "Բ";
  156. MyFormatString(dlg.m_strID, m_iID);
  157. dlg.m_iLength = rcDraw.Width();
  158. dlg.m_iWidth  = rcDraw.Height();
  159. dlg.m_strTime = m_tmCreate.Format("%Y - %m - %d");
  160. dlg.DoModal();
  161. }