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

CAD

开发平台:

Visual C++

  1. // ManagerTool.cpp: implementation of the CManagerTool class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "ManagerTool.h"
  6. #include "LineTool.h"
  7. #include "RectangleTool.h"
  8. #include "CircleTool.h"
  9. #include "WinApp.h"
  10. #include "MoveLine.h"
  11. #include "MoveCircle.h"
  12. #include "MoveRectangle.h"
  13. #include "CopyLine.h"
  14. #include "CopyCircle.h"
  15. #include "CopyRectangle.h"
  16. #include "MirrorLine.h"
  17. #include "MirrorCircle.h"
  18. extern CWinApp g_theApp;
  19. //////////////////////////////////////////////////////////////////////
  20. // Construction/Destruction
  21. //////////////////////////////////////////////////////////////////////
  22. CManagerTool::CManagerTool()
  23. {
  24. //初始化成员变量
  25. m_pCurrentTool = NULL;
  26. pMoveShape     = NULL;
  27. pCopyShape     = NULL;
  28. pCurShape      = NULL;
  29. pShape         = NULL;
  30. LBDown         = 0;
  31. copyFlag       = 0;
  32. MirrorFlag     = 0;
  33. MouseFlag      = NoHit;
  34. }
  35. CManagerTool::~CManagerTool()
  36. {
  37. }
  38. //功能:设置当前绘图工具
  39. void CManagerTool::SetCurActiveTool(unsigned int ID)
  40. {
  41. //改变当前工具状态前,初始化为无状态
  42. if(m_pCurrentTool != NULL)
  43. {
  44. delete m_pCurrentTool;
  45. m_pCurrentTool = NULL;
  46. }
  47. switch (ID)
  48. {
  49. case ID_DRAW_LINE:
  50. m_pCurrentTool = new CLineTool;
  51. break;
  52. case ID_DRAW_RECTANGLE:
  53. m_pCurrentTool = new CRectangleTool;
  54. break;
  55. case ID_DRAW_C2PT:
  56. m_pCurrentTool = new CCircleTool;
  57. break;
  58. }
  59. }
  60. //功能:绘图
  61. void CManagerTool::DrawObject(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  62. {
  63. if( m_pCurrentTool == NULL ) return ;
  64. int   nFlag  = wParam;
  65. int   NCFlag = 0;             //非显示区域消息标记
  66. POINT ptPos;
  67. ptPos.x = LOWORD(lParam);  
  68. ptPos.y = HIWORD(lParam);  
  69. switch(message)
  70. {
  71. case WM_MOUSEMOVE: 
  72. {
  73. m_pCurrentTool->OnMouseMove(hWnd,nFlag,ptPos);  
  74. }break;
  75. case WM_LBUTTONDOWN :
  76. {
  77. m_pCurrentTool->OnLButtonDown(hWnd,nFlag,ptPos);  
  78. }break;
  79. case WM_RBUTTONDOWN :
  80. {
  81. m_pCurrentTool->OnRButtonDown(hWnd,nFlag,ptPos);  
  82. }break;
  83. case WM_NCMOUSEMOVE:
  84. {
  85. NCFlag = 1;
  86. }
  87. case WM_SETCURSOR :
  88. {
  89. UINT uCURID = IDC_CURSOR2;
  90. //当鼠标移至非显示区域
  91. if (NCFlag == 1)
  92. uCURID = IDC_CURSOR1;
  93. HCURSOR hCur = ::LoadCursor(g_theApp.GetInst(),MAKEINTRESOURCE(uCURID));
  94. ::SetCursor(hCur);  
  95. }
  96. }
  97. }
  98. //功能:编辑图形
  99. BOOL CManagerTool::EditObject(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  100. {
  101. int       redraw = 0;                          //刷新标记
  102. POINT     ptPos;
  103. CDataBase *pDataBase = &(g_theApp.m_DataBase);
  104. HCURSOR   hCur = NULL;
  105. ptPos.x = LOWORD(lParam);  
  106. ptPos.y = HIWORD(lParam);  
  107. switch(message)
  108. {
  109. case WM_SETCURSOR:
  110. {
  111. UINT uCURID = IDC_CURSOR1;
  112. //上线
  113. if(pShape != NULL)
  114. {
  115. uCURID = IDC_CURSOR3;
  116. }
  117. HCURSOR hCur = ::LoadCursor(g_theApp.GetInst(),(LPCTSTR)uCURID);
  118. ::SetCursor(hCur);
  119. }break;
  120. case WM_LBUTTONUP :
  121. {
  122. if (pCurShape != NULL && LBDown == 1 && copyFlag == 1)
  123. {
  124. pDataBase->m_ArrayShape.Add(pCurShape);
  125. }
  126. LBDown = 0;
  127. redraw = 1;
  128. //释放非窗口鼠标消息
  129. ReleaseCapture () ;
  130. }break;
  131. case WM_LBUTTONDOWN :
  132. {
  133. if (pShape != NULL)
  134. {
  135. //更新图形选择
  136. if (pCurShape != NULL && pCurShape != pShape)
  137. {
  138. pCurShape->isPick = FALSE;
  139. }
  140. LBDown    = 1;
  141. pCurShape = pShape;
  142. pCurShape->isPick = TRUE;
  143. ptPrePos  = ptPos;
  144. //拾取
  145. HCURSOR hCur = ::LoadCursor(g_theApp.GetInst(),(LPCTSTR)IDC_CURSOR4);
  146. ::SetCursor(hCur);
  147. }
  148. else
  149. {
  150. pCurShape = pShape;
  151. }
  152. //拦截鼠标在窗口外的消息
  153. SetCapture (hWnd) ;
  154. }break;
  155. case WM_MOUSEMOVE: 
  156. {
  157. //
  158. copyFlag = 0;
  159. if ( (wParam & MK_LBUTTON) && pCurShape != NULL && pCurShape->isPick == TRUE)
  160. {
  161. //移动图形
  162. HDC hdc = GetDC(hWnd);
  163. SetMoveShape(pCurShape);
  164. //复制图形
  165. if(wParam & MK_CONTROL) 
  166. {
  167. HCURSOR hCur = ::LoadCursor(g_theApp.GetInst(),(LPCTSTR)IDC_CURSOR5);
  168. ::SetCursor(hCur);
  169. copyFlag = 1;
  170. SetCopyShape(pCurShape);
  171. pCurShape = pCopyShape->Copy();
  172. SetMoveShape(pCurShape);
  173. }
  174. pMoveShape->Move(hdc,(ptPos.x - ptPrePos.x),(ptPos.y - ptPrePos.y));
  175. ReleaseDC(hWnd,hdc);
  176. ptPrePos = ptPos;
  177. }
  178. else
  179. {
  180. int i = 0;
  181. for(;i < pDataBase->m_ArrayShape.GetArraySize();i++)
  182. {
  183. if (pDataBase->m_ArrayShape[i]->pick(ptPos) == TRUE)
  184. {
  185. //唯一选择判定
  186. pShape = pDataBase->m_ArrayShape[i];
  187. break;
  188. }
  189. else
  190. {
  191. pDataBase->m_ArrayShape[i]->isPick = FALSE;
  192. }
  193. }
  194. //没有可选图形
  195. if (i == pDataBase->m_ArrayShape.GetArraySize()) pShape = NULL;
  196. }
  197. }break;
  198. case WM_RBUTTONDOWN :
  199. {
  200. if (pCurShape != NULL)
  201. {
  202. pCurShape = NULL;
  203. redraw = 1;
  204. }
  205. }
  206. }
  207. return redraw;
  208. }
  209. //功能:响应当前菜单编辑行为
  210. void CManagerTool::OnCurMenuAction(HWND hWnd,unsigned int ID)
  211. {
  212. CDataBase *pDataBase = &(g_theApp.m_DataBase);
  213. if (pCurShape == NULL)
  214. {
  215. MessageBox(hWnd,"Please choose a object first!","prompt",MB_OK);
  216. }
  217. else
  218. {
  219. switch (ID)
  220. {
  221. case ID_EDIT_COPY:
  222. {
  223. //令粘贴功能可选
  224. HMENU hMenu = ::GetMenu( hWnd);
  225. ::EnableMenuItem(hMenu,ID_EDIT_PASTE,MF_ENABLED);
  226. }
  227. break;
  228. case ID_EDIT_MIRROR:
  229. {
  230. MirrorFlag = 1;
  231. }
  232. break;
  233. case ID_EDIT_PASTE:
  234. {
  235. HDC hdc = GetDC(hWnd);
  236. SetCopyShape(pCurShape);
  237. pCurShape = pCopyShape->Copy();
  238. SetMoveShape(pCurShape);
  239. pMoveShape->Move(hdc,Offset,Offset);
  240. pDataBase->m_ArrayShape.Add(pCurShape);
  241. ReleaseDC(hWnd,hdc);
  242. //令粘贴功能不可选
  243. HMENU hMenu = ::GetMenu( hWnd );
  244. ::EnableMenuItem(hMenu,ID_EDIT_PASTE,MF_GRAYED);
  245. InvalidateRect(hWnd,NULL,TRUE);
  246. }
  247. break;
  248. case ID_EDIT_DELETE:
  249. {
  250. for (int i=0;i<pDataBase->m_ArrayShape.GetArraySize();i++)
  251. {
  252. if(pDataBase->m_ArrayShape[i] == pCurShape)
  253. {
  254. pDataBase->m_ArrayShape.RemoveAt(i);
  255. pCurShape = NULL;
  256. //令粘贴功能不可选
  257. HMENU hMenu = ::GetMenu( hWnd );
  258. ::EnableMenuItem(hMenu,ID_EDIT_PASTE,MF_GRAYED);
  259. InvalidateRect(hWnd,NULL,TRUE);
  260. }
  261. }
  262. }
  263. }
  264. }
  265. }
  266. //功能:设置当前移动图形
  267. void CManagerTool::SetMoveShape(CShape *pShape)
  268. {
  269. if (pMoveShape != NULL)
  270. {
  271. delete pMoveShape;
  272. pMoveShape = NULL;
  273. }
  274. if (pShape != NULL)
  275. {
  276. if (strcmp(pShape->m_className,"CLine") == 0)
  277. pMoveShape = new CMoveLine(pShape);
  278. if (strcmp(pShape->m_className,"CCircle") == 0)
  279. pMoveShape = new CMoveCircle(pShape);
  280. if (strcmp(pShape->m_className,"CRectangle") == 0)
  281. pMoveShape = new CMoveRectangle(pShape);
  282. }
  283. }
  284. //功能:设置当前复制图形
  285. void CManagerTool::SetCopyShape(CShape *pShape)
  286. {
  287. if (pMoveShape != NULL)
  288. {
  289. delete pCopyShape;
  290. pCopyShape = NULL;
  291. }
  292. if (pShape != NULL)
  293. {
  294. if (strcmp(pShape->m_className,"CLine") == 0)
  295. pCopyShape = new CCopyLine(pShape);
  296. if (strcmp(pShape->m_className,"CCircle") == 0)
  297. pCopyShape = new CCopyCircle(pShape);
  298. if (strcmp(pShape->m_className,"CRectangle") == 0)
  299. pCopyShape = new CCopyRectangle(pShape);
  300. }
  301. }
  302. //功能:设置当前镜像图形
  303. void CManagerTool::SetMirrorShape(CShape *pShape)
  304. {
  305. if (pMirrorShape != NULL)
  306. {
  307. delete pMirrorShape;
  308. pMirrorShape = NULL;
  309. }
  310. if (pShape != NULL)
  311. {
  312. if (strcmp(pShape->m_className,"CLine") == 0)
  313. pMirrorShape = new CMirrorLine(pShape);
  314. if (strcmp(pShape->m_className,"CCircle") == 0)
  315. pMirrorShape = new CMirrorCircle(pShape);
  316. if (strcmp(pShape->m_className,"CRectangle") == 0)
  317. pMirrorShape = NULL;
  318. }
  319. }
  320. BOOL CManagerTool::MirrorObject(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  321. {
  322. BOOL      result = TRUE;                          
  323. POINT     ptPos;
  324. CDataBase *pDataBase = &(g_theApp.m_DataBase);
  325. ptPos.x = LOWORD(lParam);  
  326. ptPos.y = HIWORD(lParam);  
  327. switch(message)
  328. {
  329. case WM_LBUTTONDOWN :
  330. {
  331. if (MouseFlag == NoHit)
  332. {
  333. MouseFlag  = Hit;
  334. ptBeginPos = ptPrePos = ptPos;
  335. }
  336. else
  337. {
  338. SetCopyShape(pCurShape);
  339. pCurShape = pCopyShape->Copy();
  340. pCurShape->m_ptFirstPos  = pMirrorShape->MirrorBeginPos;
  341. pCurShape->m_ptSecondPos = pMirrorShape->MirrorEndPos;
  342. pDataBase->m_ArrayShape.Add(pCurShape);
  343. MouseFlag = NoHit;
  344. result    = FALSE;
  345. }
  346. }break;
  347. case WM_MOUSEMOVE:
  348. {
  349. if (MouseFlag == Hit)
  350. {
  351. HDC hdc = GetDC(hWnd);
  352. SetMirrorShape(pCurShape);
  353. if (pMirrorShape == NULL)
  354. {
  355. MouseFlag = NoHit;
  356. return FALSE;
  357. }
  358. int nOldMode = ::SetROP2(hdc,R2_XORPEN);
  359. HPEN hPen    = ::CreatePen(0,1,RGB(255,255,128)^ GetBkColor(hdc) );
  360. HPEN hOldPen = (HPEN)::SelectObject(hdc,hPen);
  361. //擦去前一次线段
  362. CDraw::DrawLine(hdc,ptBeginPos,ptPrePos);
  363. //画出这一次线段
  364. CDraw::DrawLine(hdc,ptBeginPos,ptPos);
  365. pMirrorShape->Mirror(hdc,ptBeginPos,ptPrePos,ptPos);
  366. ::SetROP2(hdc,nOldMode);
  367. ::SelectObject(hdc,hOldPen);
  368. ::DeleteObject(hPen);
  369. ::ReleaseDC(hWnd,hdc);
  370. ptPrePos = ptPos;
  371. }
  372. }break;
  373. case WM_RBUTTONDOWN :
  374. {
  375. if (MouseFlag == Hit)
  376. MouseFlag = NoHit;
  377. result    = FALSE;
  378. }break;
  379. }
  380. return result;
  381. }