C#利用GDI+實現橡皮筋效果
阿新 • • 發佈:2021-10-30
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); } } }