VC++开发GIS系统(126)选择点之闪烁原理及实现
发布时间: 2016-01-12
所属分类: VC++开发GIS系统
在文章《VC++开发GIS系统(123)选择点概述》中我介绍了选择点中的一个效果就是闪烁点,并询问是不是所选择的点。今天介绍一下闪烁点的实现原理和基础编码。
先看一下效果
其实这个效果就相当于显示一下,然后擦除,再显示,再擦除。
其实看到这个,应该能想到在《VC++开发GIS系统(110)放大地图之简析橡皮筋绘图》中用到的SetROP2函数。也就是说在绘制新图形的同时,用反色再绘制一次上一个图形,这样因为是反色,上一个图形就被擦除掉了。
实现方法
在malaBase的malaCDC类中添加下面函数
public:
void pointDrawCircle(malaPoint Point, malaPointPro PntPro);//绘制一个圆点
void pointDrawCircleX(malaPoint Point, malaPointPro PntPro);//绘制一个圆点(橡皮)
void pointDrawRect(malaPoint Point, malaPointPro PntPro);//绘制一个矩形点
void pointDrawRectX(malaPoint Point, malaPointPro PntPro);//绘制一个矩形点(橡皮)
void pointDrawTriangle(malaPoint Point, malaPointPro PntPro);//绘制一个三角形点
void pointDrawTriangleX(malaPoint Point, malaPointPro PntPro);//绘制一个三角形点(橡皮)
这里其实函数实现和之前的画点没有什么区别,如下:
//三角形(橡皮)
void malaCDC::pointDrawTriangleX(malaPoint Point, malaPointPro PntPro)
{
//MessageBox(NULL, L"绘制三角形", _T("提示"), MB_OK);
CClientDC dc(mView);
dc.SetROP2(R2_NOTXORPEN);
CPen pen(0, 1, PntPro.pointColor);
CPen* OldPen = dc.SelectObject(&pen);
CBrush MyBrush(PntPro.pointColor);
CBrush* OldBrush = dc.SelectObject(&MyBrush);
double radio = PntPro.pointRadio;
double r1 = sqrtf(3.0) / 2.0 * radio;
CPoint* MyArray = new CPoint[3];
CoordToScreen(Point.x - r1, Point.y - (double)radio / 2, mScreen, &MyArray[0].x, &MyArray[0].y);
CoordToScreen(Point.x + r1, Point.y - (double)radio / 2, mScreen, &MyArray[1].x, &MyArray[1].y);
CoordToScreen(Point.x, Point.y + radio, mScreen, &MyArray[2].x, &MyArray[2].y);
dc.Polygon(MyArray, 3);
dc.SelectObject(OldPen);
dc.SelectObject(OldBrush);
}
矩形(橡皮)
//方形点(橡皮)
void malaCDC::pointDrawRectX(malaPoint Point, malaPointPro PntPro)
{
//MessageBox(NULL, L"绘制方形", _T("提示"), MB_OK);
CClientDC dc(mView);
dc.SetROP2(R2_NOTXORPEN);
CPen pen(0, 1, PntPro.pointColor);
CPen* OldPen = dc.SelectObject(&pen);
CBrush MyBrush(PntPro.pointColor);
CBrush* OldBrush = dc.SelectObject(&MyBrush);
CPoint Point1, Point2;
CoordToScreen(Point.x - PntPro.pointRadio, Point.y + PntPro.pointRadio, mScreen, &Point1.x, &Point1.y);
CoordToScreen(Point.x + PntPro.pointRadio, Point.y - PntPro.pointRadio, mScreen, &Point2.x, &Point2.y);
dc.Rectangle(CRect(Point1, Point2));
dc.SelectObject(OldPen);
dc.SelectObject(OldBrush);
}
圆点(橡皮)
//圆点(橡皮)
void malaCDC::pointDrawCircleX(malaPoint Point, malaPointPro PntPro)
{
//MessageBox(NULL, L"绘制圆形", _T("提示"), MB_OK);
CClientDC dc(mView);
dc.SetROP2(R2_NOTXORPEN);
CPen pen(0, 1, PntPro.pointColor);
CPen* OldPen = dc.SelectObject(&pen);
CBrush MyBrush(PntPro.pointColor);
CBrush* OldBrush = dc.SelectObject(&MyBrush);
CPoint Point1, Point2;
CoordToScreen(Point.x - PntPro.pointRadio, Point.y + PntPro.pointRadio, mScreen, &Point1.x, &Point1.y);
CoordToScreen(Point.x + PntPro.pointRadio, Point.y - PntPro.pointRadio, mScreen, &Point2.x, &Point2.y);
dc.Ellipse(CRect(Point1, Point2));
dc.SelectObject(OldPen);
dc.SelectObject(OldBrush);
}
其实可以看出pointDrawCircle和pointDrawCircleX函数只差了一句代码:
dc.SetROP2(R2_NOTXORPEN);
其他的也一样。
相关阅读
声明
1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。
2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。
手机阅读
公众号关注
知识星球
手机阅读
最新GIS干货
私享圈子