橡皮线的工作原理:就必须不停地在新位置画出线段,并把以前的画出的线段擦掉。如果背景是单一的颜色,那就好办了,只需要构造一支背景颜色的画笔和一支前景颜色的画笔,然后首先用背景色画笔擦出上次的线段,再用前景颜色的画笔画出新的线段,就可以实现橡皮线了。由于橡皮线的起点是不变的,而终点在不停地改变,因此,还需要记录下前一条线段的终点位置。
    但是,这种方法还有问题存在,一个问题是假如背景色不是单一的,就不好办了。另一个问题就算是单一背景色,移动的橡皮线还会把已存在的图形破坏掉。其解决办法是采用混合模式。
      如果在画橡皮条是直接把线条混合模式设置为R2_NOT(反色)模式,则负负得正,画两次刚好回到屏幕上的图形。也可以设置为R2_NOTXORPEN(非异或)模式或者R2_XORPEN(异或)模式。
    程序设置如下:
    在视图类中添加如下成员变量:
   CPoint m_begin,m_end;     //记录线条的起点、终点
   BOOL m_lMouseIsDown;    //记录鼠标左键是否按下
   BOOL m_lMouseIsUp;        //记录鼠标左键是否弹起
   在视图类成员函数中初始化这三个成员变量
   m_begin.x=m_begin.y=0;
    m_end.x=m_end.y=0;
    m_lMouseIsDown=FALSE;       //初始时鼠标左键没有被按下
    m_lMouseIsUp=TRUE;             //初始时鼠标左键处于弹起状态
   在你的视图类添加一下三个消息处理函数
void CExampleLineView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_begin=point;
m_lMouseIsDown=TRUE;        //鼠标左键被按下
SetCapture();
CView::OnRButtonDown(nFlags, point);
}

void CExampleLine3View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(GetCapture()!=this)return;
CClientDC dc(this);
if(m_lMouseIsDown)           //鼠标左键被按下,拉出橡皮线
{
   dc.SetROP2(R2_NOTXORPEN);     //设置混合模式
   if(!m_lMouseIsUp)            //左键处于弹起状态,擦出上一次画的线段
   {
       dc.MoveTo(m_begin);
      dc.LineTo(m_end);
   }
   m_mouseIsUp=FALSE;
   m_end=point;               //重新记录上一次线段的终点
   dc.MoveTo(m_begin);
   dc.LineTo(m_end);
}

CView::OnMouseMove(nFlags, point);
}

void CExampleLine3View::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(GetCapture()!=this)return;
CClientDC dc(this);
dc.MoveTo(m_begin);
dc.LineTo(point);
m_lMouseIsUp=TRUE;        
m_lMouseIsDown=FALSE;
ReleaseCapture();
CView::OnLButtonUp(nFlags, point);
}

C++ 如何画橡皮线相关推荐

  1. Delphi 通过窗口句柄 加粗窗口边框、描边

    // 使窗口边框变粗 procedure TForm1.InvertTracker(hwndDest: Integer); var hdcDest, hPen, hOldPen, hOldBrush ...

  2. VC++ MFC橡皮筋技术

    在MFC下绘制直线,使用橡皮筋技术,可以使直线效果跟随鼠标移动 //OnLButtionDown        m_ptOrigin = m_ptEnd = point;  //OnMouseMove ...

  3. VC/MFC动态画线(橡皮线),画圆,画椭圆,画矩形

    2012年12月7日 22:42:14 今天我在csdn网站上通过学习别人的博客学习到了动态画矩形,画线的方法,这使得我对Windows的消息循环机制有了更深刻的理解.首先来总结一下我今天的收获,呵呵 ...

  4. CAD中怎么画指北针?CAD画指北针教程

    指北针是一种用于指示方向的工具,广泛应用于各种方向判读,譬如航海.野外探险.城市道路地图阅读等领域.在进行CAD制图的过程中有些时候也会用到指北针,可是有些刚开始进行CAD学习的小伙伴并不知道怎么画指 ...

  5. MFC限制鼠标区域、画橡皮条线、任务栏显示图标、核对标记、文档背景色(二)

    涛涛在学习程序设计,欢迎各位程序设计爱好者和我一起学习 限制鼠标活动区域 可以写在view类的OnMouseMove中添加如下代码 if (nFlags&&MK_LBUTTON) { ...

  6. Python+OpenCV 图像处理系列(3)—— 画线、矩形、画圆、画椭圆、画多边形

    OpenCV 中的绘图函数 使用 OpenCV 绘制不同几何图形,其中包括的函数有 cv2.line() cv2.circle() cv2.rectangle() cv2.ellipse() cv2. ...

  7. 用python快速画小猪佩奇

    前言 最近微电影<啥是佩奇>大火,查考了一下网上的代码,用python画了一只佩奇,大家看看 代码 # coding:utf-8 import turtle as tt.screensiz ...

  8. 【机器学习】【条件随机场CRF-3】条件随机场的参数化形式详解 + 画出对应的状态路径图 + 给出对应的矩阵表示...

    1.条件随机场概念 CRF,Conditional Random Field,是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模式,其特点是假设输出随机变量构成马尔可夫随机场. 条件随机场 ...

  9. G6实现标签拖动连线画流程图

    需求描述 列出所有的task标签,拖动task标签在一旁画流程图,打包task的任务名及id和任务的执行流程以json的格式发给后端. 技术栈 G6,vue,h5自带的draggable实现拖动.也稍 ...

最新文章

  1. SSLGET ×××综合实验题
  2. this.name=name;和this.setName(name);的区别
  3. [转]Javascript 闭包
  4. DockOne微信分享( 九十):猎豹移动基于CoreOS在AWS上的项目实践
  5. 【网址收藏】k8s中helm方式安装postgresql及pgadmin
  6. EXT.NET复杂布局(二)——报表
  7. 为 Nginx 添加模块
  8. php主题怎么增加导航页,为twentytwelve子主题添加pagenavi分页导航 | 科研动力
  9. 组件化思维对于一个UI设计来说有多重要?
  10. Visual Studio Code 1.30 发布,你升级了没?
  11. 如何在github上搭建一个免费的 无限流量的静态网页博客Github pages
  12. python手册中文版-python学习手册下载|
  13. su室内插件_sketchup模型库+SU组件+插件+风格库集+模型 建筑 室内 园林景观
  14. 微处理器flash及ram内容详解
  15. Python 爬虫从入门到进阶之路(八)
  16. python用turtle画四叶草_pythonturtle工具绘制四叶草的实例分享 | 学步园
  17. 逆袭-2014年中电投篮球赛札记_01【转】
  18. APP与服务器数据传输的加密方式
  19. 单片机c语言小灯闪烁,单片机c语言闪烁灯程序.doc
  20. svg绘画扇形 可以改变扇形数量 每个扇形字体居中

热门文章

  1. 2019.7.5刷题统计
  2. POJ 3080 Blue Jeans (KMP)
  3. 计算机网络知识梳理(1)——网络层次
  4. centos 6.8部署nginx
  5. 【u249】新斯诺克
  6. java学习笔记七——继承
  7. Ubuntu ufw防火墙常见命令
  8. Linux 命令缩写
  9. windowsXP的所有应用命令
  10. Mysql插入中文的字段内容时乱码的解决方法