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

📄 paintpolygon.cpp

📁 这是书上的代码
💻 CPP
字号:
// PaintPolygon.cpp: implementation of the CPaintPolygon class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "const.h"
#include "paintobj.h"
#include "painted.h"
#include "paintdoc.h"
#include "SearchPath.h"
#include "SearchNode.h"
#include "paintvw.h"
#include "PaintPolygon.h"
#include "FillColorStatic.h"
#include "PolygonAttrDlg.h"
#include "DevicePolygonAttrDlg.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
extern double fscale;

extern void DPtoVP(CPnt pnt,CPoint& point);
extern void VPtoDP(CPoint point,CPnt& pnt);
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
IMPLEMENT_SERIAL(CPaintPolygon, CObject, VERSIONABLE_SCHEMA)
CPaintPolygon::CPaintPolygon()
{
	m_uCount=0;
	m_bFilled=TRUE;
	m_rgbInside=RGB(125,125,125);
}

CPaintPolygon::~CPaintPolygon()
{
	if (m_uCount>0)
	{
		delete []m_pntData;
	}
}

void CPaintPolygon::Draw(CDC* pDC)
{
	CPen*	pOldPen;
	CPen	pDrawPen;
	CBrush 	DrawBrush;
	CBrush* pOldBrush;
	if (m_bFilled)
	{
		DrawBrush.CreateSolidBrush(m_rgbInside);
		pOldBrush = pDC->SelectObject(&DrawBrush);
	}
	else
	{
		pOldBrush = (CBrush*) pDC->SelectStockObject(WHITE_BRUSH);
	}
	pDrawPen.CreatePen(PS_SOLID, m_nWidth, m_rgbPrimary);
	pOldPen = pDC->SelectObject(&pDrawPen);	

	CPoint* m_ppoint;
	m_ppoint=new CPoint[m_uCount];
	for(int i=0;i<m_uCount;i++)
	{
		DPtoVP(m_pntData[i],m_ppoint[i]);
	}
	pDC->Polygon(m_ppoint,m_uCount);
	delete []m_ppoint;
	pDC->SelectObject(pOldBrush);
	pDC->SelectObject(pOldPen);
}
void CPaintPolygon::DragDraw(CDC* pDC, CPnt& pointDragged)
{

	//响应WM-LBUTTONDOWN消息时得到顶点m_pntData[m_uCount-1]
	//的同时也给m_pointEnd赋值,使两者相等
	pDC->SetROP2(R2_NOT);//R2_XORPEN   R2_NOTMASKPEN 	
	CPen*	pOldPen;
	CPen	pDrawPen;
	CPoint m_pointPrimary1;
	CPoint m_pointEnd1;
	CPoint m_pointDragged;

	DPtoVP(m_pointPrimary,m_pointPrimary1);
	DPtoVP(m_pointEnd,m_pointEnd1);//把最终实际坐标变换为用于显示的逻辑坐标
	DPtoVP(pointDragged,m_pointDragged);

	pDrawPen.CreatePen(PS_DOT, 0, m_rgbPrimary);
	pOldPen = pDC->SelectObject(&pDrawPen);

	pDC->MoveTo(m_pointPrimary1.x,m_pointPrimary1.y);
	pDC->LineTo(m_pointEnd1.x,m_pointEnd1.y);
	
	pDC->MoveTo(m_pointPrimary1.x,m_pointPrimary1.y);
	pDC->LineTo(m_pointDragged.x,m_pointDragged.y);
	
	m_pointEnd = pointDragged;
	pDC->SelectObject(pOldPen);
}


void CPaintPolygon::Move(double x_Move,double y_Move)
{
	//移动起点和终点坐标
	for(int i=0;i<m_uCount;i++)
	{		
		m_pntData[i].x+=x_Move;
		m_pntData[i].y+=y_Move;
	}
	
}


