双缓冲绘图
为什么需要双缓冲?
没有双缓冲的情况:
直接绘制到屏幕 → 频繁刷新 → 画面闪烁
使用双缓冲的情况:
内存中绘制完整画面 → 一次性复制到屏幕 → 无闪烁
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); } }

浙公网安备 33010602011771号