CDLine.cpp
上传用户:qiye66671
上传日期:2009-12-10
资源大小:182k
文件大小:8k
- #include "stdafx.h"
- #include"CDLine.h"
- #include"EastDrawView.h"
- IMPLEMENT_SERIAL(CDLine,CUnit,1)
- void CDLine::DrawStatic(CDC*pDC)
- {
-
- CPen m_pen;
- m_pen.CreatePen(m_PenStyle,m_PenWidth,m_PenColor);
- CPen* pen=(CPen*)pDC->SelectObject(&m_pen);
- int oldDrawingMode=pDC->SetROP2(m_DrawingMode);
- COLORREF OldColor=pDC->SetBkColor(m_BackgroundColor);
- int OldBkMode=pDC->SetBkMode(m_BkMode);
- pDC->MoveTo(m_FirstPoint);
- pDC->LineTo(m_SecondPoint);
- pDC->SelectObject(pen);
- pDC->SetROP2(oldDrawingMode);
- pDC->SetBkMode(m_BkMode);
- pDC->SetBkColor(OldColor);
- }
- CDLine::CDLine()
- {
- CUnit::Initial();
-
- }
- CRgn* CDLine::GetRgn()
- {
- if(m_Rgn==NULL)
-
- m_Rgn=new CRgn;
- else m_Rgn->DeleteObject();
- {
- CPoint point[4];
- CPoint FirstPoint;
- CPoint SecondPoint;
- if((m_FirstPoint.x-m_SecondPoint.x)*(m_FirstPoint.y-m_SecondPoint.y)<0)
- {
- if(m_FirstPoint.x>m_SecondPoint.x)
- {
-
- FirstPoint=m_SecondPoint;
- SecondPoint=m_FirstPoint;
- }
- else
- {
- FirstPoint=m_FirstPoint;
- SecondPoint=m_SecondPoint;
-
- }
- FirstPoint.Offset(-4-m_PenWidth,4+m_PenWidth);
- SecondPoint.Offset(4+m_PenWidth,4+m_PenWidth);
- point[0].x=FirstPoint.x-3-m_PenWidth;
- point[0].y=FirstPoint.y-4-m_PenWidth;
- point[1].x=FirstPoint.x+3+m_PenWidth;
- point[1].y=FirstPoint.y+4+m_PenWidth;
- point[2].x=SecondPoint.x+3+m_PenWidth;
- point[2].y=SecondPoint.y+4+m_PenWidth;
- point[3].x=SecondPoint.x-3-m_PenWidth;
- point[3].y=SecondPoint.y-4-m_PenWidth;
-
- }
- if((m_FirstPoint.x-m_SecondPoint.x)*(m_FirstPoint.y-m_SecondPoint.y)>0)
- {
- if(m_FirstPoint.x>m_SecondPoint.x)
- {
-
- FirstPoint=m_FirstPoint;
- SecondPoint=m_SecondPoint;
- }
- else
- {
- FirstPoint=m_SecondPoint;
- SecondPoint=m_FirstPoint;
- }
- FirstPoint.Offset(-4-m_PenWidth,-4-m_PenWidth);
- SecondPoint.Offset(4+m_PenWidth,4+m_PenWidth);
- point[0].x=FirstPoint.x+3+m_PenWidth;
- point[0].y=FirstPoint.y-4-m_PenWidth;
- point[1].x=FirstPoint.x-3-m_PenWidth;
- point[1].y=FirstPoint.y+4+m_PenWidth;
- point[2].x=SecondPoint.x-3-m_PenWidth;
- point[2].y=SecondPoint.y+4+m_PenWidth;
- point[3].x=SecondPoint.x+3+m_PenWidth;
- point[3].y=SecondPoint.y-4-m_PenWidth;
-
- }
- if((m_FirstPoint.x-m_SecondPoint.x)==0)
- {
- point[0].x=m_FirstPoint.x-3-m_PenWidth;
- point[0].y=m_FirstPoint.y-4-m_PenWidth;
- point[1].x=m_FirstPoint.x+3+m_PenWidth;
- point[1].y=m_FirstPoint.y-4-m_PenWidth;
- point[2].x=m_SecondPoint.x+3+m_PenWidth;
- point[2].y=m_SecondPoint.y+4+m_PenWidth;
- point[3].x=m_SecondPoint.x-3-m_PenWidth;
- point[3].y=m_SecondPoint.y+4+m_PenWidth;
-
- }
- if((m_FirstPoint.y-m_SecondPoint.y)==0)
- {
- point[0].x=m_FirstPoint.x-4-m_PenWidth;
- point[0].y=m_FirstPoint.y-3-m_PenWidth;
- point[1].x=m_FirstPoint.x-4-m_PenWidth;
- point[1].y=m_FirstPoint.y+3+m_PenWidth;
- point[2].x=m_SecondPoint.x+4+m_PenWidth;
- point[2].y=m_SecondPoint.y+3+m_PenWidth;
- point[3].x=m_SecondPoint.x+4+m_PenWidth;
- point[3].y=m_SecondPoint.y-3-m_PenWidth;
-
- }
- m_Rgn->CreatePolygonRgn(point,4,ALTERNATE);
- }
- return m_Rgn;
- }
- void CDLine::Initial()
- {
- m_FirstPoint=0;
- m_SecondPoint=0;
- m_PenColor=RGB(0,0,0);
- m_PenWidth=1;
- m_PenStyle=PS_SOLID;
-
-
- }
- int CDLine::IsOnMarginPoint(CPoint point)
- {
- CRect L_Rect1;
- CRect L_Rect2;
- CRect L_Rect3;
- L_Rect1.SetRect(m_FirstPoint,m_FirstPoint);
- L_Rect2.SetRect(m_SecondPoint,m_SecondPoint);
- L_Rect3.SetRect((m_SecondPoint.x+m_FirstPoint.x)/2,(m_SecondPoint.y+m_FirstPoint.y)/2,(m_SecondPoint.x+m_FirstPoint.x)/2,(m_SecondPoint.y+m_FirstPoint.y)/2);
- L_Rect1.InflateRect(5+m_PenWidth,5+m_PenWidth);
- L_Rect2.InflateRect(5+m_PenWidth,5+m_PenWidth);
- L_Rect3.InflateRect(5+m_PenWidth,5+m_PenWidth);
- if(L_Rect1.PtInRect(point))
- {
- m_FoundPoint=m_FirstPoint;
- return 1;
- }
- if(L_Rect2.PtInRect(point))
- {
- m_FoundPoint=m_SecondPoint;
- return 2;
- }
- if(L_Rect3.PtInRect(point))
- {
- m_FoundPoint=CPoint((m_SecondPoint.x+m_FirstPoint.x)/2,(m_SecondPoint.y+m_FirstPoint.y)/2);
- return 3;
- }
-
- return 0;
- }
- void CDLine::Circumrotate(CPoint first,CPoint second)
- {
- double k;
- int x;
- if(m_FirstPoint.x-m_SecondPoint.x==0)
- k=99999999999;
- else k=double(first.y-second.y)/(first.x-second.x);
- x=(k*(first.y+second.y)+(first.x+second.x)+(k*k-1)*m_FirstPoint.x-2*k*m_FirstPoint.y)/(k*k+1);
- m_FirstPoint.y=k*(x-this->m_FirstPoint.x)+this->m_FirstPoint.y;
- m_FirstPoint.x=x;
- x=(k*(first.y+second.y)+(first.x+second.x)+(k*k-1)*m_SecondPoint.x-2*k*m_SecondPoint.y)/(k*k+1);
- m_SecondPoint.y=k*(x-this->m_SecondPoint.x)+this->m_SecondPoint.y;
- m_SecondPoint.x=x;
- }
- void CDLine::ShowSelectPoint(CDC*pDC)
- {
-
- CBrush brush;
- brush.CreateSolidBrush(RGB(0,0,255));
- CPen m_pen;
- m_pen.CreatePen(PS_SOLID,1,RGB(0,0,255));
- CPen *OldPen=pDC->SelectObject(&m_pen);
- int oldBkMode=pDC->SetBkMode(OPAQUE);
- CBrush *OldBrush=pDC->SelectObject(&brush);
- int oldDrawingMode=pDC->SetROP2(R2_NOTXORPEN);
- CRect rect(m_FirstPoint,m_FirstPoint);
- rect.InflateRect(3,3);
- pDC->Rectangle(rect);
-
- rect=CRect(m_SecondPoint,m_SecondPoint);
- rect.InflateRect(3,3);
- pDC->Rectangle(rect);
- pDC->SelectObject(OldBrush);
- brush.DeleteObject();
- brush.CreateSolidBrush(RGB(255,0,0));
- OldBrush=pDC->SelectObject(&brush);
- rect=CRect((m_FirstPoint.x+m_SecondPoint.x)/2,(m_FirstPoint.y+m_SecondPoint.y)/2,(m_FirstPoint.x+m_SecondPoint.x)/2,(m_FirstPoint.y+m_SecondPoint.y)/2);
- rect.InflateRect(3,3);
- pDC->Rectangle(rect);
-
- pDC->SelectObject(OldPen);
- pDC->SetBkMode(oldBkMode);
- pDC->SelectObject(OldBrush);
- pDC->SetROP2(oldDrawingMode);
- }
- BOOL CDLine::IsInRgn(CPoint point)
- {
- this->GetRgn();
- return(m_Rgn->PtInRegion(point));
- }
- void CDLine::DrawActive(CDC *pDC,CPoint point)
- {
- CPen m_pen;
- m_pen.CreatePen(m_PenStyle,m_PenWidth,m_PenColor);
- CPen* pen=(CPen*)pDC->SelectObject(&m_pen);
- COLORREF OldColor=pDC->SetBkColor(m_BackgroundColor);
- int OldBkMode=pDC->SetBkMode(m_BkMode);
- pDC->MoveTo(m_FirstPoint);
- pDC->LineTo(m_SecondPoint);
- pDC->SelectObject(pen);
- pDC->SetBkMode(m_BkMode);
- pDC->SetBkColor(OldColor);
- }
- void CDLine::OnLButtonDown(CDC *pDC, CEastDrawView *pView, CPoint point)
- {
- if(m_HaveFindFirst)
- {
- pView->L_iPointCount=IsOnMarginPoint(point);
- if(pView->L_iPointCount==1)
- {
- pView->m_bHaveFindSecond=true;
- pView->m_CurrentDrawTool=DLine_Tool;
- pView->m_CurrentDrawStatus=Change_Status;
- pView->m_FirstPoint=m_SecondPoint;
- pView->m_SecondPoint=point;
- }
- if(pView->L_iPointCount==2)
- {
- pView->m_bHaveFindSecond=true;
- pView->m_CurrentDrawTool=DLine_Tool;
- pView->m_CurrentDrawStatus=Change_Status;
- pView->m_FirstPoint=m_FirstPoint;
- pView->m_SecondPoint=point;
- }
- if(pView->L_iPointCount==3)
- {
- pView->m_bHaveFindSecond=true;
- pView->m_CurrentDrawTool=DLine_Tool;
- pView->m_CurrentDrawStatus=Drag_Status;
- pView->m_FirstPoint=m_FirstPoint;
- pView->m_SecondPoint=m_SecondPoint;
- }
- }//**********if(L_pDLine->m_HaveFindFirst)
- if((!pView->m_bHaveFindSecond)&&IsInRgn(point))
- {
- if(!m_HaveFindFirst)
- {
- m_HaveFindFirst=true;
- pView->m_bHaveFindFirst=true;
- ShowSelectPoint(pDC);
- }
- else
- {
- this->m_HaveFindFirst=false;
- pView->m_bHaveFindFirst=true;
- this->ShowSelectPoint(pDC);
- }
- }
-
- if(pView->m_bHaveFindSecond)
- {
- pView->m_pCurrentUnit=this;
- m_DrawingMode=pDC->GetROP2();
- ShowSelectPoint(pDC);
- DrawStatic(pDC);
- DrawOldReferencePoint(pDC,m_FoundPoint);
- }
- }
- void CDLine::OnMouseMove(CDC *pDC, CEastDrawView *pView, CPoint point)
- {
- if(pView->m_CurrentDrawStatus==Drag_Status)
- {
- m_FirstPoint.Offset(pView->m_SecondPoint.x-pView->m_FirstPoint.x,pView->m_SecondPoint.y-pView->m_FirstPoint.y);
- m_SecondPoint.Offset(pView->m_SecondPoint.x-pView->m_FirstPoint.x,pView->m_SecondPoint.y-pView->m_FirstPoint.y);
- }
- else
- {
- pDC->SetROP2(R2_NOTXORPEN);
- //m_DrawingMode=pDC->GetROP2();
- this->DrawActive(pDC,point);
- pView->m_SecondPoint=point;
- //m_pCurrentUnit->m_FirstPoint=m_FirstPoint;
- m_SecondPoint=pView->m_SecondPoint;
- this->DrawActive(pDC,point);
- }
- }