⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 line.cpp

📁 一个复杂的画图系统
💻 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 + -