C#利用GDI+实现橡皮筋效果

  • A+
所属分类:.NET技术
摘要

因为C#课一次作业需要在winform上实现一个简单的绘图程序,要求添加橡皮筋效果。图像是在picturebox控件上绘制的,我一开始始终解决不了的问题是要实现橡皮筋效果,鼠标移动过程中绘制显示的图形就要随时擦除,但是通过GDI+在控件的Graphic对象上绘制图形就不能再擦掉了。在网上搜索了一下,不管是刷新重绘控件,还是通过在内存中开辟位图的办法都失败,后面那种办法是最多的,但我怎么都弄不好,可能是我真地太菜了吧!


C#利用GDI+实现橡皮筋效果

因为C#课一次作业需要在winform上实现一个简单的绘图程序,要求添加橡皮筋效果。图像是在picturebox控件上绘制的,我一开始始终解决不了的问题是要实现橡皮筋效果,鼠标移动过程中绘制显示的图形就要随时擦除,但是通过GDI+在控件的Graphic对象上绘制图形就不能再擦掉了。在网上搜索了一下,不管是刷新重绘控件,还是通过在内存中开辟位图的办法都失败,后面那种办法是最多的,但我怎么都弄不好,可能是我真地太菜了吧!

最终找到了办法是通过GDI+自带的双缓冲技术实现的,方法如下:

  • 鼠标移动事件响应函数

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)         {             // 利用双缓冲实现橡皮筋效果和绘制图层容器图形             BufferedGraphicsContext Mybuffer = BufferedGraphicsManager.Current;             BufferedGraphics buffered = Mybuffer.Allocate(pb, pictureBox1.ClientRectangle);             // 设置背景色为白色             buffered.Graphics.FillRectangle(Brushes.White, pictureBox1.ClientRectangle);             // 绘制当前的图形             actionTool.onmousemove(e, buffered.Graphics);             // 绘制图层容器中的图形             LayerService.DrawLayer(buffered.Graphics);             // 将图形渲染到屏幕上             buffered.Render(pb);             buffered.Dispose();             Mybuffer.Dispose();          } 
  • 鼠标点击事件响应函数

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)         {             // 使用绘制工具构造并添加图形对像             actionTool.onmousedown(e);         } 
  • 绘制工具类[^以绘制直线为例]

    class DrawLine : AbstractTool     {         private Point _startPoint;         private Point _endPoint;         private Polyline2D _line;         public bool _dragging = false;         public DrawLine(Options p) : base(p) {}         public override void onmousedown(MouseEventArgs e)         {             // 构造图形对象             base.onmousedown(e);             if(e.Button == MouseButtons.Left)             {                 if (_dragging)                 {                     _endPoint = mouseDown;                     _line.Add_Point(_endPoint);                     LayerService.Add_Geometry(_line);                     _dragging = false;                                      }                 else                 {                     _startPoint = mouseDown;                     _line = new Polyline2D(ops);                     _line.Add_Point(_startPoint);                     _dragging = true;                 }             }                      }         // 橡皮筋效果实现         public override void onmousemove(MouseEventArgs e,Graphics g)         {             base.onmousemove(e, g);             if (_dragging)             {                 if (_line.getPtCount() < 2)                     _line.Add_Point(mouseMove);                 else                     _line[1] = mouseMove;                 _line.draw(g);             }         }     }