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

绘图程序

开发平台:

Visual C++

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