双缓冲绘图

为什么需要双缓冲?

 

   没有双缓冲的情况:

直接绘制到屏幕 → 频繁刷新 → 画面闪烁

使用双缓冲的情况:
内存中绘制完整画面 → 一次性复制到屏幕 → 无闪烁

 

private Bitmap bufferBitmap;      // 后台缓冲区(内存中的位图)
private Graphics bufferGraphics;  // 用于在后台缓冲区上绘制的Graphics对象
MyPanel canvasPanel;              // 需要绘制的目标面板控件

 

 

// 创建一个与面板相同大小的位图作为后台缓冲区
bufferBitmap = new Bitmap(canvasPanel.Width, canvasPanel.Height);

// 获取该位图的Graphics对象,用于在内存中绘制
bufferGraphics = Graphics.FromImage(bufferBitmap);

 

绘制

 private void myPanel1_Paint(object sender, PaintEventArgs e)
 {
     // 双缓冲绘制
    //清空
bufferGraphics.Clear(Color.White); // 绘制网格背景 DrawGrid(bufferGraphics); using (Pen gridPen = new Pen(Color.Red, 1)) { gridPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid; bufferGraphics.DrawLine(gridPen, 100, 100, 200, 200); } // 绘制到屏幕 e.Graphics.DrawImage(bufferBitmap, Point.Empty); }

其中

  bufferGraphics.Clear(Color.White);

就是清空所有已经绘制的图形

 

 

重绘

 canvasPanel.Invalidate();

 

 

 

双缓冲的panle类

   public class MyPanel : Panel
   {
       public MyPanel()
       {
           SetStyle(ControlStyles.AllPaintingInWmPaint |
                    ControlStyles.UserPaint |
                    ControlStyles.DoubleBuffer, true);
       }
   }

 

posted @ 2026-01-16 10:03  家煜宝宝  阅读(2)  评论(0)    收藏  举报