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

绘图程序

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "math.h"
  3. #include "MyDraw.h"
  4. #include "MyDefine.h"
  5. CDrawGrapObject::CDrawGrapObject()
  6. {
  7. OnceFlag = FALSE;
  8. }
  9. void CDrawGrapObject::Initialize()
  10. {
  11. }
  12. void CDrawGrapObject::SetOnceFlag()
  13. {
  14. OnceFlag = TRUE;
  15. }
  16. //////////////////////////////////////////////////////////////////////////////////////////////
  17. void CDrawGrapObject::DrawLineXOR(CDC* pDC, POINT StartPoint, POINT EndPoint, POINT oldEndPoint)
  18. {
  19. //基于CDC
  20. pDC->SetROP2(R2_NOT);
  21. if(OnceFlag == FALSE)
  22. {
  23. pDC->MoveTo(StartPoint);
  24. pDC->LineTo(oldEndPoint);
  25. }
  26. OnceFlag = FALSE;
  27. pDC->MoveTo(StartPoint);
  28. pDC->LineTo(EndPoint);
  29. pDC->SetROP2(R2_COPYPEN);
  30. }
  31. void CDrawGrapObject::DrawLine(CDC* pDC, POINT StartPoint, POINT EndPoint, int LineStyle, 
  32. COLORREF PenColor)
  33. {
  34. //基于CDC
  35. CPen Pen;
  36. CPen* OldPen;
  37. Pen.CreatePen(LineStyle, 1, PenColor);
  38. OldPen = pDC->SelectObject(&Pen);
  39. pDC->SetROP2(R2_COPYPEN);
  40. pDC->MoveTo(StartPoint);
  41. pDC->LineTo(EndPoint);
  42. pDC->SelectObject(OldPen);
  43. }
  44. void CDrawGrapObject::DrawSelLine(CDC* pDC, POINT StartPoint, POINT EndPoint, int LineStyle,
  45.   COLORREF PenColor)
  46. {
  47. CPen* Pen;
  48. CPen* OldPen;
  49. CPoint MiddlePoint;
  50. RECT rect;
  51. Pen = new CPen(PS_DOT, 1, PenColor);
  52. OldPen = pDC->SelectObject(Pen);
  53. pDC->MoveTo(StartPoint);
  54. pDC->LineTo(EndPoint);
  55. pDC->SelectObject(OldPen);
  56. delete Pen;
  57. Pen = new CPen(PS_SOLID, 1, RGB(0, 0, 255));
  58. OldPen = pDC->SelectObject(Pen);
  59. pDC->SelectStockObject(NULL_BRUSH);
  60. rect.left = StartPoint.x - SELECT_RECT_WIDTH;
  61. rect.top = StartPoint.y - SELECT_RECT_WIDTH;
  62. rect.right = StartPoint.x + SELECT_RECT_WIDTH + 1;
  63. rect.bottom = StartPoint.y + SELECT_RECT_WIDTH + 1;
  64.     pDC->Rectangle(&rect);
  65. MiddlePoint.x = (StartPoint.x + EndPoint.x) / 2;
  66. MiddlePoint.y = (StartPoint.y + EndPoint.y) / 2;
  67. rect.left = MiddlePoint.x - SELECT_RECT_WIDTH;
  68. rect.top = MiddlePoint.y - SELECT_RECT_WIDTH;
  69. rect.right = MiddlePoint.x + SELECT_RECT_WIDTH + 1;
  70. rect.bottom = MiddlePoint.y + SELECT_RECT_WIDTH + 1;
  71.     pDC->Rectangle(&rect);
  72. rect.left = EndPoint.x - SELECT_RECT_WIDTH;
  73. rect.top = EndPoint.y - SELECT_RECT_WIDTH;
  74. rect.right = EndPoint.x + SELECT_RECT_WIDTH + 1;
  75. rect.bottom = EndPoint.y + SELECT_RECT_WIDTH + 1;
  76.     pDC->Rectangle(&rect);
  77.     pDC->SelectObject(OldPen);
  78. pDC->SetROP2(R2_COPYPEN);
  79. delete Pen;
  80. }
  81. void CDrawGrapObject::CancelDrawLine(CDC* pDC, POINT StartPoint, POINT EndPoint)
  82. {
  83. pDC->SetROP2(R2_NOT);
  84. pDC->MoveTo(StartPoint);
  85. pDC->LineTo(EndPoint);
  86.     
  87. pDC->SetROP2(R2_COPYPEN);
  88. }
  89. ///////////////////////////////////////////////////////////////////////////////////////////////
  90. void CDrawGrapObject::DrawRectXOR(CDC* pDC, POINT StartPoint, POINT EndPoint, POINT oldEndPoint)
  91. {
  92. //基于CDC
  93. pDC->SetROP2(R2_NOT);
  94. //设置不填充状态
  95. pDC->SelectStockObject(NULL_BRUSH);
  96. CRect rect;
  97. if(OnceFlag == FALSE)
  98. {
  99. rect.left = StartPoint.x;
  100. rect.top = StartPoint.y;
  101. rect.right = oldEndPoint.x;
  102. rect.bottom = oldEndPoint.y;
  103. rect.NormalizeRect();
  104. pDC->Rectangle(rect.left, rect.top, rect.right + 1, rect.bottom +1);
  105. }
  106. OnceFlag = FALSE;
  107. rect.left = StartPoint.x;
  108. rect.top = StartPoint.y;
  109. rect.right = EndPoint.x;
  110. rect.bottom = EndPoint.y;
  111. rect.NormalizeRect();
  112. pDC->Rectangle(rect.left, rect.top, rect.right + 1, rect.bottom + 1);
  113. pDC->SetROP2(R2_COPYPEN);
  114. }
  115. void CDrawGrapObject::DrawRect(CDC* pDC, POINT StartPoint, POINT EndPoint, int LineStyle, 
  116. COLORREF PenColor)
  117. {
  118. //基于CDC
  119. CPen Pen;
  120. CPen* OldPen;
  121. CRect rect;
  122. rect.left = StartPoint.x;
  123. rect.top = StartPoint.y;
  124. rect.right = EndPoint.x;
  125. rect.bottom = EndPoint.y;
  126. rect.NormalizeRect();
  127. Pen.CreatePen(LineStyle, 1, PenColor);
  128. OldPen = pDC->SelectObject(&Pen);
  129. //设置不填充状态
  130. pDC->SelectStockObject(NULL_BRUSH);
  131. pDC->SetROP2(R2_COPYPEN);
  132. //注意画矩形时,不包括右下角那一点,所以右下角x,y坐标加1
  133. pDC->Rectangle(rect.left, rect.top, rect.right + 1, rect.bottom + 1);
  134. pDC->SelectObject(OldPen);
  135. }
  136. void CDrawGrapObject::CancelDrawRect(CDC* pDC, POINT StartPoint, POINT EndPoint)
  137. {
  138. pDC->SetROP2(R2_NOT);
  139. pDC->SelectStockObject(NULL_BRUSH);
  140. CRect rect;
  141. rect.left = StartPoint.x;
  142. rect.top = StartPoint.y;
  143. rect.right = EndPoint.x;
  144. rect.bottom = EndPoint.y;
  145. rect.NormalizeRect();
  146. //注意画矩形时,不包括右下角那一点,所以右下角x,y坐标加1
  147. pDC->Rectangle(rect.left, rect.top, rect.right + 1, rect.bottom + 1);
  148. pDC->SetROP2(R2_COPYPEN);
  149. }
  150. void CDrawGrapObject::DrawSelRect(CDC* pDC, POINT StartPoint, POINT EndPoint, int LineStyle, 
  151.   COLORREF PenColor)
  152. {
  153. CPen *Pen;
  154. CPen* OldPen;
  155. CRect rect;
  156.     CPoint mid;
  157. //设置不填充状态
  158. pDC->SelectStockObject(NULL_BRUSH);
  159. Pen = new CPen(PS_DOT, 1, PenColor);
  160. OldPen = pDC->SelectObject(Pen);
  161.     rect.left = StartPoint.x;
  162. rect.top = StartPoint.y;
  163.     rect.right = EndPoint.x;
  164.     rect.bottom = EndPoint.y;
  165. rect.NormalizeRect();
  166. //注意画矩形时,不包括右下角那一点,所以右下角x,y坐标加1
  167. pDC->Rectangle(rect.left, rect.top, rect.right + 1, rect.bottom + 1);
  168. pDC->SelectObject(OldPen);
  169. delete Pen;
  170. Pen = new CPen(PS_SOLID, 1, RGB(0, 0, 255));
  171. OldPen = pDC->SelectObject(Pen);
  172.     pDC->Rectangle(rect.left - SELECT_RECT_WIDTH, rect.top - SELECT_RECT_WIDTH,
  173.            rect.left + SELECT_RECT_WIDTH + 1, rect.top + SELECT_RECT_WIDTH + 1);
  174. pDC->Rectangle(rect.left - SELECT_RECT_WIDTH, rect.bottom - SELECT_RECT_WIDTH,
  175.            rect.left + SELECT_RECT_WIDTH + 1, rect.bottom + SELECT_RECT_WIDTH + 1);
  176. pDC->Rectangle(rect.right - SELECT_RECT_WIDTH, rect.top - SELECT_RECT_WIDTH,
  177.            rect.right + SELECT_RECT_WIDTH + 1, rect.top + SELECT_RECT_WIDTH + 1);
  178. pDC->Rectangle(rect.right - SELECT_RECT_WIDTH, rect.bottom - SELECT_RECT_WIDTH,
  179.            rect.right + SELECT_RECT_WIDTH + 1, rect.bottom + SELECT_RECT_WIDTH + 1);
  180. mid.x = (rect.left + rect.right) / 2;
  181. mid.y = rect.top;
  182. pDC->Rectangle(mid.x - SELECT_RECT_WIDTH, mid.y - SELECT_RECT_WIDTH,
  183.            mid.x + SELECT_RECT_WIDTH + 1, mid.y + SELECT_RECT_WIDTH + 1);
  184. mid.x = (rect.left + rect.right) / 2;
  185. mid.y = rect.bottom;
  186. pDC->Rectangle(mid.x - SELECT_RECT_WIDTH, mid.y - SELECT_RECT_WIDTH,
  187.            mid.x + SELECT_RECT_WIDTH + 1, mid.y + SELECT_RECT_WIDTH + 1);
  188. mid.x = rect.left;
  189. mid.y = (rect.top + rect.bottom) / 2;
  190. pDC->Rectangle(mid.x - SELECT_RECT_WIDTH, mid.y - SELECT_RECT_WIDTH,
  191.            mid.x + SELECT_RECT_WIDTH + 1, mid.y + SELECT_RECT_WIDTH + 1);
  192. mid.x = rect.right;
  193. mid.y = (rect.top + rect.bottom) / 2;
  194. pDC->Rectangle(mid.x - SELECT_RECT_WIDTH, mid.y - SELECT_RECT_WIDTH,
  195.            mid.x + SELECT_RECT_WIDTH + 1, mid.y + SELECT_RECT_WIDTH + 1);
  196. pDC->SelectObject(OldPen);
  197. delete Pen;
  198. }
  199. //////////////////////////////////////////////////////////////////////////////////////////////
  200. void CDrawGrapObject::DrawCircleXOR(CDC* pDC, POINT StartPoint, POINT EndPoint, 
  201.   POINT oldEndPoint)
  202. {
  203. RECT rect;
  204. long Radius;
  205. //基于CDC
  206. pDC->SetROP2(R2_NOT);
  207. //设置不填充状态
  208. pDC->SelectStockObject(NULL_BRUSH);
  209. if(OnceFlag == FALSE)
  210. {
  211. pDC->MoveTo(StartPoint.x, StartPoint.y);
  212. pDC->LineTo(oldEndPoint.x, oldEndPoint.y);
  213. Radius = (long)sqrt(pow((float)(StartPoint.x - oldEndPoint.x), 2) + pow((float)(StartPoint.y - oldEndPoint.y), 2));
  214. rect.left = StartPoint.x - Radius;
  215. rect.top = StartPoint.y - Radius;
  216. rect.right = StartPoint.x + Radius;
  217. rect.bottom = StartPoint.y + Radius;
  218. pDC->Ellipse(rect.left, rect.top, rect.right, rect.bottom);
  219. }
  220. OnceFlag = FALSE;
  221. pDC->MoveTo(StartPoint.x, StartPoint.y);
  222. pDC->LineTo(EndPoint.x, EndPoint.y);
  223. Radius = (long)sqrt(pow((float)(StartPoint.x - EndPoint.x), 2) + pow((float)(StartPoint.y - EndPoint.y), 2));
  224. rect.left = StartPoint.x - Radius;
  225. rect.top = StartPoint.y - Radius;
  226. rect.right = StartPoint.x + Radius;
  227. rect.bottom = StartPoint.y + Radius;
  228. pDC->Ellipse(rect.left, rect.top, rect.right, rect.bottom);
  229. pDC->SetROP2(R2_COPYPEN);
  230. }
  231. void CDrawGrapObject::DrawCircle(CDC* pDC, POINT StartPoint, POINT EndPoint, int LineStyle, 
  232.   COLORREF PenColor)
  233. {
  234. CPen  Pen;
  235. CPen* OldPen;
  236. RECT  rect;
  237. long  Radius;
  238. pDC->SetROP2(R2_NOT);
  239. pDC->MoveTo(StartPoint.x, StartPoint.y);
  240. pDC->LineTo(EndPoint.x, EndPoint.y);
  241. //设置不填充状态
  242. pDC->SelectStockObject(NULL_BRUSH);
  243. pDC->SetROP2(R2_COPYPEN);
  244. Pen.CreatePen(LineStyle, 1, PenColor);
  245. OldPen = pDC->SelectObject(&Pen);
  246. Radius = (long)sqrt(pow((float)(StartPoint.x - EndPoint.x), 2) + pow((float)(StartPoint.y - EndPoint.y), 2));
  247. rect.left = StartPoint.x - Radius;
  248. rect.top = StartPoint.y - Radius;
  249. rect.right = StartPoint.x + Radius;
  250. rect.bottom = StartPoint.y + Radius;
  251. pDC->Ellipse(rect.left, rect.top, rect.right, rect.bottom);
  252. pDC->SelectObject(OldPen);
  253. }
  254. void CDrawGrapObject::DrawCircle(CDC* pDC, POINT StartPoint, long Radius, int LineStyle, 
  255.   COLORREF PenColor)
  256. {
  257. CPen  Pen;
  258. CPen* OldPen;
  259. RECT  rect;
  260. //设置不填充状态
  261. pDC->SelectStockObject(NULL_BRUSH);
  262. pDC->SetROP2(R2_COPYPEN);
  263. Pen.CreatePen(LineStyle, 1, PenColor);
  264. OldPen = pDC->SelectObject(&Pen);
  265. rect.left = StartPoint.x - Radius;
  266. rect.top = StartPoint.y - Radius;
  267. rect.right = StartPoint.x + Radius;
  268. rect.bottom = StartPoint.y + Radius;
  269. pDC->Ellipse(rect.left, rect.top, rect.right, rect.bottom);
  270. pDC->SelectObject(OldPen);
  271. }
  272. void CDrawGrapObject::CancelDrawCircle(CDC* pDC, POINT StartPoint, POINT EndPoint)
  273. {
  274. RECT rect;
  275. long  Radius;
  276. pDC->SetROP2(R2_NOT);
  277. pDC->MoveTo(StartPoint.x, StartPoint.y);
  278. pDC->LineTo(EndPoint.x, EndPoint.y);
  279.     
  280. //设置不填充状态
  281. pDC->SelectStockObject(NULL_BRUSH);
  282. Radius = (long)sqrt(pow((float)(StartPoint.x - EndPoint.x), 2) + pow((float)(StartPoint.y - EndPoint.y), 2));
  283. rect.left = (StartPoint.x) - Radius;
  284. rect.top = (StartPoint.y) - Radius;
  285. rect.right = (StartPoint.x) + Radius;
  286. rect.bottom = (StartPoint.y) + Radius;
  287. pDC->Ellipse(rect.left, rect.top, rect.right, rect.bottom);
  288. pDC->SetROP2(R2_COPYPEN);
  289. }
  290. void CDrawGrapObject::DrawSelCircle(CDC* pDC, POINT StartPoint, long Radius, int LineStyle,
  291. COLORREF PenColor)
  292. {
  293. CPen *Pen;
  294. CPen* OldPen;
  295. RECT rect;
  296. //设置不填充状态
  297. pDC->SelectStockObject(NULL_BRUSH);
  298. rect.left = StartPoint.x - Radius;
  299. rect.top = StartPoint.y - Radius;
  300. rect.right = StartPoint.x + Radius;
  301. rect.bottom = StartPoint.y + Radius;
  302. //用异或擦除原有的圆(圆比较特殊,需先擦除原来的)
  303. Pen = new CPen(LineStyle, 1, PenColor);
  304. OldPen = pDC->SelectObject(Pen);
  305. pDC->SetROP2(R2_NOT);
  306. pDC->Ellipse(rect.left, rect.top, rect.right, rect.bottom);
  307. pDC->SelectObject(OldPen);
  308. delete Pen;
  309. //重画线形为点线的圆,保持颜色不变
  310. Pen = new CPen(PS_DOT, 1, PenColor);
  311. OldPen = pDC->SelectObject(Pen);
  312. pDC->SetROP2(R2_COPYPEN);
  313. pDC->Ellipse(rect.left, rect.top, rect.right, rect.bottom);
  314. pDC->SelectObject(OldPen);
  315. delete Pen;
  316. Pen = new CPen(PS_SOLID, 1, RGB(0, 0, 255));
  317. OldPen = pDC->SelectObject(Pen);
  318. pDC->Rectangle(StartPoint.x - SELECT_RECT_WIDTH, StartPoint.y - SELECT_RECT_WIDTH,
  319.            StartPoint.x + SELECT_RECT_WIDTH + 1, StartPoint.y + SELECT_RECT_WIDTH + 1);
  320. pDC->Rectangle(StartPoint.x - SELECT_RECT_WIDTH, StartPoint.y - Radius - SELECT_RECT_WIDTH ,
  321.            StartPoint.x + SELECT_RECT_WIDTH + 1, StartPoint.y - Radius + SELECT_RECT_WIDTH + 1);
  322. pDC->Rectangle(StartPoint.x - SELECT_RECT_WIDTH, StartPoint.y + Radius - SELECT_RECT_WIDTH,
  323.            StartPoint.x + SELECT_RECT_WIDTH + 1, StartPoint.y + Radius + SELECT_RECT_WIDTH + 1);
  324.     pDC->Rectangle(StartPoint.x - Radius - SELECT_RECT_WIDTH, StartPoint.y - SELECT_RECT_WIDTH,
  325.            StartPoint.x - Radius + SELECT_RECT_WIDTH + 1, StartPoint.y + SELECT_RECT_WIDTH + 1);
  326. pDC->Rectangle(StartPoint.x + Radius  - SELECT_RECT_WIDTH, StartPoint.y - SELECT_RECT_WIDTH,
  327.            StartPoint.x + Radius + SELECT_RECT_WIDTH + 1, StartPoint.y + SELECT_RECT_WIDTH + 1);
  328. //注意以下两句顺序不可颠倒
  329. OldPen = pDC->SelectObject(Pen);
  330. pDC->SelectObject(OldPen);
  331. delete Pen;
  332. }
  333. //////////////////////////////////////////////////////////////////////////////////////////////
  334. void CDrawGrapObject::DrawArcXOR(CDC* pDC, POINT StartPoint, POINT MidPoint, POINT oldMidPoint, 
  335.      POINT EndPoint, POINT oldEndPoint, int times)
  336. {
  337. static int flag;
  338. POINT OriginPoint;
  339. double originX;
  340. double originY;
  341. double k1;
  342. double k2;
  343. double mid1X;
  344. double mid1Y;
  345. double mid2X;
  346. double mid2Y;
  347. long x1, y1, x2, y2;
  348. long Radius;
  349. pDC->SetROP2(R2_NOT);
  350. //设置不填充状态
  351. pDC->SelectStockObject(NULL_BRUSH);
  352.     switch(times)
  353. {
  354. case 1:
  355. if(OnceFlag == FALSE)
  356. {
  357. pDC->MoveTo(StartPoint.x, StartPoint.y);
  358. pDC->LineTo(oldMidPoint.x, oldMidPoint.y);
  359. }
  360. OnceFlag = FALSE;
  361. pDC->MoveTo(StartPoint.x, StartPoint.y);
  362. pDC->LineTo(MidPoint.x, MidPoint.y);
  363. flag = 1;
  364.     break;
  365. case 2:
  366. RECT rect;
  367. if(flag == 1)
  368. {
  369. pDC->MoveTo(StartPoint.x, StartPoint.y);
  370. pDC->LineTo(MidPoint.x, MidPoint.y);
  371. flag = 0;
  372. }
  373. if( OnceFlag == FALSE)
  374. {
  375. if(StartPoint.y == MidPoint.y)
  376. k1 = 1000000.0;
  377. else 
  378. k1 = (- (double)(StartPoint.x - MidPoint.x) / (double)(StartPoint.y - MidPoint.y));
  379. if(oldEndPoint.y == MidPoint.y)
  380. k2 = 1000000.0;
  381. else 
  382. k2 =  (- (double)(oldEndPoint.x - MidPoint.x) / (double)(oldEndPoint.y - MidPoint.y));
  383. mid1X = (double)(StartPoint.x + MidPoint.x) / 2.0;
  384. mid1Y = (double)(StartPoint.y + MidPoint.y) / 2.0;
  385. mid2X = (double)(oldEndPoint.x + MidPoint.x) / 2.0;
  386. mid2Y = (double)(oldEndPoint.y + MidPoint.y) / 2.0;
  387. if(k1 == k2)
  388. return;
  389. else
  390. {
  391. if(k1 == 1000000.0)
  392. {
  393. originX = mid1X;
  394. originY = k2 * (originX - mid2X) + mid2Y;
  395. }
  396. else
  397. if(k2 == 1000000.0)
  398. {
  399. originX = mid2X;
  400. originY = k1 * (originX - mid1X) + mid1Y;
  401. }
  402. else
  403. {
  404. originX = ((k2 * mid2X - k1 * mid1X) - (mid2Y - mid1Y)) / (k2 - k1);
  405. originY = k2 * (originX - mid2X) + mid2Y;
  406. }
  407. Radius = (long)sqrt(pow((double)(originX - StartPoint.x), 2) + pow((double)(originY - StartPoint.y), 2));
  408. OriginPoint.x = (long)originX;
  409. OriginPoint.y = (long)originY ;
  410. rect.left = OriginPoint.x - Radius;
  411. rect.top = OriginPoint.y - Radius;
  412. rect.right = OriginPoint.x + Radius;
  413. rect.bottom = OriginPoint.y + Radius;
  414. x1 = MidPoint.x - StartPoint.x;
  415. y1 = MidPoint.y - StartPoint.y;
  416. x2 = oldEndPoint.x - StartPoint.x;
  417. y2 = oldEndPoint.y - StartPoint.y;
  418. //判断优弧
  419. if(x1*y2 - x2*y1 < 0)
  420. pDC->Arc(&rect, StartPoint, oldEndPoint);
  421. else
  422. pDC->Arc(&rect, oldEndPoint, StartPoint);
  423. }
  424. }
  425. OnceFlag = FALSE;
  426. if(StartPoint.y == MidPoint.y)
  427. k1 = 1000000.0;
  428. else 
  429. k1 = (- (double)(StartPoint.x - MidPoint.x) / (double)(StartPoint.y - MidPoint.y));
  430. if(EndPoint.y == MidPoint.y)
  431. k2 = 1000000.0;
  432. else 
  433. k2 =  (- (double)(EndPoint.x - MidPoint.x) / (double)(EndPoint.y - MidPoint.y));
  434. mid1X = (double)(StartPoint.x + MidPoint.x) / 2.0;
  435. mid1Y = (double)(StartPoint.y + MidPoint.y) / 2.0;
  436. mid2X = (double)(EndPoint.x + MidPoint.x) / 2.0;
  437. mid2Y = (double)(EndPoint.y + MidPoint.y) / 2.0;
  438. if(k1 == k2)
  439. return;
  440. else
  441. {
  442. if(k1 == 1000000.0)
  443. {
  444. originX = mid1X;
  445. originY = k2 * (originX - mid2X) + mid2Y;
  446. }
  447. else
  448. if(k2 == 1000000.0)
  449. {
  450. originX = mid2X;
  451. originY = k1 * (originX - mid1X) + mid1Y;
  452. }
  453. else
  454. {
  455. originX = ((k2 * mid2X - k1 * mid1X) - (mid2Y - mid1Y)) / (k2 - k1);
  456. originY = k2 * (originX - mid2X) + mid2Y;
  457. }
  458. Radius = (long)sqrt(pow((double)(originX - StartPoint.x), 2) + pow((double)(originY - StartPoint.y), 2));
  459. OriginPoint.x = (long)originX;
  460. OriginPoint.y = (long)originY ;
  461. rect.left = OriginPoint.x - Radius;
  462. rect.top = OriginPoint.y - Radius;
  463. rect.right = OriginPoint.x + Radius;
  464. rect.bottom = OriginPoint.y + Radius;
  465. x1 = MidPoint.x - StartPoint.x;
  466. y1 = MidPoint.y - StartPoint.y;
  467. x2 = EndPoint.x - StartPoint.x;
  468. y2 = EndPoint.y - StartPoint.y;
  469. //判断优弧
  470. if(x1*y2 - x2*y1 < 0)
  471. pDC->Arc(&rect, StartPoint, EndPoint);
  472. else
  473. pDC->Arc(&rect, EndPoint, StartPoint);
  474. }
  475. break;
  476. }
  477. pDC->SetROP2(R2_COPYPEN);
  478. }
  479. void CDrawGrapObject::DrawArc(CDC* pDC, POINT StartPoint, POINT MidPoint, POINT EndPoint, 
  480.    int LineStyle, COLORREF PenColor)
  481. {
  482. CPen Pen;
  483. CPen* OldPen;
  484. POINT OriginPoint;
  485. double originX;
  486. double originY;
  487. double k1;
  488. double k2;
  489. double mid1X;
  490. double mid1Y;
  491. double mid2X;
  492. double mid2Y;
  493. RECT rect;
  494. long Radius;
  495. long x1, y1, x2, y2;
  496. //设置不填充状态
  497. pDC->SelectStockObject(NULL_BRUSH);
  498. pDC->SetROP2(R2_COPYPEN);
  499. Pen.CreatePen(LineStyle, 1, PenColor);
  500. OldPen = pDC->SelectObject(&Pen);
  501. if(StartPoint.y == MidPoint.y)
  502. k1 = 1000000.0;
  503. else 
  504. k1 = (- (double)(StartPoint.x - MidPoint.x) / (double)(StartPoint.y - MidPoint.y));
  505. if(EndPoint.y == MidPoint.y)
  506. k2 = 1000000.0;
  507. else 
  508. k2 =  (- (double)(EndPoint.x - MidPoint.x) / (double)(EndPoint.y - MidPoint.y));
  509. mid1X = (double)(StartPoint.x + MidPoint.x) / 2.0;
  510. mid1Y = (double)(StartPoint.y + MidPoint.y) / 2.0;
  511. mid2X = (double)(EndPoint.x + MidPoint.x) / 2.0;
  512. mid2Y = (double)(EndPoint.y + MidPoint.y) / 2.0;
  513. if(k1 == k2)
  514. return;
  515. if(k1 == 1000000.0)
  516. {
  517. originX = mid1X;
  518. originY = k2 * (originX - mid2X) + mid2Y;
  519. }
  520. else
  521. if(k2 == 1000000.0)
  522. {
  523. originX = mid2X;
  524. originY = k1 * (originX - mid1X) + mid1Y;
  525. }
  526. else
  527. {
  528. originX = ((k2 * mid2X - k1 * mid1X) - (mid2Y - mid1Y)) / (k2 - k1);
  529. originY = k2 * (originX - mid2X) + mid2Y;
  530. }
  531. Radius = (long)sqrt(pow((double)(originX - StartPoint.x), 2) + pow((double)(originY - StartPoint.y), 2));
  532. OriginPoint.x = (long)originX;
  533. OriginPoint.y = (long)originY ;
  534. rect.left = OriginPoint.x - Radius;
  535. rect.top = OriginPoint.y - Radius;
  536. rect.right = OriginPoint.x + Radius;
  537. rect.bottom = OriginPoint.y + Radius;
  538.     x1 = MidPoint.x - StartPoint.x;
  539. y1 = MidPoint.y - StartPoint.y;
  540. x2 = EndPoint.x - StartPoint.x;
  541. y2 = EndPoint.y - StartPoint.y;
  542.     if(x1*y2 - x2*y1 < 0)
  543. pDC->Arc(&rect, StartPoint, EndPoint);
  544. else
  545. pDC->Arc(&rect, EndPoint, StartPoint);
  546. pDC->SelectObject(OldPen);
  547. }
  548. void CDrawGrapObject::DrawArc(CDC* pDC, POINT OriginPoint, POINT StartPoint, POINT EndPoint, long Radius, 
  549.          int LineStyle, COLORREF PenColor)
  550. {
  551. CPen Pen;
  552. CPen* OldPen;
  553. RECT rect;
  554. Pen.CreatePen(LineStyle, 1, PenColor);
  555. OldPen = pDC->SelectObject(&Pen);
  556. pDC->SetROP2(R2_COPYPEN);
  557. rect.left = OriginPoint.x - Radius;
  558. rect.top = OriginPoint.y - Radius;
  559. rect.right = OriginPoint.x + Radius;
  560. rect.bottom = OriginPoint.y + Radius;
  561. pDC->Arc(&rect, StartPoint, EndPoint);
  562. pDC->SelectObject(OldPen);
  563. }
  564. void CDrawGrapObject::CancelDrawArc(CDC* pDC, POINT StartPoint, POINT MidPoint, 
  565. POINT EndPoint, int times)
  566. {
  567.     POINT OriginPoint;
  568. double originX;
  569. double originY;
  570. double k1;
  571. double k2;
  572. double mid1X;
  573. double mid1Y;
  574. double mid2X;
  575. double mid2Y;
  576. RECT rect;
  577. long Radius;
  578. long x1, y1, x2, y2;
  579. //设置不填充状态
  580. pDC->SelectStockObject(NULL_BRUSH);
  581. pDC->SetROP2(R2_NOT);
  582.     if(times == 1)
  583. {
  584. pDC->MoveTo(StartPoint.x, StartPoint.y);
  585. pDC->LineTo(MidPoint.x, MidPoint.y);
  586. return;
  587. }
  588. if(StartPoint.y == MidPoint.y)
  589. k1 = 1000000.0;
  590. else 
  591. k1 = (- (double)(StartPoint.x - MidPoint.x) / (double)(StartPoint.y - MidPoint.y));
  592. if(EndPoint.y == MidPoint.y)
  593. k2 = 1000000.0;
  594. else 
  595. k2 =  (- (double)(EndPoint.x - MidPoint.x) / (double)(EndPoint.y - MidPoint.y));
  596. mid1X = (double)(StartPoint.x + MidPoint.x) / 2.0;
  597. mid1Y = (double)(StartPoint.y + MidPoint.y) / 2.0;
  598. mid2X = (double)(EndPoint.x + MidPoint.x) / 2.0;
  599. mid2Y = (double)(EndPoint.y + MidPoint.y) / 2.0;
  600. if(k1 == k2)
  601. return;
  602. if(k1 == 1000000.0)
  603. {
  604. originX = mid1X;
  605. originY = k2 * (originX - mid2X) + mid2Y;
  606. }
  607. else
  608. if(k2 == 1000000.0)
  609. {
  610. originX = mid2X;
  611. originY = k1 * (originX - mid1X) + mid1Y;
  612. }
  613. else
  614. {
  615. originX = ((k2 * mid2X - k1 * mid1X) - (mid2Y - mid1Y)) / (k2 - k1);
  616. originY = k2 * (originX - mid2X) + mid2Y;
  617. }
  618. Radius = (long)sqrt(pow((double)(originX - StartPoint.x), 2) + pow((double)(originY - StartPoint.y), 2));
  619. OriginPoint.x = (long)originX;
  620. OriginPoint.y = (long)originY ;
  621. rect.left = OriginPoint.x - Radius;
  622. rect.top = OriginPoint.y - Radius;
  623. rect.right = OriginPoint.x + Radius;
  624. rect.bottom = OriginPoint.y + Radius;
  625.     x1 = MidPoint.x - StartPoint.x;
  626. y1 = MidPoint.y - StartPoint.y;
  627. x2 = EndPoint.x - StartPoint.x;
  628. y2 = EndPoint.y - StartPoint.y;
  629.     if(x1*y2 - x2*y1 < 0)
  630. pDC->Arc(&rect, StartPoint, EndPoint);
  631. else
  632. pDC->Arc(&rect, EndPoint, StartPoint);
  633. }
  634. void CDrawGrapObject::DrawSelArc(CDC* pDC, POINT OriginPoint, POINT StartPoint, POINT EndPoint,
  635.  long Radius, int LineStyle, COLORREF PenColor)
  636. {
  637. CPen *Pen;
  638. CPen* OldPen;
  639. RECT rect;
  640. //设置不填充状态
  641. pDC->SelectStockObject(NULL_BRUSH);
  642. //重画线形为点线的圆弧
  643. Pen = new CPen(PS_DOT, 1, PenColor);
  644. OldPen = pDC->SelectObject(Pen);
  645. pDC->SetROP2(R2_COPYPEN);
  646. rect.left = OriginPoint.x - Radius;
  647. rect.top = OriginPoint.y - Radius;
  648. rect.right = OriginPoint.x + Radius;
  649. rect.bottom = OriginPoint.y + Radius;
  650. pDC->Arc(&rect, StartPoint, EndPoint);
  651. pDC->SelectObject(OldPen);
  652. delete Pen;
  653. Pen = new CPen(PS_SOLID, 1, RGB(0, 0, 255));
  654. OldPen = pDC->SelectObject(Pen);
  655. pDC->Rectangle(StartPoint.x - SELECT_RECT_WIDTH, StartPoint.y - SELECT_RECT_WIDTH ,
  656.            StartPoint.x + SELECT_RECT_WIDTH + 1, StartPoint.y + SELECT_RECT_WIDTH + 1);
  657. pDC->Rectangle(EndPoint.x - SELECT_RECT_WIDTH, EndPoint.y - SELECT_RECT_WIDTH,
  658.            EndPoint.x + SELECT_RECT_WIDTH + 1, EndPoint.y + SELECT_RECT_WIDTH + 1);
  659. //注意以下两句顺序不可颠倒
  660. OldPen = pDC->SelectObject(Pen);
  661. pDC->SelectObject(OldPen);
  662. delete Pen;
  663. }