1. 程式人生 > 其它 >C#利用GDI+實現橡皮筋效果

C#利用GDI+實現橡皮筋效果

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);
                }
            }
        }