VC++开发GIS系统(110)放大地图之简析橡皮筋绘图
前文《VC++开发GIS系统(109)放大地图之功能解析》介绍了放大功能,其中使用拉框放大的时候会用到橡皮筋绘图,这里也做一个简要介绍。
关于橡皮筋绘图
简单来说,就是自动擦除之前的绘图痕迹,看下来就像是拉着一根橡皮筋一样,如图:
实现步骤
鼠标左键按下:记录起始点。
鼠标移动:画出从起始点到现有图形,并删除上一图形。
鼠标左键松开:画出起始点到现有点的图形。
实现方法
主要的方法是利用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
相关阅读
声明
1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。
2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。