123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330 |
- #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);
- }
- }
|