void CPaintPolygon::MoveDraw(CDC* pDC, CPnt& p1,CPnt& p2)
{
	pDC->SetROP2(R2_XORPEN);//R2_XORPEN	
	CPen*	pOldPen;
	CPen	pDrawPen;
	CPoint m_pp1;
	CPoint m_pp2;
	CPoint pp1;
	CPoint pp2;
	DPtoVP(m_p1,m_pp1);
	DPtoVP(m_p2,m_pp2);//把最终实际坐标变换为用于显示的逻辑坐标
	DPtoVP(p1,pp1);
	DPtoVP(p2,pp2);
	pDrawPen.CreatePen(PS_DOT, 0, m_rgbPrimary);
	pOldPen = pDC->SelectObject(&pDrawPen);
	if(m_bFirstMove)//第一次移动
	{
		m_bFirstMove=FALSE;
		pDC->MoveTo(pp1.x,pp1.y);
		pDC->LineTo(pp2.x,pp2.y);
	}
	else
	{
		pDC->MoveTo(m_pp1.x,m_pp1.y);
		pDC->LineTo(m_pp2.x,m_pp2.y);
		pDC->MoveTo(pp1.x,pp1.y);
		pDC->LineTo(pp2.x,pp2.y);
	}
	m_p1=p1;
	m_p2=p2;
	pDC->SelectObject(pOldPen);
}
void CPaintPolygon::DrawSelected(CDC* pDC, void* pTemp)
{	 
	pDC->SetROP2(R2_COPYPEN);		
	CBrush 	DrawBrush;
	CBrush* pOldBrush;
	CPen*	pOldPen;
	CPen	pDrawPen;

	DrawBrush.CreateHatchBrush(HS_FDIAGONAL, 0);
	pOldBrush = pDC->SelectObject(&DrawBrush);
	pDrawPen.CreatePen(PS_SOLID, m_nWidth, m_rgbPrimary);
	pOldPen = pDC->SelectObject(&pDrawPen);

	CPoint* m_ppoint;
	m_ppoint=new CPoint[m_uCount];
	for(int i=0;i<m_uCount;i++)
	{
		DPtoVP(m_pntData[i],m_ppoint[i]);
	}
	pDC->Polygon(m_ppoint,m_uCount);
	delete []m_ppoint;	
	pDC->SelectObject(pOldPen);
	pDC->SelectObject(pOldBrush);
}
/*
void CPaintPolygon::DrawSpecialNode(CDC* pDC)//显示断点非相切点
{
	CPen*	pOldPen;
	CPen	pDrawPen;
	CBrush*	pOldBrush;		
	pOldBrush = (CBrush *) pDC->SelectStockObject(WHITE_BRUSH);
	CPoint m_pointPrimary1;
	CPoint m_pointEnd1;
	DPtoVP(m_pointPrimary,m_pointPrimary1);
	DPtoVP(m_pointEnd,m_pointEnd1);//把最终实际坐标变换为用于显示的逻辑坐标
	pDrawPen.CreatePen(PS_SOLID, m_nWidth, m_rgbPrimary);
	pOldPen = pDC->SelectObject(&pDrawPen);	
	pDC->MoveTo(m_pointPrimary1.x,m_pointPrimary1.y);
	pDC->LineTo(m_pointEnd1.x,m_pointEnd1.y);
	//起点状态0=相切点1=非相切点2=断点
	if(m_uStartNodeState==2)//断点
	{
		pDC->MoveTo(m_pointPrimary1.x-3,m_pointPrimary1.y-3);
		pDC->LineTo(m_pointPrimary1.x+4,m_pointPrimary1.y+4);
		pDC->MoveTo(m_pointPrimary1.x-3,m_pointPrimary1.y+3);
		pDC->LineTo(m_pointPrimary1.x+4,m_pointPrimary1.y-4);
	}
	else if(m_uStartNodeState==1)//非相切点
	{
		pDC->Rectangle(m_pointPrimary1.x-4,m_pointPrimary1.y-4,m_pointPrimary1.x+4,m_pointPrimary1.y+4);
	}
	//终点状态0=相切点1=非相切点2=断点
	if(m_uEndNodeState==2)//断点
	{
		pDC->MoveTo(m_pointEnd1.x-3,m_pointEnd1.y-3);
		pDC->LineTo(m_pointEnd1.x+4,m_pointEnd1.y+4);
		pDC->MoveTo(m_pointEnd1.x-3,m_pointEnd1.y+3);
		pDC->LineTo(m_pointEnd1.x+4,m_pointEnd1.y-4);
	}
	else if(m_uEndNodeState==1)//非相切点
	{
		pDC->Rectangle(m_pointEnd1.x-4,m_pointEnd1.y-4,m_pointEnd1.x+4,m_pointEnd1.y+4);
	}
	pDC->SelectObject(pOldPen);
	pDC->SelectObject(pOldBrush);
}
*/
void CPaintPolygon::OnDown(CPnt& pointDown)
{
	m_pointEnd.x = m_pointPrimary.x = pointDown.x;
	m_pointEnd.y = m_pointPrimary.y = pointDown.y;
}
/*
void CPaintPolygon::ChangeOrigin(CPnt pnt)//改变坐标原点
{	
	m_pointPrimary.x=m_pointPrimary.x-pnt.x;
	m_pointPrimary.y=m_pointPrimary.y-pnt.y;
	m_pointEnd.x=m_pointEnd.x-pnt.x;
	m_pointEnd.y=m_pointEnd.y-pnt.y;
}
*/
void CPaintPolygon::OnDown2(CPnt& pointDown)
{

}
void CPaintPolygon::OnUp(CPnt& pointUp, CWnd* pWnd)
{
	CClientDC tempDC(pWnd);
	Draw(&tempDC);
}
/*
//
//判断是否点击了某节点
//返回0==没击中,1==击中起点,2==击中终点
UINT CPaintPolygon::IsHit1(CPnt& pointBang)
{
	UINT forreturn=0;
	CPoint m_pointPrimary1;	
	CPoint m_pointEnd1;
	CPoint m_pointBang1;

	DPtoVP(m_pointPrimary,m_pointPrimary1);	
	DPtoVP(m_pointEnd,m_pointEnd1);
	DPtoVP(pointBang,m_pointBang1);
	if(Distance(m_pointBang1.x,m_pointBang1.y,m_pointPrimary1.x,m_pointPrimary1.y)<4)
	{
		forreturn=1;
	}
	else if(Distance(m_pointBang1.x,m_pointBang1.y,m_pointEnd1.x,m_pointEnd1.y)<4)
	{
		forreturn=2;
	}
	return forreturn;
}
*/

void CPaintPolygon::IsDblClk(void* pTemp1,void* pTemp2)//是否被双击选中
{
	if(m_uObjectType==1)//地图对象的类型0=路径1=建筑2=设备
		IsDblClkBuilding(pTemp1,pTemp2);
	else if(m_uObjectType==2)
		IsDblClkDevice(pTemp1,pTemp2);
}

BOOL CPaintPolygon::IsHit(CPnt& pointBang)
{
	CRgn rgn;
	CPoint* bbcc;
	CPoint bang;	
	DPtoVP(pointBang,bang);
	bbcc=new CPoint[m_uCount];
	for(int i=0;i<m_uCount;i++)
	{
		DPtoVP(m_pntData[i],bbcc[i]);
	}
	rgn.CreatePolygonRgn(bbcc,m_uCount,ALTERNATE);

	if(rgn.PtInRegion(bang.x,bang.y)!=0)
	{
		rgn.DeleteObject();
		delete []bbcc;
		return TRUE;
	}
	else
	{
		rgn.DeleteObject();
		delete []bbcc;
		return FALSE;
	}
}

void CPaintPolygon::GetBoundingRect(double &minx,double &miny,double &maxx,double &maxy)
{
	double xmin,xmax,ymin,ymax;	
	for(int i=0;i<m_uCount;i++)
	{
		if(i==0)
		{
			xmin=m_pntData[0].x;
			xmax=m_pntData[0].x;
			ymin=m_pntData[0].y;
			ymax=m_pntData[0].y;
		}
		else
		{
			xmin=min(xmin,m_pntData[i].x);
			xmax=max(xmax,m_pntData[i].x);
			ymin=min(ymin,m_pntData[i].y);
			ymax=max(ymax,m_pntData[i].y);
		}
	}	
	minx = xmin;
	miny = ymin;
	maxx = xmax;
	maxy = ymax;
}

void CPaintPolygon::Serialize(CArchive& ar)
{
	CPainted::Serialize(ar);
	if (ar.IsStoring())
	{	
		ar << m_uCount;
		for(int i=0;i<m_uCount;i++)
		{
			ar << m_pntData[i];			
		}
		ar <<m_rgbInside;
		ar <<m_bFilled;
	}
	else
	{	
		ar >> m_uCount;
		m_pntData=new CPnt[m_uCount];//顶点数组
		for(int i=0;i<m_uCount;i++)
		{
			ar >> m_pntData[i];			
		}
		ar >>m_rgbInside;
		ar >>m_bFilled;
	}
}


void CPaintPolygon::onup1(CPnt& point1, CPnt& point2, CPnt& point3,CWnd *pWnd)
{	m_pointPrimary=point1;
	m_pointEnd=point2;
}

