麻辣GIS微信平台

更多 GIS 干货

微信关注不错过

VC++开发GIS系统(110)放大地图之简析橡皮筋绘图

前文《VC++开发GIS系统(109)放大地图之功能解析》介绍了放大功能,其中使用拉框放大的时候会用到橡皮筋绘图,这里也做一个简要介绍。

关于橡皮筋绘图

简单来说,就是自动擦除之前的绘图痕迹,看下来就像是拉着一根橡皮筋一样,如图:

实现步骤

  1. 鼠标左键按下:记录起始点。

  2. 鼠标移动:画出从起始点到现有图形,并删除上一图形。

  3. 鼠标左键松开:画出起始点到现有点的图形。

实现方法

主要的方法是利用SetROP2函数的取反来实现的,也就是说在绘制新图形的同时,用反色再绘制一次上一个图形,这样因为是反色,上一个图形就被擦除掉了。下面是关于SetROP2函数参数:

R2_BLACK Pixel is always black. //所有绘制出来的像素为黑色
R2_WHITE Pixel is always white. //所有绘制出来的像素为白色
R2_NOP Pixel remains unchanged. //任何绘制将不改变当前的状态
R2_NOT Pixel is the inverse of the screen color. //当前绘制的像素值设为屏幕像素值的反,这样可以覆盖掉上次的绘图,(自动擦除上次绘制的图形)
R2_COPYPEN Pixel is the pen color. //使用当前的画笔的颜色
R2_NOTCOPYPEN Pixel is the inverse of the pen color. 

本文实现橡皮筋主要用到的是R2_NOTXORPEN这个参数

R2_NOTXORPEN这种绘画模式是这样的,它先把画笔颜色与屏幕颜色异或,(这里异或是数学计算,1与1为0,1与0为1,我们说颜色其实就是二进制数,)异或之后再取反最后得到一个颜色值显示在屏幕上。

举个例子,你使用R2_NOTXORPEN这种绘画模式,你用红色画笔在黑色背景上画一条直线,显示红色,但你再用这只笔在刚画的直线上重画一遍,就相当于把开始画的红线擦除掉了,划线的地方显示为背景色。

R2_NOT绘画模式同样有在同一个地方画两次相当于什么都没画的功能,不过R2_NOT绘画模式第一次画的时候显示颜色并不是你选定的画笔颜色,而是默认的颜色。

封装橡皮筋绘图函数

利用《VC++开发GIS系统(46)自定义一个CDC绘图类》中的自定义CDC类,添加下面的函数

void drawRectNULLFill(malaPoint Point1, malaPoint point2);//绘制空心矩形

实现如下:

/*
* 绘制空心矩形
*/
void malaCDC::drawRectNULLFill(malaPoint Point1, malaPoint point2)
{
    CClientDC dc(mView);
    dc.SetROP2(R2_NOTXORPEN);
    CPen pen(0, 1, RGB(255, 0, 0));
    CPen* OldPen = dc.SelectObject(&pen);

    CPoint MyPoint1;
    CPoint MyPoint2;
    CoordToScreen(Point1.x, Point1.y, mScreen, &MyPoint1.x, &MyPoint1.y);
    CoordToScreen(point2.x, point2.y, mScreen, &MyPoint2.x, &MyPoint2.y);
    CRect re(MyPoint1, MyPoint2);
    dc.Rectangle(re);
    dc.SelectObject(OldPen);
}

详细代码可以参考:GitHub

相关阅读

麻辣GIS-Sailor

作者:

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

声明

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

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

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

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