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

CAD

开发平台:

Visual C++

  1. // LineTool.cpp: implementation of the CLineTool class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Line.h"
  6. #include "LineTool.h"
  7. #include "WinApp.h"
  8. extern CWinApp g_theApp;
  9. //////////////////////////////////////////////////////////////////////
  10. // Construction/Destruction
  11. //////////////////////////////////////////////////////////////////////
  12. CLineTool::CLineTool()
  13. {
  14. }
  15. CLineTool::~CLineTool()
  16. {
  17. }
  18. void CLineTool::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. //设置异或模式
  25. int nOldMode = ::SetROP2(hdc,R2_XORPEN);
  26. //新建逻辑笔
  27. HPEN hPen    = ::CreatePen( pDataBase->m_Shape.fnPenStyle,
  28.             pDataBase->m_Shape.nWidth,
  29.     pDataBase->m_Shape.crColor^ GetBkColor(hdc) );
  30. HPEN hOldPen = (HPEN)::SelectObject(hdc,hPen);
  31. //擦去前一次线段
  32. CDraw::DrawLine(hdc,m_ptBeginPos,m_ptPrePos);
  33. //画出这一次线段
  34. CDraw::DrawLine(hdc,m_ptBeginPos,ptPos);
  35. //回恢复原有模式
  36. ::SetROP2(hdc,nOldMode);
  37. //放回原来的笔
  38. ::SelectObject(hdc,hOldPen);
  39. //删除新建的笔
  40. ::DeleteObject(hPen);
  41. ::ReleaseDC(hWnd,hdc);
  42. m_ptPrePos = ptPos;
  43. }
  44. }
  45. //功能:取消画线
  46. void CLineTool::OnRButtonDown(HWND hWnd,UINT nFlags, POINT ptPos)
  47. {
  48. CDataBase *pDataBase = &(g_theApp.m_DataBase);
  49. if(m_eToolState == FirstHit)
  50. {
  51. HDC hdc      = ::GetDC(hWnd);
  52. int nOldMode = ::SetROP2(hdc,R2_XORPEN);
  53. HPEN hPen    = ::CreatePen( pDataBase->m_Shape.fnPenStyle,
  54.             pDataBase->m_Shape.nWidth,
  55.     pDataBase->m_Shape.crColor^ GetBkColor(hdc) );
  56. HPEN hOldPen = (HPEN)::SelectObject(hdc,hPen);
  57. //擦去前一次线段 
  58. CDraw::DrawLine(hdc,m_ptBeginPos,m_ptPrePos);
  59. ::SetROP2(hdc,nOldMode);
  60. ::SelectObject(hdc,hOldPen);
  61. ::DeleteObject(hPen);
  62. ::ReleaseDC(hWnd,hdc);
  63. }
  64. //取消画图状态
  65. OverCurTool(hWnd);
  66. }
  67. void CLineTool::OnLButtonDown(HWND hWnd,UINT nFlags, POINT ptPos)
  68. {
  69. CDataBase *pDataBase         = &(g_theApp.m_DataBase);
  70. CArray<CShape*> *pArrayShape = &(g_theApp.m_DataBase.m_ArrayShape);
  71. CLine *pShape                = NULL;
  72. if(m_eToolState == Init_State)
  73. {
  74. m_eToolState = FirstHit;
  75. m_ptBeginPos = m_ptPrePos = ptPos;
  76. }
  77. else if(m_eToolState == FirstHit)
  78. {
  79. m_eToolState          = SecondHit;
  80. pShape                = new CLine;
  81. pShape->m_ptFirstPos  = m_ptBeginPos;
  82. pShape->m_ptSecondPos = ptPos;
  83. //保存图形样式
  84. pShape->crColor    = pDataBase->m_Shape.crColor;
  85. pShape->fnPenStyle = pDataBase->m_Shape.fnPenStyle;
  86. pShape->nWidth     = pDataBase->m_Shape.nWidth;
  87. //第一点和第二点不重合才保存
  88. if (pShape->m_ptFirstPos.x != ptPos.x || 
  89. pShape->m_ptFirstPos.y != ptPos.y)
  90. {
  91. //保存至数组
  92. pArrayShape->Add(pShape);
  93. }
  94. else
  95. {
  96. delete pShape;
  97. pShape = NULL;
  98. }
  99. //取消画图状态
  100. OverCurTool(hWnd);
  101. }
  102. }