CPnt CPaintPolygon::returnattr1()
{
	return m_pointPrimary;
}
CPnt CPaintPolygon::returnattr2()
{
	return	m_pointEnd;
}
//得到路径的绘制起点
//画线时自动取就近的线条端点为起点
//起点为直线端点时return 1;
//起点为圆弧端点时return 2;
//起点为鼠标点时return 0;(即鼠标点距离就近的线条端点超过规定的范围)
//pnt1 为传递的鼠标点坐标,成功则赋值为就近的线条端点坐标,不成功则无意义
//pnt2 成功则为直线的另一端点或圆弧的圆心,不成功则无意义
int CPaintPolygon::GetPathStartnode(CPnt& pnt1, CPnt& pnt2)
{
	
	return 1;
}
//得到路径的绘制终点
//返回值==FALSE时表示终点独立(不与任何节点相连)
//返回值==TRUE时表示终点与某节点相连
//
BOOL CPaintPolygon::GetPathEndnode(CPnt& pnt1)
{	
	 return 1;
}

/*
double CPaintPolygon::Distance1(double x1, double y1, double x2, double y2)
{
return (double)sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}

void CPaintPolygon::toChar(char *p_Char)
{
	double x1,y1,x2,y2,Speed,Length,Angle;
	UINT PathId,StartId,StartType,EndId,EndType,HeadDir,Guide,Obstacle;
	x1=m_pointPrimary.x;
	y1=m_pointPrimary.y;
	x2=m_pointEnd.x;
	y2=m_pointEnd.y;

	Speed=m_fPathLimit;//速度限制
	Length=m_flength;//直线长度
	Angle=m_fangle;//直线角度
	PathId=m_uPathId;//路径ID 5
	StartId=m_uStartNodeId;//起点ID 5
	StartType=m_uStartNodeType;//起点类型 2
	EndId=m_uEndNodeId;//终点ID 5
	EndType=m_uEndNodeType;//终点类型 2
	HeadDir=m_uPathHeading;//路径车头方向 2
	Guide=m_uPathGuideType;//导航方式 1
	Obstacle=m_uPathObstacle;//路径障碍物模式 4	
	char p1[126];
	//把格式化数据写到字符串
	sprintf(p1,"%12.4f,%12.4f,%12.4f,%12.4f,%12.4f,%12.4f,%12.4f,%5d,%5d,%2d,%5d,%2d,%2d,%1d,%4d\n",
		x1,y1,x2,y2,Speed,Length,Angle,PathId,StartId,
		StartType,EndId,EndType,HeadDir,Guide,Obstacle);
	p1[125]=0;
	lstrcat(p_Char,p1);//增加在p_Char字符串后
}

char * CPaintPolygon::toData(char *p_Char)
{
	float x1,y1,x2,y2,Speed,Length,Angle;
	UINT PathId,StartId,StartType,EndId,EndType,HeadDir,Guide,Obstacle;
	char p1[126];
	strncpy(p1,p_Char,125);	//拷贝一个125字节长度的字符串
	p_Char+=125;			//指向成员变量的字符串后的位置
	p1[125]=0;
	//从字符串读格式化数据
	sscanf(p1,"%f,%f,%f,%f,%f,%f,%f,%d,%d,%d,%d,%d,%d,%d,%d\n",
		&x1,&y1,&x2,&y2,&Speed,&Length,&Angle,&PathId,&StartId,
		&StartType,&EndId,&EndType,&HeadDir,&Guide,&Obstacle);
	m_pointPrimary.x=x1;
	m_pointPrimary.y=y1;
	m_pointEnd.x=x2;
	m_pointEnd.y=y2;

	m_fPathLimit=Speed;//速度限制
	m_flength=Length;//直线长度
	m_fangle=Angle;//直线角度
	m_uPathId=PathId;//路径ID
	m_uStartNodeId=StartId;//起点ID
	m_uStartNodeType=StartType;//起点类型
	m_uEndNodeId=EndId;//终点ID
	m_uEndNodeType=EndType;//终点类型
	m_uPathHeading=HeadDir;//路径车头方向
	m_uPathGuideType=Guide;//导航方式
	m_uPathObstacle=Obstacle;//路径障碍物模式
	return p_Char;			//返回指向成员变量的字符串后的位置
}
void CPaintPolygon::Move(double x_Move,double y_Move)
{
	//移动直线的起点和终点坐标
	m_pointPrimary.x+=x_Move;
	m_pointEnd.x+=x_Move;
	m_pointPrimary.y+=y_Move;
	m_pointEnd.y+=y_Move;
}
void CPaintPolygon::DrawErase(CDC* pDC)//擦除图形WHITE_BRUSHHOLLOW_BRUSH
{	
	pDC->SetROP2(R2_COPYPEN);
	CPen*	pOldPen;
	CPen	pDrawPen;
	CBrush*	pOldBrush;		
	pOldBrush = (CBrush *) pDC->SelectStockObject(HOLLOW_BRUSH);
	CPoint m_pointPrimary1;
	CPoint m_pointEnd1;
	DPtoVP(m_pointPrimary,m_pointPrimary1);
	DPtoVP(m_pointEnd,m_pointEnd1);//把最终实际坐标变换为用于显示的逻辑坐标
	pDrawPen.CreatePen(PS_SOLID, m_nWidth, RGB(255,255,255));
	pOldPen = pDC->SelectObject(&pDrawPen);	
	pDC->Rectangle(m_pointPrimary1.x-4,m_pointPrimary1.y-4,m_pointPrimary1.x+4,m_pointPrimary1.y+4);
	pDC->Rectangle(m_pointEnd1.x-4,m_pointEnd1.y-4,m_pointEnd1.x+4,m_pointEnd1.y+4);
	pDC->Ellipse(m_pointPrimary1.x-4,m_pointPrimary1.y-4,m_pointPrimary1.x+4,m_pointPrimary1.y+4);
	pDC->Ellipse(m_pointEnd1.x-4,m_pointEnd1.y-4,m_pointEnd1.x+4,m_pointEnd1.y+4);

	pDC->SelectObject(pOldPen);
	pDC->SelectObject(pOldBrush);
}
*/


void CPaintPolygon::toChar(char *p_Char)
{
	
}

char * CPaintPolygon::toData(char *p_Char)
{
	
	return p_Char;			//返回指向成员变量的字符串后的位置
}

void CPaintPolygon::ChangeOrigin(CPnt pnt)//改变坐标原点
{	
	for(int i=0;i<m_uCount;i++)
	{
		m_pntData[i].x=m_pntData[i].x-pnt.x;
		m_pntData[i].y=m_pntData[i].y-pnt.y;
	}
}

void CPaintPolygon::IsDblClkBuilding(void *pTemp1, void *pTemp2)
{
	BOOL change=FALSE;
	m_pDoc = (CPaintobjDoc*) pTemp1;
	CPolygonAttrDlg polygonattr;				
	polygonattr.m_pDoc =(CPaintobjDoc*) pTemp1;
	polygonattr.m_pActive1=this;	
	polygonattr.m_nCount=m_uCount;//顶点数量
	polygonattr.m_bFill=m_bFilled;
	polygonattr.m_ctlFillColor.m_FillColor=m_rgbInside;
	if(polygonattr.DoModal()==IDOK)
	{
		if(polygonattr.m_bChange)
		{
			change=TRUE;
		}
		if(polygonattr.m_bFill!=m_bFilled)
		{
			change=TRUE;
			m_bFilled=polygonattr.m_bFill;			
		}
		if(m_bFilled&&m_rgbInside!=polygonattr.m_ctlFillColor.m_FillColor)
		{
			change=TRUE;
			m_rgbInside=polygonattr.m_ctlFillColor.m_FillColor;
		}
		if(change) 
		{
			((CPaintobjView*) pTemp2)->Invalidate();
		}
	}

}

void CPaintPolygon::IsDblClkDevice(void *pTemp1, void *pTemp2)
{
	BOOL change=FALSE;
	m_pDoc = (CPaintobjDoc*) pTemp1;
	CDevicePolygonAttrDlg polygonattr;				
	polygonattr.m_nDeviceId=m_nDeviceId;
	polygonattr.m_nSomeStatus=m_nSomeStatus;
	polygonattr.m_nStatusNumber=m_nStatusNumber;
	polygonattr.m_pActive1=this;
	polygonattr.m_nCount=m_uCount;//顶点数量
	polygonattr.m_bFill=m_bFilled;
	polygonattr.m_ctlFillColor.m_FillColor=m_rgbInside;
	if(polygonattr.DoModal()==IDOK)
	{
		m_nDeviceId=polygonattr.m_nDeviceId;
		m_nSomeStatus=polygonattr.m_nSomeStatus;
		m_nStatusNumber=polygonattr.m_nStatusNumber;
		if(polygonattr.m_bChange)
		{
			change=TRUE;
		}
		if(polygonattr.m_bFill!=m_bFilled)
		{
			change=TRUE;
			m_bFilled=polygonattr.m_bFill;			
		}
		if(m_bFilled&&m_rgbInside!=polygonattr.m_ctlFillColor.m_FillColor)
		{
			change=TRUE;
			m_rgbInside=polygonattr.m_ctlFillColor.m_FillColor;
		}
		if(change) 
		{
			((CPaintobjView*) pTemp2)->Invalidate();
		}
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -