RectangleTool.cpp
上传用户:hehe2haha
上传日期:2013-08-16
资源大小:161k
文件大小:3k
源码类别:

CAD

开发平台:

Visual C++

  1. // RectangleTool.cpp: implementation of the CRectangleTool class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "RectangleTool.h"
  6. #include "Rectangle.h"
  7. #include "WinApp.h"
  8. extern CWinApp g_theApp;
  9. //////////////////////////////////////////////////////////////////////
  10. // Construction/Destruction
  11. //////////////////////////////////////////////////////////////////////
  12. CRectangleTool::CRectangleTool()
  13. {
  14. }
  15. CRectangleTool::~CRectangleTool()
  16. {
  17. }
  18. void CRectangleTool::OnMouseMove(HWND hWnd, UINT nFlags, POINT ptPos) 
  19. {
  20. CDataBase *pDataBase = &(g_theApp.m_DataBase);
  21. if(m_eToolState == FirstHit)
  22. {
  23. HDC hdc      = ::GetDC(hWnd);
  24. int nOldMode = ::SetROP2(hdc,R2_XORPEN);
  25. HPEN hPen    = ::CreatePen( pDataBase->m_Shape.fnPenStyle,
  26.             pDataBase->m_Shape.nWidth,
  27.         pDataBase->m_Shape.crColor^ GetBkColor(hdc) );
  28. HPEN hOldPen = (HPEN)::SelectObject(hdc,hPen);
  29. //不进行填充
  30. ::SelectObject(hdc,GetStockObject(NULL_BRUSH));
  31. //擦去前一次线段 
  32. ::Rectangle( hdc,              
  33.        m_ptBeginPos.x,   
  34.        m_ptBeginPos.y,   
  35.        m_ptPrePos.x,  
  36.        m_ptPrePos.y);
  37. //画出这一次线段
  38. ::Rectangle( hdc,              
  39.        m_ptBeginPos.x,   
  40.        m_ptBeginPos.y,   
  41.        ptPos.x,  
  42.        ptPos.y);
  43. ::SetROP2(hdc,nOldMode);
  44. ::SelectObject(hdc,hOldPen);
  45. ::DeleteObject(hPen);
  46. ::ReleaseDC(hWnd,hdc);
  47. m_ptPrePos = ptPos;
  48. }
  49. }
  50. void CRectangleTool::OnRButtonDown(HWND hWnd,UINT nFlags, POINT ptPos)
  51. {
  52. CDataBase *pDataBase = &(g_theApp.m_DataBase);
  53. if(m_eToolState == FirstHit)
  54. {
  55. HDC hdc      = ::GetDC(hWnd);
  56. int nOldMode = ::SetROP2(hdc,R2_XORPEN);
  57. HPEN hPen    = ::CreatePen( pDataBase->m_Shape.fnPenStyle,
  58.             pDataBase->m_Shape.nWidth,
  59.     pDataBase->m_Shape.crColor^ GetBkColor(hdc) );
  60. ::SelectObject(hdc,hPen);
  61. //不进行填充
  62. ::SelectObject(hdc,GetStockObject(NULL_BRUSH));
  63. //擦去前一次线段 
  64. ::Rectangle( hdc,              
  65.        m_ptBeginPos.x,   
  66.        m_ptBeginPos.y,   
  67.        m_ptPrePos.x,  
  68.        m_ptPrePos.y);
  69. ::SetROP2(hdc,nOldMode);
  70. ::ReleaseDC(hWnd,hdc);
  71. }
  72. //取消画图状态
  73. OverCurTool(hWnd);
  74. }
  75. void CRectangleTool::OnLButtonDown(HWND hWnd,UINT nFlags, POINT ptPos)
  76. {
  77. CDataBase *pDataBase         = &(g_theApp.m_DataBase);
  78. CArray<CShape*> *pArrayShape = &(g_theApp.m_DataBase.m_ArrayShape);
  79. CRectangle *pShape           = NULL;
  80. if(m_eToolState == Init_State)
  81. {
  82. m_eToolState = FirstHit;
  83. m_ptBeginPos = m_ptPrePos = ptPos;
  84. }else if(m_eToolState == FirstHit)
  85. {
  86. m_eToolState = SecondHit;
  87. pShape       = new CRectangle;
  88. //保存图形样式
  89. pShape->crColor    = pDataBase->m_Shape.crColor;
  90. pShape->fnPenStyle = pDataBase->m_Shape.fnPenStyle;
  91. pShape->nWidth     = pDataBase->m_Shape.nWidth;
  92. pShape->m_ptFirstPos  = m_ptBeginPos;
  93. pShape->m_ptSecondPos = ptPos;
  94. //第一点和第二点不重合才保存
  95. if (pShape->m_ptFirstPos.x != ptPos.x || 
  96. pShape->m_ptFirstPos.y != ptPos.y)
  97. {
  98. //保存至数组
  99. pArrayShape->Add(pShape);
  100. }
  101. else
  102. {
  103. delete pShape;
  104. pShape = NULL;
  105. }
  106. //取消画图状态
  107. OverCurTool(hWnd);
  108. }
  109. }