📄 cdline.cpp
字号:
#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);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -