📄 pline.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 + -