📄 line.cpp
字号:
// Line.cpp: implementation of the CLine class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "geditor.h"
#include "Line.h"
#include "geditorView.h"
#include "geditorDoc.h"
#include "prop.h"
#include <cmath>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//This MACRO is used for serializing the object
IMPLEMENT_SERIAL(CLine, CShape,1)
//Constructor
CLine::CLine()
{
m_tStartPt.x = m_tStartPt.y = 0;
m_tEndPt.x = m_tEndPt.y = 0;
rad=0;
MidPt.x=MidPt.y=0;
edgeclr=0x00C0C0C0;
}
//Destructor
CLine::~CLine()
{
}
//Set the start pt of the line to "pt"
void CLine::SetStartPt(POINT& pt)
{
m_tStartPt.x = pt.x;
m_tStartPt.y = pt.y;
}
//Set the end pt of the line to "pt"
void CLine::SetEndPt(POINT& pt)
{
m_tEndPt.x = pt.x;
m_tEndPt.y = pt.y;
}
void CLine::Draw(CDC* pDC)
{
CPen pen(linesty,width,(COLORREF)m_color);
CPen* oldPen = pDC->SelectObject(&pen);
pDC->MoveTo(m_tStartPt);
pDC->LineTo(m_tEndPt);
// Cprop *p=(Cprop*)AfxGetApp()->
// m_pMainWnd->GetDescendantWindow(IDD_PRPTBAR);
if ((dragmode==1)|(dragmode==2))
{
UpdateProp(0);
};
if (dragmode!=0)
{
CPen pens(PS_SOLID,1,RGB(0,0,0));
pDC->SelectObject(&pens);
int RecWd=4;
pDC->Rectangle(m_tStartPt.x-RecWd,m_tStartPt.y-RecWd,m_tStartPt.x+RecWd,m_tStartPt.y+RecWd);
pDC->Rectangle(m_tEndPt.x-RecWd,m_tEndPt.y-RecWd,m_tEndPt.x+RecWd,m_tEndPt.y+RecWd);
DeleteObject(pens);
};
pDC->SelectObject(oldPen);
DeleteObject(pen);
}
//Serialize CLine object.
void CLine::Serialize(CArchive& ar)
{
//Call base class Serialize()
CObject::Serialize(ar);
if(ar.IsStoring())
{
ar<<m_tStartPt<<m_tEndPt<<m_color<<dragmode<<name<<linesty;
}
else
{
ar>>m_tStartPt>>m_tEndPt>>m_color>>dragmode>>name>>linesty;
}
}
#ifdef _DEBUG
void CLine::AssertValid() const
{
CObject::AssertValid();
// ASSERT(m_tStartPt.x >= 0 && m_tStartPt.y >= 0);
// ASSERT(m_tEndPt.x >= 0 && m_tEndPt.y >= 0);
}
void CLine::Dump(CDumpContext& dc) const
{
CObject::Dump(dc);
}
#endif //_DEBUG
void CLine::dragobj(int leash,CDC *pDC,CPoint pt,CGeditorView* pView)//,CDC *pDC,Cpt pt,CGeditorView *pView)
{//0:no leash
if (leash==1)
pt.y=movept.y;
else if (leash==2)
pt.x=movept.x;
invalid(pView);
if (dragmode==1) {
m_tStartPt.x+=pt.x-movept.x;
m_tStartPt.y+=pt.y-movept.y;
m_tEndPt.x+=pt.x-movept.x;
m_tEndPt.y+=pt.y-movept.y;
movept.x=pt.x;
movept.y=pt.y;
} else if (dragmode==2)
m_tEndPt=pt;
Draw(pDC);
// pDC->MoveTo(m_tStartPt);
// pDC->LineTo(m_tEndPt);
}
int CLine::InTest(CPoint pt)
{//return value:0-not seled;1-select all;2-select one point.
//is inside the m_tStartPt or m_tEndPt
HCURSOR m_hCrossCursor;
int Rng=4;
if ((abs(m_tStartPt.x-pt.x)<=Rng)&&(abs(m_tStartPt.y-pt.y)<=Rng)) {
CPoint temppt=m_tStartPt;
m_tStartPt=m_tEndPt;
m_tEndPt=temppt;
m_hCrossCursor=AfxGetApp()->LoadStandardCursor(IDC_SIZEALL);
::SetCursor(m_hCrossCursor);
return 2;
} else if ((abs(m_tEndPt.x-pt.x)<=Rng)&&(abs(m_tEndPt.y-pt.y)<=Rng))
{
m_hCrossCursor=AfxGetApp()->LoadStandardCursor(IDC_SIZEALL);
::SetCursor(m_hCrossCursor);
return 2;
};
//is out of all point:
if ((pt.x>m_tEndPt.x)&&(pt.x>m_tStartPt.x)||
(pt.y>m_tEndPt.y)&&(pt.y>m_tStartPt.y)||
(pt.x<m_tEndPt.x)&&(pt.x<m_tStartPt.x)||
(pt.y<m_tEndPt.y)&&(pt.y<m_tStartPt.y))
return 0;
int linea,lineb,linec;
linea=m_tEndPt.y-m_tStartPt.y;
lineb=m_tStartPt.x-m_tEndPt.x;
linec=m_tStartPt.y*m_tEndPt.x-m_tStartPt.x*m_tEndPt.y;
int paramup=abs(pt.x*linea+pt.y*lineb+linec);
double paramdown=sqrt(linea*linea+lineb*lineb);
if (paramdown!=0)
{
int distance=(int)(paramup/paramdown);
if (distance<=2)
{
m_hCrossCursor = AfxGetApp()->LoadCursor(IDC_CURSEL);
::SetCursor(m_hCrossCursor);
return 1;
}
}
return 0;
}
CShape * CLine::copys(TCHAR &ch)
{
CLine *l;
l=new CLine;
POINT pt;
pt=GetStartPt();
pt.x+=10;
pt.y+=10;
l->SetStartPt(pt);
pt=GetEndPt();
pt.x+=10;
pt.y+=10;
l->SetEndPt(pt);
ch='L';
return l;
}
void CLine::rotate(int rsel,CDC *pDC,CPoint pt, CGeditorView *pView)
{
invalid(pView);
if(dragmode==1)
{
float rpt=(float)sqrt((pt.x-MidPt.x)*(pt.x-MidPt.x)+(pt.y-MidPt.y)*(pt.y-MidPt.y));
m_tEndPt.x=MidPt.x+(int)((rad/rpt)*(pt.x-MidPt.x));
m_tEndPt.y=MidPt.y+(int)((rad/rpt)*(pt.y-MidPt.y));
m_tStartPt.x=2*MidPt.x-m_tEndPt.x;
m_tStartPt.y=2*MidPt.y-m_tEndPt.y;
}
else
{
m_tEndPt=pt;
m_tStartPt.x=2*MidPt.x-m_tEndPt.x;
m_tStartPt.y=2*MidPt.y-m_tEndPt.y;
};
Draw(pDC);
}
void CLine::CalForRot(CPoint &pt)
{
MidPt.x=(int)((m_tStartPt.x+m_tEndPt.x)/2);
MidPt.y=(int)((m_tStartPt.y+m_tEndPt.y)/2);
rad=(float)sqrt((m_tStartPt.x-MidPt.x)*(m_tStartPt.x-MidPt.x)+(m_tStartPt.y-MidPt.y)*(m_tStartPt.y-MidPt.y));
if(((float)(m_tStartPt.x-pt.x))/((float)(m_tStartPt.x-MidPt.x))<1)
{//鼠标点距离m_tStartPt更近
CPoint temp;
temp=m_tStartPt;
m_tStartPt=m_tEndPt;
m_tEndPt=m_tStartPt;
};
}
void CLine::Mirror(int syd, CDC *pDC,CPoint &basept,CGeditorView* pView)
{
invalid(pView);
switch(syd)
{
case 0://x轴为对称轴
m_tStartPt.y=2*basept.y-m_tStartPt.y;
m_tEndPt.y=2*basept.y-m_tEndPt.y;
break;
case 1://y轴为对称轴
m_tStartPt.x=2*basept.x-m_tStartPt.x;
m_tEndPt.x=2*basept.x-m_tEndPt.x;
break;
case 2://原点对称
m_tStartPt.x=2*basept.x-m_tStartPt.x;
m_tEndPt.x=2*basept.x-m_tEndPt.x;
m_tStartPt.y=2*basept.y-m_tStartPt.y;
m_tEndPt.y=2*basept.y-m_tEndPt.y;
break;
case 3://自对称
int x;
x=m_tStartPt.x;
m_tStartPt.x=m_tEndPt.x;
m_tEndPt.x=x;
break;
default:
break;
};
Draw(pDC);
}
void CLine::invalid(CGeditorView *pView)
{
CPoint oldpt;
oldpt=m_tEndPt;
int itwd=width/2+1;
CPoint apoly[4];
if ((m_tStartPt.x>oldpt.x)&&(m_tStartPt.y>oldpt.y)||
(m_tStartPt.x<oldpt.x)&&(m_tStartPt.y<oldpt.y)) {
apoly[0].x=m_tStartPt.x-itwd;
apoly[1].x=m_tStartPt.x+itwd;
apoly[2].x=oldpt.x+itwd;
apoly[3].x=oldpt.x-itwd;
apoly[0].y=m_tStartPt.y+itwd;
apoly[1].y=m_tStartPt.y-itwd;
apoly[2].y=oldpt.y-itwd;
apoly[3].y=oldpt.y+itwd;
} else {
apoly[0].x=m_tStartPt.x-itwd;
apoly[1].x=m_tStartPt.x+itwd;
apoly[2].x=oldpt.x+itwd;
apoly[3].x=oldpt.x-itwd;
apoly[0].y=m_tStartPt.y-itwd;
apoly[1].y=m_tStartPt.y+itwd;
apoly[2].y=oldpt.y+itwd;
apoly[3].y=oldpt.y-itwd;
}
CRgn* pRgn=new CRgn();
pRgn->CreatePolygonRgn(apoly,4,ALTERNATE);
pView->InvalidateRgn(pRgn);
delete pRgn;
itwd=10;
apoly[0].x=m_tStartPt.x-itwd;
apoly[1].x=m_tStartPt.x-itwd;
apoly[2].x=m_tStartPt.x+itwd;
apoly[3].x=m_tStartPt.x+itwd;
apoly[0].y=m_tStartPt.y-itwd;
apoly[1].y=m_tStartPt.y+itwd;
apoly[2].y=m_tStartPt.y+itwd;
apoly[3].y=m_tStartPt.y-itwd;
CRgn* pRgns=new CRgn();
pRgns->CreatePolygonRgn(apoly,4,ALTERNATE);
pView->InvalidateRgn(pRgns);
delete pRgns;
apoly[0].x=m_tEndPt.x-itwd;
apoly[1].x=m_tEndPt.x-itwd;
apoly[2].x=m_tEndPt.x+itwd;
apoly[3].x=m_tEndPt.x+itwd;
apoly[0].y=m_tEndPt.y-itwd;
apoly[1].y=m_tEndPt.y+itwd;
apoly[2].y=m_tEndPt.y+itwd;
apoly[3].y=m_tEndPt.y-itwd;
CRgn* pRgne=new CRgn();
pRgne->CreatePolygonRgn(apoly,4,ALTERNATE);
pView->InvalidateRgn(pRgne);
delete pRgne;
}
void CLine::UpdateProp(int sel)
{
/* switch (sel)
{
case 0:
sprintf(svalue,"%3d",m_tStartPt.x);
p->m_list.SetItemText(0,1,svalue);
sprintf(svalue,"%3d",m_tStartPt.y);
p->m_list.SetItemText(1,1,svalue);
case 1:
sprintf(svalue,"%3d",m_tEndPt.x);
p->m_list.SetItemText(2,1,svalue);
sprintf(svalue,"%3d",m_tEndPt.y);
p->m_list.SetItemText(3,1,svalue);
break;
default:
break;
};
p->m_widthbdy.SetPos(width);
p->m_Fill.EnableWindow(FALSE);
p->bkclr=0;
p->m_fill=FALSE;*/
}
void CLine::InitProp()
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -