麻辣GIS微信平台

更多 GIS 干货

微信关注不错过

VC++开发GIS系统(126)选择点之闪烁原理及实现

在文章《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);

其他的也一样。

相关阅读

麻辣GIS-Sailor

作者:

GIS爱好者,学GIS,更爱玩GIS。

声明

1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。

2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。

手机阅读
公众号关注
知识星球
手机阅读
麻辣GIS微信公众号关注
最新GIS干货
关注麻辣GIS知识星球
私享圈子

留言板(小编看到第一时间回复)