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);

其他的也一样。

VC++开发GIS系统(125)选择点之CALLBACK回调函数 VC++开发GIS系统(127)选择点类的设计

作者:,GIS爱好者。
分享本文,请您带上本文链接
分享到:

发表评论