2013-09-29 133 views
1

我有UserControl:Panel。當我添加到窗體自己的UserControl。 UserControl.Anchor = Left | Right | Top | Bottom。當我調整窗體矩形閃爍時。你怎麼能讓它不眨眼?C#重繪閃爍

public partial class UserControl1 : Panel 
{ 
    public UserControl1() 
    { 
     InitializeComponent(); 
     this.ResizeRedraw = true; 
    } 

    private void UserControl1_Paint(object sender, PaintEventArgs e) 
    { 
     using (Graphics g = this.CreateGraphics()) 
     { 
      Pen pen = new Pen(Color.Black, 1); 
      Brush brush = new SolidBrush(Color.Black); 

      g.DrawRectangle(pen, 0, 0, this.Width - 1, this.Height - 1); 

      pen.Dispose(); 
     } 
    } 
} 

回答

1

嘗試設置doubleBuffered = true並且您不必在疼痛事件中創建圖形對象。你可以從事件參數中獲得。您必須確保您在繪畫事件中執行最少量的任務。

public partial class UserControl1 : Panel 
{ 
    public UserControl1() 
    { 
     InitializeComponent(); 
     this.ResizeRedraw = true; 
     this.DoubleBuffered = true; 
    } 

    private void UserControl1_Paint(object sender, PaintEventArgs e) 
    { 
     var g = e.Graphics; 
     Pen pen = new Pen(Color.Black, 1); 
     Brush brush = new SolidBrush(Color.Black); 
     g.DrawRectangle(pen, 0, 0, this.Width - 1, this.Height - 1); 
    } 
} 
1

有很多事情可以做,以減少閃爍:

  • 通過移動不必要的工作出來的方法(例如創建方法外刷子和筆,讓您的油漆處理程序儘可能快緩存它們以避免每種油漆的創建成本;使用gfx.Clear清除背景而不是填充矩形;重新設計顯示器,以便不必繪製太多東西;將圖像的部分緩存在位圖中,以便它們可以重繪更快)
  • 避免繪製每個像素不止一次(如果你填充背景無線然後用黑色畫出來,它會閃爍。但是如果你繪製一個白色矩形,然後用黑色畫一個框架,你可以避免閃爍)
  • 只通過檢查剪切矩形來繪製圖形的可見部分,以避免繪製當前不是的東西可見)
  • 確保框架不會爲您填充背景(通常爲白色),方法是重寫擦除後臺處理。
  • 啓用雙緩衝,以便消除任何剩餘的閃爍。這比其他方法使用更多的資源,儘管這些日子通常不是什麼大問題。
  • 使用紅色現有的e.Graphics繪製而不是調用CreateGraphics