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

📄 pline.cpp

📁 用于地理信息系统(GIS)行业程序。 完整的鼠标交互式地图点、线、面的绘制
💻 CPP
字号:
#include "stdafx.h"
#include "DrawShape.h"
#include "Draw.h"
#include "Pline.h"

extern CDrawShapeView* gpCDrawShapeView;
extern CGraphPara* gpCGraphPara;

	IMPLEMENT_SERIAL(CPline,CObject,1)

	CPline::CPline(short colorPen,short colorBrush,short lineWide,short lineType,short layer,int idOnly,BOOL bDelete,int pointNum,PointStruct* pointArray,BOOL bFill)
		:CDraw( colorPen, colorBrush, lineWide,  lineType, layer, idOnly, bDelete)
	{
		m_PointNum=pointNum;
		m_bFill=bFill;
		m_PointArray=new PointStruct[m_PointNum];
		if(pointNum>0)
		{
			for(int i=0;i<m_PointNum;i++)
			{
				m_PointArray[i].x=pointArray[i].x;
				m_PointArray[i].y=pointArray[i].y;

			}
		}

	}
	
	CPline::~CPline()
	{
		if(m_PointNum>0)
		delete m_PointArray;
//		AfxMessageBox("hello");
	}

	void CPline::Draw(CDC *pDC,int drawMode1,int drawMode2,short color)
	//drawMode1:绘图模式,0----R2_COPYPEN,1----R2_NOT
	//drawMode2:特殊显示,0--正常显示,1--特殊显示(如用鼠标选中时)
	//2--用指定颜色显示,由参数colorPen指定颜色
	{
		if(m_bDelete)
			return;

	float minX,minY,maxX,maxY;
	GetBoundRect(minX,minY,maxX,maxY);
	if(!IsRectCross(minX,minY,maxX,maxY))
	{
		return;
	}

	short color_pen=m_ColorPen;  //存为局部变量,当要指定颜色显示时
								//也不直接为CDraw类数据成员赋值,以免对单个
								//图形的颜色赋值而影响所有图形所具有的默认颜色。
	short line_type=m_LineType;
	short color_brush=m_ColorBrush;
	int x1,y1;


		POINT* point_array ;
		point_array=new POINT[m_PointNum];

		for(int i=0;i<m_PointNum;i++)
		{
		gpCDrawShapeView->APtoLP(m_PointArray[i].x,m_PointArray[i].y,&x1,&y1);
	
		//为point_array坐标数组赋值

		point_array[i].x=x1;
		point_array[i].y=y1;

		}
	

	if(drawMode1==0)
		pDC->SetROP2(R2_COPYPEN);
	else
		pDC->SetROP2(R2_NOT);
	if(drawMode2==2) //用指定颜色color给pen、brush赋值
	{
		color_pen=color;
		color_brush=color;
	}

	if(drawMode2==1)//如有鼠标选定,改变线型
	{
		if(line_type!=2)//不为虚线则设为虚线
			line_type=2;
		else
			line_type++;
	}

	CPen pen(line_type,m_LineWide,gpCGraphPara->GetColor(color_pen)); 	
//	CPen pen(line_type,m_LineWide,RGB(0,0,255)); 	


	CPen* pOldPen=pDC->SelectObject(&pen);
	CBrush brush(gpCGraphPara->GetColor(color_brush));
	CBrush*	pOldBrush=pDC->SelectObject(&brush);


	if(m_bFill)//有填充,绘制多边形
	{
		if(drawMode2==1)//选定对象,反色显示
		{
			CRgn rgn;
			rgn.CreatePolygonRgn(point_array,m_PointNum,1);
			pDC->InvertRgn(&rgn);
			
		}
		else
			pDC->Polygon(point_array,m_PointNum);
	}
	else //绘制连续直线
	{
		pDC->MoveTo(point_array[0]);
		CString	str;
		str.Format("%d,%d",point_array[0].x,point_array[0].y);
		TRACE0(str);
		for(int i=1;i<m_PointNum;i++)
		{
			pDC->LineTo(point_array[i]);
		}

	}
		

	
	delete[] point_array; //删除用来存储临时实际坐标数据的数组
	pDC->SelectObject(pOldPen);
	pDC->SelectObject(pOldBrush);

	
}


	void CPline::GetBoundRect(float& x1, float& y1, float& x2, float& y2)
	{

		//左下角:
		x1=m_PointArray[0].x;
		y1=m_PointArray[0].y;
		x2=m_PointArray[0].x;
		y2=m_PointArray[0].y;

	//遍历所有多边形点求得边界矩形

		for(int i=0; i < m_PointNum; i++)
		{
			if(m_PointArray[i].x < x1)
			{
				x1=m_PointArray[i].x;
			}

			if( m_PointArray[i].y < y1)
			{
				y1=m_PointArray[i].y;
			}

			if(m_PointArray[i].x > x2)
			{
				x2=m_PointArray[i].x;
			}

			if(m_PointArray[i].y > y2)
			{
				y2=m_PointArray[i].y;
			}
		}

	}

	void CPline::Serialize(CArchive& ar)
	{
		//调用基类Serialize
		CDraw::Serialize(ar);

		if(ar.IsStoring())	//存储
		{
			ar<<m_bFill<<m_PointNum;

			//遍历多边形、区域的每个点,存储其x/y坐标
			for(int i=0; i < m_PointNum; i++)
			{
				ar<<m_PointArray[i].x<<m_PointArray[i].y;

			}
		}
		else	//读取
		{
			ar>>m_bFill>>m_PointNum;

			//遍历多边形、区域的每个点,读取其x/y坐标


			//动态分配存储数组
			m_PointArray=new PointStruct[m_PointNum];

			for(int i=0; i < m_PointNum; i++)
			{
				ar>>m_PointArray[i].x>>m_PointArray[i].y;

			}
		}
	}

⌨️ 快捷键说明

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