MyDraw.cpp
上传用户:netltd
上传日期:2013-02-12
资源大小:7234k
文件大小:37k
源码类别:

绘图程序

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "math.h"
  3. #include "MyDraw.h"
  4. #include "MyDefine.h"
  5. ///////////////////////////////////////////////////////////////////////////////////////////////
  6. //图形对象信息
  7. CMyObjectInfo::CMyObjectInfo(BOOL del, BOOL selected)
  8. {
  9. m_del = del;  
  10. m_selected = selected;
  11. }
  12. ///////////////////////////////////////////////////////////////////////////////////////////////
  13. //被选择图形对象信息
  14. CMySelObjectInfo::CMySelObjectInfo(int type, int index)
  15. {
  16. m_type = type;
  17. m_index = index;
  18. }
  19. ///////////////////////////////////////////////////////////////////////////////////////////////
  20. IMPLEMENT_DYNCREATE(CMyOperate, CObject)
  21. CMyOperate::CMyOperate()
  22. {
  23. Proportion = 1.0;
  24. }
  25. CMyOperate::~CMyOperate()
  26. {
  27. DelAllLine();
  28. DelAllRect();
  29. DelAllCircle();
  30. DelAllArc();
  31. }
  32. void CMyOperate::Serialize(CArchive& ar)
  33. {
  34. int num;
  35. int index;
  36. CMyObjectInfo* pLineInfo;
  37. CMyObjectInfo* pRectInfo;
  38. CMyObjectInfo* pCircleInfo;
  39. CMyObjectInfo* pArcInfo;
  40. if(ar.IsStoring())
  41. {
  42. ar << m_LineArray.GetSize() << m_RectArray.GetSize()
  43.    << m_CircleArray.GetSize() << m_ArcArray.GetSize();
  44. }
  45. else
  46. {
  47. ar >> num;
  48. for(index = 0; index < num; index++)
  49. {
  50. pLineInfo = new CMyObjectInfo(FALSE, FALSE);
  51. m_LineInfoArray.Add(pLineInfo);
  52. }
  53. ar >> num;
  54. for(index = 0; index < num; index++)
  55. {
  56. pRectInfo = new CMyObjectInfo(FALSE, FALSE);
  57. m_RectInfoArray.Add(pRectInfo);
  58. }
  59. ar >> num;
  60. for(index = 0; index < num; index++)
  61. {
  62. pCircleInfo = new CMyObjectInfo(FALSE, FALSE);
  63. m_CircleInfoArray.Add(pCircleInfo);
  64. }
  65. ar >> num;
  66. for(index = 0; index < num; index++)
  67. {
  68. pArcInfo = new CMyObjectInfo(FALSE, FALSE);
  69. m_ArcInfoArray.Add(pArcInfo);
  70. }
  71. }
  72. //注意当打开文件时,下面的Serialize()函数会自动创建CMyLine,CMyRect等对象
  73.     m_LineArray.Serialize(ar);
  74. m_RectArray.Serialize(ar);
  75. m_CircleArray.Serialize(ar);
  76. m_ArcArray.Serialize(ar);
  77. }
  78. ////////////////////////////////////////////////////////////////////////////////////////////////
  79. void CMyOperate::RedrawAllObject(CDC* pDC)
  80. {
  81. RedrawLine(pDC);
  82. RedrawRect(pDC);
  83. RedrawCircle(pDC);
  84. RedrawArc(pDC);
  85. }
  86. void CMyOperate::SelectObject(CDC* pDC, CPoint point)
  87. {
  88. SelectLine(pDC, point);   
  89. SelectRect(pDC, point);
  90. SelectCircle(pDC, point);
  91. SelectArc(pDC, point);
  92. }
  93. BOOL CMyOperate::UnselectObject()
  94. {
  95. BOOL flag = FALSE;
  96. int nIndex;
  97. if(UnselectLine())
  98. flag = TRUE;
  99. if(UnselectRect())
  100. flag = TRUE;
  101. if(UnselectCircle())
  102. flag = TRUE;
  103.     if(UnselectArc())
  104. flag = TRUE;
  105.     
  106. nIndex = m_SelObjInfoArray.GetSize();
  107. while(nIndex--)
  108. delete (CMySelObjectInfo*)m_SelObjInfoArray.GetAt(nIndex);
  109.     m_SelObjInfoArray.RemoveAll();
  110. return flag;
  111. }
  112. //////////////////////////////////////////////////////////////////////////////////////////////
  113. //operate line
  114. void CMyOperate::DrawLineA(CDC* pDC)
  115. {
  116. //基于CDC
  117. pDC->SetROP2(R2_NOT);
  118. pDC->MoveTo(StartPoint);
  119. pDC->LineTo(oldEndPoint);
  120. pDC->MoveTo(StartPoint);
  121. pDC->LineTo(EndPoint);
  122. oldEndPoint = EndPoint;
  123. pDC->SetROP2(R2_COPYPEN);
  124. }
  125. void CMyOperate::DrawLineB(CDC* pDC)
  126. {
  127. //基于CDC
  128. pDC->MoveTo(StartPoint.x, StartPoint.y);
  129. pDC->LineTo(EndPoint.x, EndPoint.y);
  130. }
  131. void CMyOperate::DrawLineC(CDC* pDC)
  132. {
  133. //基于CDC
  134. CPen Pen;
  135. CPen* OldPen;
  136. Pen.CreatePen(LineStyle, 1, ForeColor);
  137. OldPen = pDC->SelectObject(&Pen);
  138. pDC->SetROP2(R2_COPYPEN);
  139. pDC->MoveTo(StartPoint);
  140. pDC->LineTo(EndPoint);
  141. pDC->SelectObject(OldPen);
  142. }
  143. void CMyOperate::DrawSelLine(CDC* pDC, CMyLine * pLine)
  144. {
  145. CPen* Pen;
  146. CPen* OldPen;
  147. CPoint start;
  148. CPoint end;
  149. CPoint middle;
  150. RECT rect;
  151. Pen = new CPen(PS_DOT, 1, pLine->m_color);
  152. OldPen = pDC->SelectObject(Pen);
  153. start.x = (long)(pLine->m_startX * Proportion) + EXTRA_WIDTH;
  154. start.y = size.cy - (long)(pLine->m_startY * Proportion) - EXTRA_HIGTH;
  155.     end.x = (long)(pLine->m_endX * Proportion) + EXTRA_WIDTH;
  156. end.y = size.cy - (long)(pLine->m_endY * Proportion) - EXTRA_HIGTH;
  157. pDC->MoveTo(start);
  158. pDC->LineTo(end);
  159. pDC->SelectObject(OldPen);
  160. delete Pen;
  161. Pen = new CPen(PS_SOLID, 1, RGB(0, 0, 255));
  162. OldPen = pDC->SelectObject(Pen);
  163. pDC->SelectStockObject(NULL_BRUSH);
  164. rect.left = start.x - SEL_RECT_WIDTH;
  165. rect.top = start.y - SEL_RECT_WIDTH;
  166. rect.right = start.x + SEL_RECT_WIDTH + 1;
  167. rect.bottom = start.y + SEL_RECT_WIDTH + 1;
  168.     pDC->Rectangle(&rect);
  169. middle.x = (start.x + end.x) / 2;
  170. middle.y = (start.y + end.y) / 2;
  171. rect.left = middle.x - SEL_RECT_WIDTH;
  172. rect.top = middle.y - SEL_RECT_WIDTH;
  173. rect.right = middle.x + SEL_RECT_WIDTH + 1;
  174. rect.bottom = middle.y + SEL_RECT_WIDTH + 1;
  175.     pDC->Rectangle(&rect);
  176. rect.left = end.x - SEL_RECT_WIDTH;
  177. rect.top = end.y - SEL_RECT_WIDTH;
  178. rect.right = end.x + SEL_RECT_WIDTH + 1;
  179. rect.bottom = end.y + SEL_RECT_WIDTH + 1;
  180.     pDC->Rectangle(&rect);
  181.     pDC->SelectObject(OldPen);
  182. pDC->SetROP2(R2_COPYPEN);
  183. delete Pen;
  184. }
  185. void CMyOperate::RedrawLine(CDC* pDC)
  186. {
  187. CPen *Pen;
  188. CPen* OldPen;
  189. int index;
  190. CMyLine* pLine;
  191. CMyObjectInfo* pLineInfo;
  192. index = m_LineArray.GetSize();
  193. while(index--)
  194. {
  195. pLine = (CMyLine*)m_LineArray.GetAt(index);
  196. pLineInfo = (CMyObjectInfo*)m_LineInfoArray.GetAt(index);
  197. if(pLineInfo->m_del == TRUE)
  198. continue;
  199. if(pLineInfo->m_selected == TRUE)
  200. {
  201. DrawSelLine(pDC, pLine);
  202. continue;
  203. }
  204.         Pen = new CPen(pLine->m_style, 1, pLine->m_color);
  205. OldPen = pDC->SelectObject(Pen);
  206. pDC->MoveTo((long)(pLine->m_startX * Proportion) + EXTRA_WIDTH, 
  207. size.cy - (long)(pLine->m_startY * Proportion) - EXTRA_HIGTH);
  208. pDC->LineTo((long)(pLine->m_endX * Proportion) + EXTRA_WIDTH,
  209. size.cy - (long)(pLine->m_endY * Proportion) - EXTRA_HIGTH);
  210. //注意以下两句顺序不可颠倒
  211. pDC->SelectObject(OldPen);
  212. delete Pen;
  213. }
  214. }
  215. void CMyOperate::CancelDrawLine(CDC* pDC)
  216. {
  217. pDC->SetROP2(R2_NOT);
  218. pDC->MoveTo(StartPoint);
  219. pDC->LineTo(oldEndPoint);
  220.     
  221. pDC->SetROP2(R2_COPYPEN);
  222. }
  223. void CMyOperate::SelectLine(CDC* pDC, CPoint point)
  224. {
  225. int nIndex;
  226. long distance;
  227. RECT rect;
  228. CMyObjectInfo* pLineInfo;
  229. CMySelObjectInfo* pSelObjInfo;
  230. CMyLine* pLine; 
  231. for(nIndex = 0; nIndex < m_LineInfoArray.GetSize(); nIndex++)
  232. {
  233. pLineInfo = (CMyObjectInfo*)m_LineInfoArray.GetAt(nIndex);
  234. if(pLineInfo ->m_del == TRUE || pLineInfo ->m_selected ==TRUE)
  235. continue;
  236. pLine = (CMyLine*)m_LineArray.GetAt(nIndex);
  237. rect.left = (long)(pLine->m_startX * Proportion) + EXTRA_WIDTH;
  238. rect.top = size.cy - (long)(pLine->m_startY * Proportion) - EXTRA_HIGTH;
  239. rect.right = (long)(pLine->m_endX * Proportion) + EXTRA_WIDTH;
  240. rect.bottom = size.cy - (long)(pLine->m_endY * Proportion) - EXTRA_HIGTH;
  241. if( (point.x >= min(rect.left, rect.right) - SELECT_RANGE) && (point.x <= max(rect.left, rect.right) + SELECT_RANGE) &&
  242.     (point.y >= min(rect.top, rect.bottom) - SELECT_RANGE) && (point.y <= max(rect.top, rect.bottom) + SELECT_RANGE) )
  243. {
  244. distance = (long)( abs( (rect.bottom - rect.top) * point.x - (rect.right - rect.left) * point.y + rect.top * (rect.right - rect.left) - rect.left * (rect.bottom - rect.top) )
  245.        / sqrt( (rect.right - rect.left) * (rect.right - rect.left) + (rect.bottom - rect.top) * (rect.bottom - rect.top) ) );
  246. if(distance <= SELECT_RANGE)
  247. {
  248. DrawSelLine(pDC, pLine);
  249. pLineInfo->m_selected = TRUE;
  250. pSelObjInfo = new CMySelObjectInfo(OBJ_LINE, nIndex);
  251. m_SelObjInfoArray.Add(pSelObjInfo);
  252. }
  253. }
  254. }
  255. }
  256. BOOL CMyOperate::UnselectLine()
  257. {
  258. BOOL flag = FALSE;
  259. int nIndex;
  260. CMySelObjectInfo* pSelObjInfo;
  261. CMyObjectInfo* pLineInfo;
  262. for(nIndex = 0; nIndex < m_SelObjInfoArray.GetSize(); nIndex++)
  263. {
  264. pSelObjInfo = (CMySelObjectInfo*)m_SelObjInfoArray.GetAt(nIndex);
  265. if(pSelObjInfo->m_type ==OBJ_LINE)
  266. {
  267. pLineInfo = (CMyObjectInfo*)m_LineInfoArray.GetAt(pSelObjInfo->m_index);
  268. pLineInfo->m_selected = FALSE;
  269. flag = TRUE;
  270.         }
  271.     }
  272. return flag;
  273. }
  274. void CMyOperate::AddLine()
  275. {
  276. float startx;
  277. float starty;
  278. float endx;
  279. float endy;
  280. startx = (StartPoint.x - EXTRA_WIDTH) / Proportion;
  281. starty = (size.cy - StartPoint.y  - EXTRA_HIGTH) / Proportion;
  282. endx = (EndPoint.x - EXTRA_WIDTH) / Proportion;
  283. endy = (size.cy - EndPoint.y - EXTRA_HIGTH) / Proportion;
  284. CMyLine* pMyLine = new CMyLine(startx, starty, endx, endy, LineStyle, ForeColor);
  285. m_LineArray.Add(pMyLine);
  286. CMyObjectInfo * pLineInfo = new CMyObjectInfo(FALSE, FALSE);
  287. m_LineInfoArray.Add(pLineInfo);
  288. }
  289. CMyLine* CMyOperate::GetLine(int index)
  290. {
  291. if(index < 0 || index > m_LineArray.GetUpperBound())
  292. return 0;
  293. return (CMyLine*)m_LineArray.GetAt(index);
  294. }
  295. void CMyOperate::DelAllLine()
  296. {
  297. int index;
  298. index = m_LineArray.GetSize();
  299. while(index--)
  300. delete (CMyLine*)m_LineArray.GetAt(index);
  301. m_LineArray.RemoveAll();
  302.      
  303. index = m_LineInfoArray.GetSize();
  304. while(index--)
  305. delete (CMyObjectInfo*)m_LineInfoArray.GetAt(index);
  306. m_LineInfoArray.RemoveAll();
  307. }
  308. ///////////////////////////////////////////////////////////////////////////////////////////////
  309. //operate rectangle
  310. void CMyOperate::DrawRectA(CDC* pDC)
  311. {
  312. //基于CDC
  313. pDC->SetROP2(R2_NOT);
  314. //设置不填充状态
  315. pDC->SelectStockObject(NULL_BRUSH);
  316. CRect rect;
  317. rect.left = StartPoint.x;
  318. rect.top = StartPoint.y;
  319. rect.right = oldEndPoint.x;
  320. rect.bottom = oldEndPoint.y;
  321. rect.NormalizeRect();
  322. pDC->Rectangle(rect.left, rect.top, rect.right + 1, rect.bottom +1);
  323. rect.left = StartPoint.x;
  324. rect.top = StartPoint.y;
  325. rect.right = EndPoint.x;
  326. rect.bottom = EndPoint.y;
  327. rect.NormalizeRect();
  328. pDC->Rectangle(rect.left, rect.top, rect.right + 1, rect.bottom + 1);
  329. oldEndPoint = EndPoint;
  330. pDC->SetROP2(R2_COPYPEN);
  331. }
  332. void CMyOperate::DrawRectB(CDC* pDC)
  333. {
  334. //基于CDC
  335. //设置不填充状态
  336. pDC->SelectStockObject(NULL_BRUSH);
  337. CRect rect;
  338. rect.left = StartPoint.x;
  339. rect.top = StartPoint.y;
  340. rect.right = EndPoint.x;
  341. rect.bottom = EndPoint.y;
  342. rect.NormalizeRect();
  343. pDC->Rectangle(rect.left, rect.top, rect.right + 1, rect.bottom + 1);
  344. }
  345. void CMyOperate::DrawRectC(CDC* pDC)
  346. {
  347. //基于CDC
  348. CPen Pen;
  349. CPen* OldPen;
  350. CRect rect;
  351. rect.left = StartPoint.x;
  352. rect.top = StartPoint.y;
  353. rect.right = EndPoint.x;
  354. rect.bottom = EndPoint.y;
  355. rect.NormalizeRect();
  356. Pen.CreatePen(LineStyle, 1, ForeColor);
  357. OldPen = pDC->SelectObject(&Pen);
  358. //设置不填充状态
  359. pDC->SelectStockObject(NULL_BRUSH);
  360. pDC->SetROP2(R2_COPYPEN);
  361. //注意画矩形时,不包括右下角那一点,所以右下角x,y坐标加1
  362. pDC->Rectangle(rect.left, rect.top, rect.right + 1, rect.bottom + 1);
  363. pDC->SelectObject(OldPen);
  364. }
  365. void CMyOperate::CancelDrawRect(CDC* pDC)
  366. {
  367. pDC->SetROP2(R2_NOT);
  368. pDC->SelectStockObject(NULL_BRUSH);
  369. CRect rect;
  370. rect.left = StartPoint.x;
  371. rect.top = StartPoint.y;
  372. rect.right = EndPoint.x;
  373. rect.bottom = EndPoint.y;
  374. rect.NormalizeRect();
  375. //注意画矩形时,不包括右下角那一点,所以右下角x,y坐标加1
  376. pDC->Rectangle(rect.left, rect.top, rect.right + 1, rect.bottom + 1);
  377. pDC->SetROP2(R2_COPYPEN);
  378. }
  379. void CMyOperate::RedrawRect(CDC* pDC)
  380. {
  381. CPen *Pen;
  382. CPen* OldPen;
  383. int index;
  384. CRect rect;
  385. CMyRect* pRect;
  386. CMyObjectInfo* pRectInfo;
  387. index = m_RectArray.GetSize();
  388. //设置不填充状态
  389. pDC->SelectStockObject(NULL_BRUSH);
  390. while(index--)
  391. {
  392. pRect = (CMyRect*)m_RectArray.GetAt(index);
  393. pRectInfo = (CMyObjectInfo*)m_RectInfoArray.GetAt(index);
  394. if(pRectInfo->m_del == TRUE)
  395. continue;
  396. if(pRectInfo->m_selected == TRUE)
  397. {
  398. DrawSelRect(pDC, pRect);
  399. continue;
  400. }
  401.         Pen = new CPen(pRect->m_style, 1, pRect->m_color);
  402. OldPen = pDC->SelectObject(Pen);
  403.         rect.left = (long)(pRect->m_startX * Proportion) + EXTRA_WIDTH;
  404. rect.right = (long)(pRect->m_endX * Proportion) + EXTRA_WIDTH;
  405.     rect.top = size.cy - (long)(pRect->m_startY * Proportion) - EXTRA_HIGTH;
  406.         rect.bottom = size.cy - (long)(pRect->m_endY * Proportion) - EXTRA_HIGTH;
  407. rect.NormalizeRect();
  408. //注意画矩形时,不包括右下角那一点,所以右下角x,y坐标加1
  409. pDC->Rectangle(rect.left, rect.top, rect.right + 1, rect.bottom + 1);
  410. //注意以下两句顺序不可颠倒
  411. pDC->SelectObject(OldPen);
  412. delete Pen;
  413. }
  414. }
  415. void CMyOperate::DrawSelRect(CDC* pDC, CMyRect* pRect)
  416. {
  417. CPen *Pen;
  418. CPen* OldPen;
  419. CRect rect;
  420.     CPoint mid;
  421. //设置不填充状态
  422. pDC->SelectStockObject(NULL_BRUSH);
  423. Pen = new CPen(PS_DOT, 1, pRect->m_color);
  424. OldPen = pDC->SelectObject(Pen);
  425.     rect.left = (long)(pRect->m_startX * Proportion) + EXTRA_WIDTH;
  426. rect.right = (long)(pRect->m_endX * Proportion) + EXTRA_WIDTH;
  427.     rect.top = size.cy - (long)(pRect->m_startY * Proportion) - EXTRA_HIGTH;
  428.     rect.bottom = size.cy - (long)(pRect->m_endY * Proportion) - EXTRA_HIGTH;
  429. rect.NormalizeRect();
  430. //注意画矩形时,不包括右下角那一点,所以右下角x,y坐标加1
  431. pDC->Rectangle(rect.left, rect.top, rect.right + 1, rect.bottom + 1);
  432. pDC->SelectObject(OldPen);
  433. delete Pen;
  434. Pen = new CPen(PS_SOLID, 1, RGB(0, 0, 255));
  435. OldPen = pDC->SelectObject(Pen);
  436.     pDC->Rectangle(rect.left - SEL_RECT_WIDTH, rect.top - SEL_RECT_WIDTH,
  437.            rect.left + SEL_RECT_WIDTH + 1, rect.top + SEL_RECT_WIDTH + 1);
  438. pDC->Rectangle(rect.left - SEL_RECT_WIDTH, rect.bottom - SEL_RECT_WIDTH,
  439.            rect.left + SEL_RECT_WIDTH + 1, rect.bottom + SEL_RECT_WIDTH + 1);
  440. pDC->Rectangle(rect.right - SEL_RECT_WIDTH, rect.top - SEL_RECT_WIDTH,
  441.            rect.right + SEL_RECT_WIDTH + 1, rect.top + SEL_RECT_WIDTH + 1);
  442. pDC->Rectangle(rect.right - SEL_RECT_WIDTH, rect.bottom - SEL_RECT_WIDTH,
  443.            rect.right + SEL_RECT_WIDTH + 1, rect.bottom + SEL_RECT_WIDTH + 1);
  444. mid.x = (rect.left + rect.right) / 2;
  445. mid.y = rect.top;
  446. pDC->Rectangle(mid.x - SEL_RECT_WIDTH, mid.y - SEL_RECT_WIDTH,
  447.            mid.x + SEL_RECT_WIDTH + 1, mid.y + SEL_RECT_WIDTH + 1);
  448. mid.x = (rect.left + rect.right) / 2;
  449. mid.y = rect.bottom;
  450. pDC->Rectangle(mid.x - SEL_RECT_WIDTH, mid.y - SEL_RECT_WIDTH,
  451.            mid.x + SEL_RECT_WIDTH + 1, mid.y + SEL_RECT_WIDTH + 1);
  452. mid.x = rect.left;
  453. mid.y = (rect.top + rect.bottom) / 2;
  454. pDC->Rectangle(mid.x - SEL_RECT_WIDTH, mid.y - SEL_RECT_WIDTH,
  455.            mid.x + SEL_RECT_WIDTH + 1, mid.y + SEL_RECT_WIDTH + 1);
  456. mid.x = rect.right;
  457. mid.y = (rect.top + rect.bottom) / 2;
  458. pDC->Rectangle(mid.x - SEL_RECT_WIDTH, mid.y - SEL_RECT_WIDTH,
  459.            mid.x + SEL_RECT_WIDTH + 1, mid.y + SEL_RECT_WIDTH + 1);
  460. //注意以下两句顺序不可颠倒
  461. pDC->SelectObject(OldPen);
  462. delete Pen;
  463. }
  464. void CMyOperate::SelectRect(CDC* pDC, CPoint point)
  465. {
  466. int nIndex;
  467. RECT rect;
  468. CMyObjectInfo* pRectInfo;
  469. CMySelObjectInfo* pSelObjInfo;
  470. CMyRect* pRect; 
  471. for(nIndex = 0; nIndex < m_RectInfoArray.GetSize(); nIndex++)
  472. {
  473. pRectInfo = (CMyObjectInfo*)m_RectInfoArray.GetAt(nIndex);
  474. if(pRectInfo ->m_del == TRUE || pRectInfo ->m_selected ==TRUE)
  475. continue;
  476. pRect = (CMyRect*)m_RectArray.GetAt(nIndex);
  477. rect.left = (long)(pRect->m_startX * Proportion) + EXTRA_WIDTH;
  478. rect.top = size.cy - (long)(pRect->m_startY * Proportion) - EXTRA_HIGTH;
  479. rect.right = (long)(pRect->m_endX * Proportion) + EXTRA_WIDTH;
  480. rect.bottom = size.cy - (long)(pRect->m_endY * Proportion) - EXTRA_HIGTH;
  481. if( ( (point.x >= min(rect.left, rect.right) - SELECT_RANGE) && (point.x <= max(rect.left, rect.right) + SELECT_RANGE) &&
  482.     (point.y >= min(rect.top, rect.bottom) - SELECT_RANGE) && (point.y <= max(rect.top, rect.bottom) + SELECT_RANGE) ) &&
  483. ( (point.x <= min(rect.left, rect.right) + SELECT_RANGE) || (point.x >= max(rect.left, rect.right) - SELECT_RANGE) ||
  484.             (point.y <= min(rect.top, rect.bottom) + SELECT_RANGE) || (point.y >= max(rect.top, rect.bottom) - SELECT_RANGE) ) ) 
  485. {
  486. DrawSelRect(pDC, pRect);
  487. pRectInfo->m_selected = TRUE;
  488. pSelObjInfo = new CMySelObjectInfo(OBJ_RECT, nIndex);
  489. m_SelObjInfoArray.Add(pSelObjInfo);
  490. }
  491. }
  492. }
  493. BOOL CMyOperate::UnselectRect()
  494. {
  495. BOOL flag = FALSE;
  496. int nIndex;
  497. CMySelObjectInfo* pSelObjInfo;
  498. CMyObjectInfo* pRectInfo;
  499. for(nIndex = 0; nIndex < m_SelObjInfoArray.GetSize(); nIndex++)
  500. {
  501. pSelObjInfo = (CMySelObjectInfo*)m_SelObjInfoArray.GetAt(nIndex);
  502. if(pSelObjInfo->m_type ==OBJ_RECT)
  503. {
  504. pRectInfo = (CMyObjectInfo*)m_RectInfoArray.GetAt(pSelObjInfo->m_index);
  505. pRectInfo->m_selected = FALSE;
  506. flag = TRUE;
  507.         }
  508.     }
  509. return flag;
  510. }
  511. void CMyOperate::AddRect()
  512. {
  513. float startx;
  514. float starty;
  515. float endx;
  516. float endy;
  517. CRect rect;
  518.     
  519. rect.left = StartPoint.x - EXTRA_WIDTH;
  520. rect.top =  size.cy - StartPoint.y  - EXTRA_HIGTH;
  521. rect.right = EndPoint.x - EXTRA_WIDTH;
  522. rect.bottom = size.cy - EndPoint.y - EXTRA_HIGTH;
  523. rect.NormalizeRect();
  524. startx = (float)rect.left / Proportion;
  525. starty = (float)rect.top / Proportion;
  526. endx = (float)rect.right / Proportion;
  527. endy = (float)rect.bottom / Proportion;
  528. CMyRect* pMyRect = new CMyRect(startx, starty, endx, endy, LineStyle, ForeColor);
  529. m_RectArray.Add(pMyRect);
  530. CMyObjectInfo * pRectInfo = new CMyObjectInfo(FALSE, FALSE);
  531. m_RectInfoArray.Add(pRectInfo);
  532. }
  533. CMyRect* CMyOperate::GetRect(int index)
  534. {
  535. if(index < 0 || index > m_RectArray.GetUpperBound())
  536. return 0;
  537. return (CMyRect*)m_RectArray.GetAt(index);
  538. }
  539. void CMyOperate::DelAllRect()
  540. {
  541. int index;
  542. index = m_RectArray.GetSize();
  543. while(index--)
  544. delete (CMyRect*)m_RectArray.GetAt(index);
  545. m_RectArray.RemoveAll();
  546. index = m_RectInfoArray.GetSize();
  547. while(index--)
  548. delete (CMyObjectInfo*)m_RectInfoArray.GetAt(index);
  549. m_RectInfoArray.RemoveAll();
  550. }
  551. //////////////////////////////////////////////////////////////////////////////////////////////
  552. void CMyOperate::DrawCircleA(CDC* pDC)
  553. {
  554. //基于CDC
  555. pDC->SetROP2(R2_NOT);
  556. //设置不填充状态
  557. pDC->SelectStockObject(NULL_BRUSH);
  558. pDC->MoveTo(StartPoint.x, StartPoint.y);
  559. pDC->LineTo(oldEndPoint.x, oldEndPoint.y);
  560. pDC->MoveTo(StartPoint.x, StartPoint.y);
  561. pDC->LineTo(EndPoint.x, EndPoint.y);
  562. RECT rect;
  563. rect.left = StartPoint.x - Radius;
  564. rect.top = StartPoint.y - Radius;
  565. rect.right = StartPoint.x + Radius;
  566. rect.bottom = StartPoint.y + Radius;
  567. pDC->Ellipse(rect.left, rect.top, rect.right, rect.bottom);
  568. Radius = (long)sqrt(pow((float)(StartPoint.x - EndPoint.x), 2) + pow((float)(StartPoint.y - EndPoint.y), 2));
  569. rect.left = StartPoint.x - Radius;
  570. rect.top = StartPoint.y - Radius;
  571. rect.right = StartPoint.x + Radius;
  572. rect.bottom = StartPoint.y + Radius;
  573. pDC->Ellipse(rect.left, rect.top, rect.right, rect.bottom);
  574. oldEndPoint = EndPoint;
  575. pDC->SetROP2(R2_COPYPEN);
  576. }
  577. void CMyOperate::DrawCircleB(CDC* pDC)
  578. {
  579. //基于CDC
  580. //设置不填充状态
  581. pDC->SelectStockObject(NULL_BRUSH);
  582. pDC->MoveTo(StartPoint.x , StartPoint.y);
  583. pDC->LineTo(EndPoint.x, EndPoint.y);
  584. RECT rect;
  585. rect.left = StartPoint.x - Radius;
  586. rect.top = StartPoint.y - Radius;
  587. rect.right = StartPoint.x + Radius;
  588. rect.bottom = StartPoint.y + Radius;
  589. pDC->Ellipse(rect.left, rect.top, rect.right, rect.bottom);
  590. }
  591. void CMyOperate::DrawCircleC(CDC* pDC)
  592. {
  593. //基于CDC
  594. CPen Pen;
  595. CPen* OldPen;
  596. RECT rect;
  597. //设置不填充状态
  598. pDC->SelectStockObject(NULL_BRUSH);
  599. //注意先擦除原有的未设置线形、颜色的圆
  600. pDC->SetROP2(R2_NOT);
  601. pDC->MoveTo(StartPoint.x, StartPoint.y);
  602. pDC->LineTo(EndPoint.x, EndPoint.y);
  603. rect.left = StartPoint.x - Radius;
  604. rect.top = StartPoint.y - Radius;
  605. rect.right = StartPoint.x + Radius;
  606. rect.bottom = StartPoint.y + Radius;
  607. pDC->Ellipse(rect.left, rect.top, rect.right, rect.bottom);
  608. pDC->SetROP2(R2_COPYPEN);
  609. Pen.CreatePen(LineStyle, 1, ForeColor);
  610. OldPen = pDC->SelectObject(&Pen);
  611. rect.left = StartPoint.x - Radius;
  612. rect.top = StartPoint.y - Radius;
  613. rect.right = StartPoint.x + Radius;
  614. rect.bottom = StartPoint.y + Radius;
  615. pDC->Ellipse(rect.left, rect.top, rect.right, rect.bottom);
  616. oldEndPoint = EndPoint;
  617. pDC->SelectObject(OldPen);
  618. }
  619. void CMyOperate::CancelDrawCircle(CDC* pDC)
  620. {
  621. //基于CDC
  622. pDC->SetROP2(R2_NOT);
  623. //设置不填充状态
  624. pDC->SelectStockObject(NULL_BRUSH);
  625. pDC->MoveTo(StartPoint.x, StartPoint.y);
  626. pDC->LineTo(EndPoint.x, EndPoint.y);
  627. RECT rect;
  628. rect.left = (StartPoint.x) - Radius;
  629. rect.top = (StartPoint.y) - Radius;
  630. rect.right = (StartPoint.x) + Radius;
  631. rect.bottom = (StartPoint.y) + Radius;
  632. pDC->Ellipse(rect.left, rect.top, rect.right, rect.bottom);
  633. pDC->SetROP2(R2_COPYPEN);
  634. }
  635. void CMyOperate::RedrawCircle(CDC* pDC)
  636. {
  637. CPen *Pen;
  638. CPen* OldPen;
  639. CPoint origin;
  640. long r;
  641. RECT rect;
  642. int index;
  643. CMyCircle* pCircle;
  644. CMyObjectInfo* pCircleInfo;
  645. index = m_CircleArray.GetSize();
  646. //设置不填充状态
  647. pDC->SelectStockObject(NULL_BRUSH);
  648. while(index--)
  649. {
  650. pCircle = (CMyCircle*)m_CircleArray.GetAt(index);
  651. pCircleInfo = (CMyObjectInfo*)m_CircleInfoArray.GetAt(index);
  652. if(pCircleInfo->m_del == TRUE)
  653. continue;
  654. if(pCircleInfo->m_selected == TRUE)
  655. {
  656. DrawSelCircle(pDC, pCircle);
  657. continue;
  658. }
  659.         Pen = new CPen(pCircle->m_style, 1, pCircle->m_color);
  660. OldPen = pDC->SelectObject(Pen);
  661. origin.x = (long)(pCircle->m_originX * Proportion) + EXTRA_WIDTH;
  662. origin.y = size.cy - (long)(pCircle->m_originY * Proportion) - EXTRA_HIGTH;
  663. r = (long)(pCircle->m_radius * Proportion);
  664. rect.left = origin.x - r;
  665. rect.top = origin.y - r;
  666. rect.right = origin.x + r;
  667. rect.bottom = origin.y + r;
  668. pDC->Ellipse(rect.left, rect.top, rect.right, rect.bottom);
  669. //注意以下两句顺序不可颠倒
  670. pDC->SelectObject(OldPen);
  671. delete Pen;
  672. }
  673. }
  674. void CMyOperate::DrawSelCircle(CDC* pDC, CMyCircle* pCircle)
  675. {
  676. CPen *Pen;
  677. CPen* OldPen;
  678. RECT rect;
  679. long r;
  680. CPoint origin;
  681. CPoint mid;
  682. //设置不填充状态
  683. pDC->SelectStockObject(NULL_BRUSH);
  684. origin.x = (long)(pCircle->m_originX * Proportion) + EXTRA_WIDTH;
  685. origin.y = size.cy - (long)(pCircle->m_originY * Proportion) - EXTRA_HIGTH;
  686. r = (long)(pCircle->m_radius * Proportion);
  687. rect.left = origin.x - r;
  688. rect.top = origin.y - r;
  689. rect.right = origin.x + r;
  690. rect.bottom = origin.y + r;
  691. //用异或擦除原有的圆
  692. Pen = new CPen(pCircle->m_style, 1, pCircle->m_color);
  693. OldPen = pDC->SelectObject(Pen);
  694. pDC->SetROP2(R2_NOT);
  695. pDC->Ellipse(rect.left, rect.top, rect.right, rect.bottom);
  696. pDC->SelectObject(OldPen);
  697. delete Pen;
  698. //重画线形为点线的圆
  699. Pen = new CPen(PS_DOT, 1, pCircle->m_color);
  700. OldPen = pDC->SelectObject(Pen);
  701. pDC->SetROP2(R2_COPYPEN);
  702. pDC->Ellipse(rect.left, rect.top, rect.right, rect.bottom);
  703. pDC->SelectObject(OldPen);
  704. delete Pen;
  705. Pen = new CPen(PS_SOLID, 1, RGB(0, 0, 255));
  706. OldPen = pDC->SelectObject(Pen);
  707. pDC->Rectangle(origin.x - SEL_RECT_WIDTH, origin.y - SEL_RECT_WIDTH,
  708.            origin.x + SEL_RECT_WIDTH + 1, origin.y + SEL_RECT_WIDTH + 1);
  709. pDC->Rectangle(origin.x - SEL_RECT_WIDTH, origin.y - r - SEL_RECT_WIDTH ,
  710.            origin.x + SEL_RECT_WIDTH + 1, origin.y - r + SEL_RECT_WIDTH + 1);
  711. pDC->Rectangle(origin.x - SEL_RECT_WIDTH, origin.y + r - SEL_RECT_WIDTH,
  712.            origin.x + SEL_RECT_WIDTH + 1, origin.y + r + SEL_RECT_WIDTH + 1);
  713.     pDC->Rectangle(origin.x - r - SEL_RECT_WIDTH, origin.y - SEL_RECT_WIDTH,
  714.            origin.x - r + SEL_RECT_WIDTH + 1, origin.y + SEL_RECT_WIDTH + 1);
  715. pDC->Rectangle(origin.x + r  - SEL_RECT_WIDTH, origin.y - SEL_RECT_WIDTH,
  716.            origin.x + r + SEL_RECT_WIDTH + 1, origin.y + SEL_RECT_WIDTH + 1);
  717. //注意以下两句顺序不可颠倒
  718. OldPen = pDC->SelectObject(Pen);
  719. pDC->SelectObject(OldPen);
  720. delete Pen;
  721. }
  722. void CMyOperate::SelectCircle(CDC* pDC, CPoint point)
  723. {
  724. int nIndex;
  725. CPoint origin;
  726. long r;
  727. long distance;
  728. CMyObjectInfo* pCircleInfo;
  729. CMySelObjectInfo* pSelObjInfo;
  730. CMyCircle* pCircle; 
  731. for(nIndex = 0; nIndex < m_CircleInfoArray.GetSize(); nIndex++)
  732. {
  733. pCircleInfo = (CMyObjectInfo*)m_CircleInfoArray.GetAt(nIndex);
  734. if(pCircleInfo ->m_del == TRUE || pCircleInfo ->m_selected ==TRUE)
  735. continue;
  736. pCircle = (CMyCircle*)m_CircleArray.GetAt(nIndex);
  737. origin.x = (long)(pCircle->m_originX * Proportion) + EXTRA_WIDTH;
  738. origin.y = size.cy - (long)(pCircle->m_originY * Proportion) - EXTRA_HIGTH;
  739. r = (long)(pCircle->m_radius * Proportion);
  740. distance = (long)sqrt( (origin.x - point.x) * (origin.x - point.x) + (origin.y - point.y) * (origin.y - point.y) );
  741. if(distance <= r + SELECT_RANGE && distance >= r - SELECT_RANGE)
  742. {
  743. DrawSelCircle(pDC, pCircle);
  744. pCircleInfo->m_selected = TRUE;
  745. pSelObjInfo = new CMySelObjectInfo(OBJ_CIRCLE, nIndex);
  746. m_SelObjInfoArray.Add(pSelObjInfo);
  747. }
  748. }
  749. }
  750. BOOL CMyOperate::UnselectCircle()
  751. {
  752. BOOL flag = FALSE;
  753. int nIndex;
  754. CMySelObjectInfo* pSelObjInfo;
  755. CMyObjectInfo* pCircleInfo;
  756. for(nIndex = 0; nIndex < m_SelObjInfoArray.GetSize(); nIndex++)
  757. {
  758. pSelObjInfo = (CMySelObjectInfo*)m_SelObjInfoArray.GetAt(nIndex);
  759. if(pSelObjInfo->m_type ==OBJ_CIRCLE)
  760. {
  761. pCircleInfo = (CMyObjectInfo*)m_CircleInfoArray.GetAt(pSelObjInfo->m_index);
  762. pCircleInfo->m_selected = FALSE;
  763. flag = TRUE;
  764.         }
  765.     }
  766. return flag;
  767. }
  768. void CMyOperate::AddCircle()
  769. {
  770. float startx;
  771. float starty;
  772. float r;
  773. startx = (StartPoint.x - EXTRA_WIDTH) / Proportion;
  774. starty = (size.cy - StartPoint.y  - EXTRA_HIGTH) / Proportion;
  775. r = Radius / Proportion;
  776. CMyCircle* pMyCircle = new CMyCircle(startx, starty, r, LineStyle, ForeColor);
  777. m_CircleArray.Add(pMyCircle);
  778. CMyObjectInfo* pCircleInfo = new CMyObjectInfo(FALSE, FALSE);
  779. m_CircleInfoArray.Add(pCircleInfo);
  780. }
  781. CMyCircle* CMyOperate::GetCircle(int index)
  782. {
  783. if(index < 0 || index > m_CircleArray.GetUpperBound())
  784. return 0;
  785. return (CMyCircle*)m_CircleArray.GetAt(index);
  786. }
  787. void CMyOperate::DelAllCircle()
  788. {
  789. int index;
  790. index = m_CircleArray.GetSize();
  791. while(index--)
  792. delete (CMyCircle*)m_CircleArray.GetAt(index);
  793. m_CircleArray.RemoveAll();
  794. index = m_CircleInfoArray.GetSize();
  795. while(index--)
  796. delete (CMyObjectInfo*)m_CircleInfoArray.GetAt(index);
  797. m_CircleInfoArray.RemoveAll();
  798. }
  799. //////////////////////////////////////////////////////////////////////////////////////////////
  800. void CMyOperate::DrawArcA(CDC* pDC, int times)
  801. {
  802. static flag;
  803. double originX;
  804. double originY;
  805. double k1;
  806. double k2;
  807. double mid1X;
  808. double mid1Y;
  809. double mid2X;
  810. double mid2Y;
  811. long x1, y1, x2, y2;
  812. //基于CDC
  813. pDC->SetROP2(R2_NOT);
  814. //设置不填充状态
  815. pDC->SelectStockObject(NULL_BRUSH);
  816.     switch(times)
  817. {
  818. case 1:
  819. pDC->MoveTo(StartPoint.x, StartPoint.y);
  820. pDC->LineTo(oldMidPoint.x, oldMidPoint.y);
  821. pDC->MoveTo(StartPoint.x, StartPoint.y);
  822. pDC->LineTo(MidPoint.x, MidPoint.y);
  823. flag = 1;
  824.         oldMidPoint = MidPoint;
  825. break;
  826. case 2:
  827. RECT rect;
  828. if(flag == 1)
  829. {
  830. pDC->MoveTo(StartPoint.x, StartPoint.y);
  831. pDC->LineTo(MidPoint.x, MidPoint.y);
  832. flag = 0;
  833. }
  834. if(OriginPoint.x != -1000 && OriginPoint.y != -1000)
  835. {
  836. rect.left = OriginPoint.x - Radius;
  837. rect.top = OriginPoint.y - Radius;
  838. rect.right = OriginPoint.x + Radius;
  839. rect.bottom = OriginPoint.y + Radius;
  840. x1 = MidPoint.x - StartPoint.x;
  841. y1 = MidPoint.y - StartPoint.y;
  842. x2 = oldEndPoint.x - StartPoint.x;
  843. y2 = oldEndPoint.y - StartPoint.y;
  844. if(x1*y2 - x2*y1 < 0)
  845. pDC->Arc(&rect, StartPoint, oldEndPoint);
  846. else
  847. pDC->Arc(&rect, oldEndPoint, StartPoint);
  848. }
  849. if(StartPoint.y == MidPoint.y)
  850. k1 = 1000000.0;
  851. else 
  852. k1 = (- (double)(StartPoint.x - MidPoint.x) / (double)(StartPoint.y - MidPoint.y));
  853. if(EndPoint.y == MidPoint.y)
  854. k2 = 1000000.0;
  855. else 
  856. k2 =  (- (double)(EndPoint.x - MidPoint.x) / (double)(EndPoint.y - MidPoint.y));
  857. mid1X = (double)(StartPoint.x + MidPoint.x) / 2.0;
  858. mid1Y = (double)(StartPoint.y + MidPoint.y) / 2.0;
  859. mid2X = (double)(EndPoint.x + MidPoint.x) / 2.0;
  860. mid2Y = (double)(EndPoint.y + MidPoint.y) / 2.0;
  861. if(k1 == k2)
  862. {
  863. OriginPoint.x = -1000;
  864. OriginPoint.y = -1000;
  865. }
  866. else
  867. {
  868. if(k1 == 1000000.0)
  869. {
  870. originX = mid1X;
  871. originY = k2 * (originX - mid2X) + mid2Y;
  872. }
  873. else
  874. if(k2 == 1000000.0)
  875. {
  876. originX = mid2X;
  877. originY = k1 * (originX - mid1X) + mid1Y;
  878. }
  879. else
  880. {
  881. originX = ((k2 * mid2X - k1 * mid1X) - (mid2Y - mid1Y)) / (k2 - k1);
  882. originY = k2 * (originX - mid2X) + mid2Y;
  883. }
  884. Radius = (long)sqrt(pow((double)(originX - StartPoint.x), 2) + pow((double)(originY - StartPoint.y), 2));
  885. OriginPoint.x = (long)originX;
  886. OriginPoint.y = (long)originY ;
  887. rect.left = OriginPoint.x - Radius;
  888. rect.top = OriginPoint.y - Radius;
  889. rect.right = OriginPoint.x + Radius;
  890. rect.bottom = OriginPoint.y + Radius;
  891. x1 = MidPoint.x - StartPoint.x;
  892. y1 = MidPoint.y - StartPoint.y;
  893. x2 = EndPoint.x - StartPoint.x;
  894. y2 = EndPoint.y - StartPoint.y;
  895. //判断优弧
  896. if(x1*y2 - x2*y1 < 0)
  897. pDC->Arc(&rect, StartPoint, EndPoint);
  898. else
  899. pDC->Arc(&rect, EndPoint, StartPoint);
  900.      oldEndPoint = EndPoint;
  901. }
  902. break;
  903. }
  904. pDC->SetROP2(R2_COPYPEN);
  905. }
  906. void CMyOperate::DrawArcB(CDC* pDC, int times)
  907. {
  908. long x1, y1, x2, y2;
  909. //设置不填充状态
  910. pDC->SelectStockObject(NULL_BRUSH);
  911.     switch(times)
  912. {
  913. case 1:
  914. pDC->MoveTo(StartPoint.x, StartPoint.y);
  915. pDC->LineTo(MidPoint.x, MidPoint.y);
  916. break;
  917. case 2:
  918. RECT rect;
  919. if(OriginPoint.x != -1000 && OriginPoint.y != -1000)
  920. {
  921. rect.left = OriginPoint.x - Radius;
  922. rect.top = OriginPoint.y - Radius;
  923. rect.right = OriginPoint.x + Radius;
  924. rect.bottom = OriginPoint.y + Radius;
  925. x1 = MidPoint.x - StartPoint.x;
  926. y1 = MidPoint.y - StartPoint.y;
  927. x2 = EndPoint.x - StartPoint.x;
  928. y2 = EndPoint.y - StartPoint.y;
  929. if(x1*y2 - x2*y1 < 0)
  930. pDC->Arc(&rect, StartPoint, EndPoint);
  931. else
  932. pDC->Arc(&rect, EndPoint, StartPoint);
  933. }
  934. break;
  935. }
  936. }
  937. void CMyOperate::DrawArcC(CDC* pDC)
  938. {
  939. CPen* Pen;
  940. CPen* OldPen;
  941. RECT rect;
  942. long x1, y1, x2, y2;
  943. //设置不填充状态
  944. pDC->SelectStockObject(NULL_BRUSH);
  945. rect.left = OriginPoint.x - Radius;
  946. rect.top = OriginPoint.y - Radius;
  947. rect.right = OriginPoint.x + Radius;
  948. rect.bottom = OriginPoint.y + Radius;
  949.     Pen = new CPen(LineStyle, 1, ForeColor);
  950. OldPen = pDC->SelectObject(Pen);
  951. x1 = MidPoint.x - StartPoint.x;
  952. y1 = MidPoint.y - StartPoint.y;
  953. x2 = EndPoint.x - StartPoint.x;
  954. y2 = EndPoint.y - StartPoint.y;
  955.     if(x1*y2 - x2*y1 < 0)
  956. pDC->Arc(&rect, StartPoint, EndPoint);
  957. else
  958. pDC->Arc(&rect, EndPoint, StartPoint);
  959. pDC->SelectObject(OldPen);
  960.     delete Pen; 
  961. }
  962. void CMyOperate::CancelDrawArc(CDC* pDC, int times)
  963. {
  964. long x1, y1, x2, y2;
  965. //设置不填充状态
  966. pDC->SetROP2(R2_NOT);
  967. pDC->SelectStockObject(NULL_BRUSH);
  968.     switch(times)
  969. {
  970. case 1:
  971. pDC->MoveTo(StartPoint.x, StartPoint.y);
  972. pDC->LineTo(MidPoint.x, MidPoint.y);
  973. break;
  974. case 2:
  975. RECT rect;
  976. if(OriginPoint.x != -1000 && OriginPoint.y != -1000)
  977. {
  978. rect.left = OriginPoint.x - Radius;
  979. rect.top = OriginPoint.y - Radius;
  980. rect.right = OriginPoint.x + Radius;
  981. rect.bottom = OriginPoint.y + Radius;
  982. x1 = MidPoint.x - StartPoint.x;
  983. y1 = MidPoint.y - StartPoint.y;
  984. x2 = EndPoint.x - StartPoint.x;
  985. y2 = EndPoint.y - StartPoint.y;
  986. if(x1*y2 - x2*y1 < 0)
  987. pDC->Arc(&rect, StartPoint, EndPoint);
  988. else
  989. pDC->Arc(&rect, EndPoint, StartPoint);
  990. }
  991. break;
  992. }
  993. pDC->SetROP2(R2_COPYPEN);
  994. }
  995. void CMyOperate::RedrawArc(CDC* pDC)
  996. {
  997. CPen *Pen;
  998. CPen* OldPen;
  999. CPoint origin;
  1000. CPoint start;
  1001. CPoint end;
  1002. long r;
  1003. RECT rect;
  1004. int index;
  1005. CMyArc* pArc;
  1006. CMyObjectInfo* pArcInfo;
  1007. index = m_ArcArray.GetSize();
  1008. //设置不填充状态
  1009. pDC->SelectStockObject(NULL_BRUSH);
  1010. while(index--)
  1011. {
  1012. pArc = (CMyArc*)m_ArcArray.GetAt(index);
  1013. pArcInfo = (CMyObjectInfo*)m_ArcInfoArray.GetAt(index);
  1014. if(pArcInfo->m_del == TRUE)
  1015. continue;
  1016. if(pArcInfo->m_selected == TRUE)
  1017. {
  1018. DrawSelArc(pDC, pArc);
  1019. continue;
  1020. }
  1021.         Pen = new CPen(pArc->m_style, 1, pArc->m_color);
  1022. OldPen = pDC->SelectObject(Pen);
  1023. origin.x = (long)(pArc->m_originX * Proportion) + EXTRA_WIDTH;
  1024. origin.y = size.cy - (long)(pArc->m_originY * Proportion) - EXTRA_HIGTH;
  1025. start.x = (long)(pArc->m_startX * Proportion) + EXTRA_WIDTH;
  1026. start.y = size.cy - (long)(pArc->m_startY * Proportion) - EXTRA_HIGTH;
  1027. end.x = (long)(pArc->m_endX * Proportion) + EXTRA_WIDTH;
  1028. end.y = size.cy - (long)(pArc->m_endY * Proportion) - EXTRA_HIGTH;
  1029. r = (long)(pArc->m_radius * Proportion);
  1030. rect.left = origin.x - r;
  1031. rect.top = origin.y - r;
  1032. rect.right = origin.x + r;
  1033. rect.bottom = origin.y + r;
  1034. pDC->Arc(&rect, start, end);
  1035. //注意以下两句顺序不可颠倒
  1036. pDC->SelectObject(OldPen);
  1037. delete Pen;
  1038. }
  1039. }
  1040. void CMyOperate::DrawSelArc(CDC* pDC, CMyArc* pArc)
  1041. {
  1042. CPen *Pen;
  1043. CPen* OldPen;
  1044. RECT rect;
  1045. long r;
  1046. CPoint origin;
  1047. CPoint start;
  1048. CPoint end;
  1049. //设置不填充状态
  1050. pDC->SelectStockObject(NULL_BRUSH);
  1051. origin.x = (long)(pArc->m_originX * Proportion) + EXTRA_WIDTH;
  1052. origin.y = size.cy - (long)(pArc->m_originY * Proportion) - EXTRA_HIGTH;
  1053. start.x = (long)(pArc->m_startX * Proportion) + EXTRA_WIDTH;
  1054. start.y = size.cy - (long)(pArc->m_startY * Proportion) - EXTRA_HIGTH;
  1055. end.x = (long)(pArc->m_endX * Proportion) + EXTRA_WIDTH;
  1056. end.y = size.cy - (long)(pArc->m_endY * Proportion) - EXTRA_HIGTH;
  1057. r = (long)(pArc->m_radius * Proportion);
  1058. rect.left = origin.x - r;
  1059. rect.top = origin.y - r;
  1060. rect.right = origin.x + r;
  1061. rect.bottom = origin.y + r;
  1062. //重画线形为点线的圆弧
  1063. Pen = new CPen(PS_DOT, 1, pArc->m_color);
  1064. OldPen = pDC->SelectObject(Pen);
  1065. pDC->SetROP2(R2_COPYPEN);
  1066. pDC->Arc(&rect, start, end);
  1067. pDC->SelectObject(OldPen);
  1068. delete Pen;
  1069. Pen = new CPen(PS_SOLID, 1, RGB(0, 0, 255));
  1070. OldPen = pDC->SelectObject(Pen);
  1071. pDC->Rectangle(start.x - SEL_RECT_WIDTH, start.y - SEL_RECT_WIDTH ,
  1072.            start.x + SEL_RECT_WIDTH + 1, start.y + SEL_RECT_WIDTH + 1);
  1073. pDC->Rectangle(end.x - SEL_RECT_WIDTH, end.y - SEL_RECT_WIDTH,
  1074.            end.x + SEL_RECT_WIDTH + 1, end.y + SEL_RECT_WIDTH + 1);
  1075. //注意以下两句顺序不可颠倒
  1076. OldPen = pDC->SelectObject(Pen);
  1077. pDC->SelectObject(OldPen);
  1078. delete Pen;
  1079. }
  1080. void CMyOperate::SelectArc(CDC* pDC, CPoint point)
  1081. {
  1082. long x1, y1, x2, y2;
  1083. int nIndex;
  1084. CPoint origin;
  1085. long r;
  1086. long distance;
  1087. CPoint start;
  1088. CPoint end;
  1089. CMyObjectInfo* pArcInfo;
  1090. CMySelObjectInfo* pSelObjInfo;
  1091. CMyArc* pArc; 
  1092. for(nIndex = 0; nIndex < m_ArcInfoArray.GetSize(); nIndex++)
  1093. {
  1094. pArcInfo = (CMyObjectInfo*)m_ArcInfoArray.GetAt(nIndex);
  1095. if(pArcInfo ->m_del == TRUE || pArcInfo ->m_selected ==TRUE)
  1096. continue;
  1097. pArc = (CMyArc*)m_ArcArray.GetAt(nIndex);
  1098. origin.x = (long)(pArc->m_originX * Proportion) + EXTRA_WIDTH;
  1099. origin.y = size.cy - (long)(pArc->m_originY * Proportion) - EXTRA_HIGTH;
  1100. start.x = (long)(pArc->m_startX * Proportion) + EXTRA_WIDTH;
  1101. start.y = size.cy - (long)(pArc->m_startY * Proportion) - EXTRA_HIGTH;
  1102. end.x = (long)(pArc->m_endX * Proportion) + EXTRA_WIDTH;
  1103. end.y = size.cy - (long)(pArc->m_endY * Proportion) - EXTRA_HIGTH;
  1104. r = (long)(pArc->m_radius * Proportion);
  1105. distance = (long)sqrt( (origin.x - point.x) * (origin.x - point.x) + (origin.y - point.y) * (origin.y - point.y) );
  1106. if(distance >= r + SELECT_RANGE || distance <= r - SELECT_RANGE)
  1107. continue;
  1108. x1 = point.x - start.x;
  1109. y1 = point.y - start.y;
  1110. x2 = end.x - start.x;
  1111. y2 = end.y - start.y;
  1112. if(x1 * y2 - x2 * y1 < 0)
  1113. {
  1114. DrawSelArc(pDC, pArc);
  1115. pArcInfo->m_selected = TRUE;
  1116. pSelObjInfo = new CMySelObjectInfo(OBJ_ARC, nIndex);
  1117. m_SelObjInfoArray.Add(pSelObjInfo);
  1118. }
  1119. }
  1120. }
  1121. BOOL CMyOperate::UnselectArc()
  1122. {
  1123. BOOL flag = FALSE;
  1124. int nIndex;
  1125. CMySelObjectInfo* pSelObjInfo;
  1126. CMyObjectInfo* pArcInfo;
  1127. for(nIndex = 0; nIndex < m_SelObjInfoArray.GetSize(); nIndex++)
  1128. {
  1129. pSelObjInfo = (CMySelObjectInfo*)m_SelObjInfoArray.GetAt(nIndex);
  1130. if(pSelObjInfo->m_type ==OBJ_ARC)
  1131. {
  1132. pArcInfo = (CMyObjectInfo*)m_ArcInfoArray.GetAt(pSelObjInfo->m_index);
  1133. pArcInfo->m_selected = FALSE;
  1134. flag = TRUE;
  1135.         }
  1136.     }
  1137. return flag;
  1138. }
  1139. void CMyOperate::AddArc()
  1140. {
  1141. long x1, y1, x2, y2;
  1142. float originx;
  1143. float originy;
  1144. float startx;
  1145. float starty;
  1146. float endx;
  1147. float endy;
  1148. float r;
  1149. CMyArc* pMyArc;
  1150. originx = (OriginPoint.x - EXTRA_WIDTH) / Proportion;
  1151. originy = (size.cy - OriginPoint.y  - EXTRA_HIGTH) / Proportion;
  1152. startx = (StartPoint.x - EXTRA_WIDTH) / Proportion;
  1153. starty = (size.cy - StartPoint.y  - EXTRA_HIGTH) / Proportion;
  1154.     endx = (EndPoint.x - EXTRA_WIDTH) / Proportion;
  1155. endy = (size.cy - EndPoint.y  - EXTRA_HIGTH) / Proportion;
  1156. r = Radius / Proportion;
  1157. x1 = MidPoint.x - StartPoint.x;
  1158. y1 = MidPoint.y - StartPoint.y;
  1159. x2 = EndPoint.x - StartPoint.x;
  1160. y2 = EndPoint.y - StartPoint.y;
  1161. if(x1*y2 - x2*y1 < 0)
  1162. pMyArc = new CMyArc(originx, originy, startx, starty, endx, endy, r, LineStyle, ForeColor);
  1163. else
  1164. pMyArc = new CMyArc(originx, originy, endx, endy, startx, starty, r, LineStyle, ForeColor);
  1165. m_ArcArray.Add(pMyArc);
  1166. CMyObjectInfo* pArcInfo = new CMyObjectInfo(FALSE, FALSE);
  1167. m_ArcInfoArray.Add(pArcInfo);
  1168. }
  1169. CMyArc* CMyOperate::GetArc(int index)
  1170. {
  1171. if(index < 0 || index > m_ArcArray.GetUpperBound())
  1172. return 0;
  1173. return (CMyArc*)m_ArcArray.GetAt(index);
  1174. }
  1175. void CMyOperate::DelAllArc()
  1176. {
  1177. int index;
  1178. index = m_ArcArray.GetSize();
  1179. while(index--)
  1180. delete (CMyArc*)m_ArcArray.GetAt(index);
  1181. m_ArcArray.RemoveAll();
  1182. index = m_ArcInfoArray.GetSize();
  1183. while(index--)
  1184. delete (CMyObjectInfo*)m_ArcInfoArray.GetAt(index);
  1185. m_ArcInfoArray.RemoveAll();
  1186. }