Rect.cpp
上传用户:ckg1000
上传日期:2013-01-26
资源大小:630k
文件大小:11k
源码类别:

CAD

开发平台:

Visual C++

  1. // Rect.cpp: implementation of the CRect class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "CAD2006.h"
  6. #include "Rect.h"
  7. #include "Trigon.h"
  8. #include "math.h"
  9. #ifdef _DEBUG
  10. #undef THIS_FILE
  11. static char THIS_FILE[]=__FILE__;
  12. #define new DEBUG_NEW
  13. #endif
  14. extern enum STATUS;
  15. static bool rectkillround = false;
  16. //////////////////////////////////////////////////////////////////////
  17. // Construction/Destruction
  18. //////////////////////////////////////////////////////////////////////
  19. CRectangle::CRectangle()  //构造
  20. {
  21. m_status = NoClicked;
  22. }
  23. CRectangle::~CRectangle()  
  24. {
  25. }
  26. void CRectangle::OnLbuttondown(CDC *pDC, CPoint point)
  27. {
  28. POINT curPoint;   //左键点击的点
  29. curPoint.x = point.x;
  30. curPoint.y = point.y;
  31. switch(m_status)
  32. {
  33. case NoClicked:
  34. {
  35. m_begPt = m_oldPt = curPoint;
  36. m_status = FirstClicked;     //点击之后状态就变了
  37. }
  38. break;
  39. case FirstClicked:
  40. {
  41. m_endPt = curPoint;
  42. m_status = NoClicked;
  43. }
  44. break;
  45. }
  46. }
  47.                 //鼠标移动(画矩形)
  48. void CRectangle::Onmousemove(CDC *pDC, CPoint point)  
  49. {
  50. POINT curPoint;
  51. curPoint.x = point.x;
  52. curPoint.y = point.y;
  53. if( m_status == FirstClicked )
  54. {
  55. m_endPt = curPoint;
  56. Draw(pDC);
  57. m_oldPt = curPoint;   //此次画完了之后就让当前点为老点,以便让老线重画后变成透明
  58. }
  59. }
  60. void CRectangle::Draw(CDC *pDC)  //画方法
  61. {
  62. HPEN newPen = CreatePen(m_borderStyle,       //创建新画笔
  63. m_borderWidth,m_borderColor^pDC->GetBkColor());
  64. CBrush newbrush;        //创建新画刷
  65. newbrush.CreateSolidBrush(m_backColor^pDC->GetBkColor());
  66. pDC->SelectObject(newbrush);
  67. HPEN oldPen = (HPEN)pDC->SelectObject(newPen);
  68. int oldR2 = pDC->SetROP2(R2_XORPEN);   //设置画笔画刷与背景以异或的方式显示
  69. pDC->Rectangle(m_begPt.x,m_begPt.y, m_oldPt.x,m_oldPt.y);  //擦出以前的矩形
  70. pDC->Rectangle(m_begPt.x,m_begPt.y, m_endPt.x,m_endPt.y);  //画新的
  71. pDC->SetROP2(oldR2);
  72. pDC->SelectObject(oldPen);
  73. ::DeleteObject(newPen);
  74. ::DeleteObject(oldPen);
  75. }
  76. bool CRectangle::IsOnRect(POINT curPt)  //判断一个点是否在矩形上
  77. {
  78. bool yesno = false;
  79. POINT begPtR;   //右上角
  80. begPtR.x = m_endPt.x, begPtR.y = m_begPt.y;
  81. POINT endPtL;   //左下角
  82. endPtL.x = m_begPt.x, endPtL.y = m_endPt.y;
  83. int rectLen = abs(m_begPt.x - m_endPt.x);  //长
  84. int rectWth = abs(m_begPt.y - m_endPt.y);  //宽
  85. if( Distance(curPt, m_begPt) + Distance(curPt, begPtR) <= rectLen +1 ||
  86. Distance(curPt, endPtL) + Distance(curPt, m_endPt) <= rectLen +1 ||
  87. Distance(curPt, m_begPt) + Distance(curPt, endPtL) <= rectWth +1 ||
  88. Distance(curPt, begPtR) + Distance(curPt, m_endPt) <= rectWth +1 )
  89. {
  90. yesno = true;
  91. }
  92. return yesno;
  93. }
  94.                  //选定
  95. bool CRectangle::Select(CDC *pDC, CPoint point)
  96. {
  97. bool yesno = false;
  98. POINT curPt;
  99. curPt.x = point.x;
  100. curPt.y = point.y;
  101. if(IsOnRect(curPt) == true)
  102. {
  103. DrawRound(pDC);
  104. m_oldPt  = curPt;
  105. yesno = true;
  106. }
  107. return yesno;
  108. }
  109.                  //画小圆圈
  110. void CRectangle::DrawRound(CDC *pDC,COLORREF colorRound)  
  111. {
  112. POINT begPtL;   
  113. begPtL.x = m_begPt.x-7,  begPtL.y = m_begPt.y-7;
  114. POINT begPtR;
  115. begPtR.x = m_begPt.x+1,  begPtR.y = m_begPt.y+1;
  116. POINT RbegPtL;
  117. RbegPtL.x = m_endPt.x-1,  RbegPtL.y = m_begPt.y-7;
  118. POINT RbegPtR;
  119. RbegPtR.x = m_endPt.x+7,  RbegPtR.y = m_begPt.y+1;
  120. POINT endPtL;
  121. endPtL.x = m_endPt.x-1,  endPtL.y = m_endPt.y-1;
  122. POINT endPtR;
  123. endPtR.x = m_endPt.x+7,  endPtR.y = m_endPt.y+7;
  124. POINT LendPtL;
  125. LendPtL.x = m_begPt.x-7,  LendPtL.y = m_endPt.y-1;
  126. POINT LendPtR;
  127. LendPtR.x = m_begPt.x+1,  LendPtR.y = m_endPt.y+7;
  128. /* int i = pDC->SetROP2(R2_XORPEN);
  129. HPEN hpen = ::CreatePen(0,0,colorRound^pDC->GetBkColor());
  130. HPEN holdpen =(HPEN)pDC->SelectObject(hpen);
  131. pDC->SelectObject(GetStockObject(NULL_BRUSH));
  132. */
  133. HPEN newPen = ::CreatePen(0,0, colorRound);
  134. HBRUSH newBrush = ::CreateSolidBrush(colorRound);
  135. pDC->SelectObject(newPen);
  136. pDC->SelectObject(newBrush);
  137. pDC->Ellipse(begPtL.x,begPtL.y,begPtR.x,begPtR.y);    
  138. pDC->Ellipse(RbegPtL.x,RbegPtL.y,RbegPtR.x,RbegPtR.y); 
  139. pDC->Ellipse(endPtL.x,endPtL.y,endPtR.x,endPtR.y);
  140. pDC->Ellipse(LendPtL.x,LendPtL.y,LendPtR.x,LendPtR.y);
  141. // pDC->SetROP2(i);
  142. DeleteObject(newPen);
  143. DeleteObject(newBrush);
  144. }
  145. CPoint CRectangle::GetPosBegin()  //返回开始点
  146. {
  147. return m_begPt;
  148. }
  149. CPoint CRectangle::GetPosEnd()   //返回结束点
  150. {
  151. return m_endPt;
  152. }
  153. void CRectangle::SetPosBegin(CPoint point)
  154. {
  155. m_begPt = point;
  156. }
  157. void CRectangle::SetPosEnd(CPoint point)
  158. {
  159. m_endPt = point;
  160. }
  161. void CRectangle::Update(CDC *pDC)    //更新
  162. {
  163. HDC hdc = pDC->GetSafeHdc();
  164. DrawRound(pDC,RGB(255,255,255));  //先用白色擦掉小圆圈
  165. KillMirLine(pDC);   //擦掉镜像直线
  166. if( rectkillround )
  167. {
  168. this->KillRound(pDC);
  169. rectkillround = false;
  170. }
  171. }
  172. void CRectangle::KillMirLine(CDC *pDC)
  173. {
  174. HDC hdc = pDC->GetSafeHdc();
  175. HPEN newPen = CreatePen(0,0,GetBkColor(hdc));   //用背景色重画
  176. HPEN oldPen = (HPEN)SelectObject(hdc,newPen);
  177. ::MoveToEx(hdc,m_MirBegPt.x,m_MirBegPt.y,NULL);
  178. ::LineTo(hdc,m_MirEndPt.x,m_MirEndPt.y);
  179. SelectObject(hdc,oldPen);
  180. ::DeleteObject(newPen);
  181. ::DeleteObject(oldPen);
  182. }
  183.                   //移动事件
  184. void CRectangle::Move(CDC *pDC, CPoint point)
  185. {
  186. POINT curPoint;
  187. curPoint.x = point.x;
  188. curPoint.y = point.y;
  189. POINT begOldPt = m_begPt;      //存老点
  190. POINT endOldPt = m_endPt;
  191. m_begPt.x = begOldPt.x + curPoint.x - m_oldPt.x;   //重新计算每点坐标
  192. m_begPt.y = begOldPt.y + curPoint.y - m_oldPt.y;
  193. m_endPt.x = endOldPt.x + curPoint.x - m_oldPt.x;   
  194. m_endPt.y = endOldPt.y + curPoint.y - m_oldPt.y;
  195. DrawMove(pDC, m_begPt,m_endPt, begOldPt,endOldPt);
  196. m_oldPt = curPoint; 
  197. }
  198.             //移动时矩形的画方法
  199. void CRectangle::DrawMove(CDC *pDC, POINT begPt,POINT endPt, POINT begOldPt, POINT endOldPt)
  200. {
  201. HDC hdc = pDC->GetSafeHdc();
  202. HPEN newPen = CreatePen(m_borderStyle,
  203. m_borderWidth,m_borderColor^pDC->GetBkColor());
  204. HPEN oldPen = (HPEN)SelectObject(hdc,newPen);
  205. int oldR2 = SetROP2(hdc,R2_XORPEN);   //设置画笔画刷与背景以异或的方式显示
  206. SelectObject(hdc,GetStockObject(NULL_BRUSH)); //空画刷
  207. ::Rectangle(hdc,begOldPt.x,begOldPt.y, endOldPt.x,endOldPt.y);  //擦出以前的矩形
  208. ::Rectangle(hdc,begPt.x,begPt.y, endPt.x,endPt.y);
  209. SetROP2(hdc,oldR2);
  210. SelectObject(hdc,oldPen);
  211. ::DeleteObject(newPen);
  212. ::DeleteObject(oldPen);
  213. }
  214.                 //缩放
  215. void CRectangle::Zoom(CDC *pDoc, CPoint point)
  216. {
  217. Update(pDoc);
  218. POINT curPt;
  219. curPt.x = point.x,curPt.y = point.y;
  220. POINT begOldPt = m_begPt;
  221. POINT endOldPt = m_endPt;
  222. if(m_oldPt.y == begOldPt.y)   //选到上边
  223. {
  224. m_begPt.y = curPt.y;
  225. }
  226. if(m_oldPt.y == endOldPt.y)   //下边
  227. {
  228. m_endPt.y = curPt.y;
  229. }
  230. if(m_oldPt.x == begOldPt.x)   //左边
  231. {
  232. m_begPt.x = curPt.x;
  233. }
  234. if(m_oldPt.x == endOldPt.x)   //右边
  235. {
  236. m_endPt.x = curPt.x;
  237. }
  238. DrawMove(pDoc, m_begPt,m_endPt, begOldPt,endOldPt);
  239. m_oldPt = curPt; 
  240. }
  241.                //镜象
  242. void CRectangle::Mirror(CDC *pDoc, CPoint point)
  243. {
  244. POINT curPt = point;
  245. m_oldPt = m_MirEndPt;
  246. m_MirEndPt = curPt;
  247. POINT FirstMirOldPt = m_FirstMirPt;      //存第1个镜像点
  248. POINT SecondMirOldPt = m_SecondMirPt;    //存第2个镜像点
  249. POINT ThirdMirOldPt = m_ThirdMirPt;      //存第3个镜像点
  250. POINT FourMirOldPt = m_FourMirPt;        //存第4个镜像点
  251. POINT begPtR;    //矩形右上角那个点
  252. begPtR.x = m_endPt.x, begPtR.y = m_begPt.y;
  253. POINT endPtL;    //矩形左小角那个点
  254. endPtL.x = m_begPt.x, endPtL.y = m_endPt.y;
  255. m_FirstMirPt = GetMirPt(m_MirBegPt, m_MirEndPt, m_begPt);
  256. m_SecondMirPt = GetMirPt(m_MirBegPt, m_MirEndPt, begPtR);
  257. m_ThirdMirPt = GetMirPt(m_MirBegPt, m_MirEndPt, m_endPt);
  258. m_FourMirPt = GetMirPt(m_MirBegPt, m_MirEndPt, endPtL);
  259. DrawMirLine(pDoc,m_MirBegPt,m_MirEndPt);  //镜像线
  260. DrawFourSdMe(pDoc,m_FirstMirPt,m_SecondMirPt,m_ThirdMirPt,m_FourMirPt,
  261. FirstMirOldPt,SecondMirOldPt,ThirdMirOldPt,FourMirOldPt);
  262. rectkillround = true;
  263. }
  264. void CRectangle::DrawMirLine(CDC *pDC,POINT MirBegPt, POINT MirEndPt)
  265. {
  266. HDC hdc = pDC->GetSafeHdc();
  267. HPEN newPen = CreatePen(2,0,RGB(255,0,0)^GetBkColor(hdc));
  268. HPEN oldPen = (HPEN)SelectObject(hdc,newPen);
  269. int oldR2 = SetROP2(hdc,R2_XORPEN);
  270. ::MoveToEx(hdc,MirBegPt.x,MirBegPt.y,NULL);
  271. ::LineTo(hdc,m_oldPt.x,m_oldPt.y);
  272. ::MoveToEx(hdc,MirBegPt.x,MirBegPt.y,NULL);
  273. ::LineTo(hdc,MirEndPt.x,MirEndPt.y);
  274. SetROP2(hdc,oldR2);
  275. SelectObject(hdc,oldPen);
  276. ::DeleteObject(newPen);
  277. ::DeleteObject(oldPen);
  278. }
  279. //四边形移动时的画方法
  280. void CRectangle::DrawFourSdMe(CDC *pDC, POINT onePt, POINT twoPt, POINT threePt, POINT fourPt,
  281.    POINT oneOdPt,POINT twoOdPt, POINT threeOdPt, POINT fourOdPt)
  282. {
  283. HDC hdc = pDC->GetSafeHdc();
  284. HPEN newPen = ::CreatePen(m_borderStyle,
  285. m_borderWidth,m_borderColor^pDC->GetBkColor());
  286. HBRUSH newBrush = ::CreateSolidBrush(m_backColor^ GetBkColor(hdc));
  287. ::SelectObject(hdc,newPen);
  288. ::SelectObject(hdc,newBrush);
  289. int oldR2 = ::SetROP2(hdc,R2_XORPEN);
  290. POINT topPt[4] ={onePt.x,onePt.y, twoPt.x,twoPt.y,threePt.x,threePt.y, fourPt.x,fourPt.y};
  291. POINT OldTopPt[4] ={oneOdPt.x,oneOdPt.y, twoOdPt.x,twoOdPt.y,threeOdPt.x,threeOdPt.y, fourOdPt.x,fourOdPt.y};
  292. Polygon( hdc, OldTopPt, 4 );
  293. Polygon( hdc, topPt, 4 );
  294. SetROP2(hdc,oldR2);
  295. ::DeleteObject(newPen);
  296. ::DeleteObject(newBrush);
  297. }
  298. /*功    能:求一点关于直线对称的点
  299.   输入参数:直线起点:ptBegin,直线终点:ptEnd,待求点:ptCur
  300.   返 回 值:对称点ptNew                                          */
  301. POINT CRectangle::GetMirPt(const POINT& ptBegin, const POINT& ptEnd,POINT ptCur)
  302. {
  303. POINT ptNew;
  304. double length = Distance(ptBegin,ptEnd);
  305. if(length == 0)
  306. return ptNew=ptCur;
  307. double t1 = 2. * ((ptEnd.x-ptBegin.x)/length) * ((ptEnd.y-ptBegin.y)/length);
  308. double t2 = ((ptEnd.x-ptBegin.x)/length) * ((ptEnd.x-ptBegin.x)/length)
  309. - ((ptEnd.y-ptBegin.y)/length) * ((ptEnd.y-ptBegin.y)/length);
  310. ptNew.x =(int)(ptCur.x*t2 + ptCur.y*t1 + ptBegin.x*(-t2) - ptBegin.y*t1 + ptBegin.x);
  311. ptNew.y =(int)(ptCur.x*t1 + ptCur.y*(-t2) + ptBegin.y*t2 - ptBegin.x*t1 + ptBegin.y);
  312. return ptNew;
  313. }
  314. //求两点之间的距离
  315. int CRectangle::Distance(POINT Pt1, POINT Pt2)  
  316. {
  317. int nDist;
  318. nDist =(int)(sqrt((Pt1.x - Pt2.x)*(Pt1.x - Pt2.x) + (Pt1.y - Pt2.y)*(Pt1.y - Pt2.y)));
  319. return nDist;
  320. }
  321. //镜像时左键点击
  322. void CRectangle::OnMirLBtnDn(CDC *pDC,CPoint point)  
  323. {
  324. HDC hdc = pDC->GetSafeHdc();
  325. /* POINT curPoint;   //左键点击的点
  326. curPoint.x = LOWORD(lParam);   //取低16位 x 值
  327. curPoint.y = HIWORD(lParam);   //取高16位 y 值*/
  328. m_MirBegPt = m_MirEndPt = m_oldPt = point;
  329. }
  330. void CRectangle::Delete(CDC *pDC)   //删除
  331. {
  332. Update(pDC);
  333. HDC hdc = pDC->GetSafeHdc();
  334. HPEN newPen = CreatePen(m_borderStyle,
  335. m_borderWidth,GetBkColor(hdc));
  336. SelectObject(hdc,GetStockObject(NULL_BRUSH)); //空画刷
  337. ::SelectObject(hdc,newPen);
  338. Rectangle(hdc,m_begPt.x,m_begPt.y, m_endPt.x,m_endPt.y);
  339. ::DeleteObject(newPen);
  340. }