首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# WinForm 繪圖閃爍根因分析與解決方案:CreateGraphics 雙緩衝配合 Invalidate(1x1) 避免清空背景幀

     編輯:關於C語言

閃爍成因

Refresh() 會先以背景色清空整個控件,再繪製圖像。即使使用雙緩衝,中間仍會產生一個「空白幀」,高頻重繪時即產生閃爍。

解決方案

  1. 每幀建立 Graphics g = this.CreateGraphics()(不可用 PaintEventArgs 的 g)。
  2. 將待繪圖像繪製至大小等於控件的記憶體位圖(雙緩衝)。
  3. 重繪時呼叫 Invalidate(new Rectangle(0, 0, 1, 1))。
  4. 在 OnPaint 中直接繪製雙緩衝位圖。

原理解析

Invalidate(new Rectangle(0,0,1,1)) 會觸發 Paint 事件,但不會清空背景(因區域極小),避免空白幀產生,閃爍徹底消失。

核心代碼:


Bitmap buffer = new Bitmap(this.Width, this.Height);
using (Graphics g = Graphics.FromImage(buffer))
{
    // 繪製所有圖形至 buffer
}
this.Invalidate(new Rectangle(0, 0, 1, 1)); // 觸發 Paint 不清背景

protected override void OnPaint(PaintEventArgs e)
{
    e.Graphics.DrawImage(buffer, 0, 0);
}

原理重於技巧,理解機制才能舉一反三。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved