2013-03-03 46 views
1

考慮以下塗料函數(縮寫):Paint方法閃爍

public void paint(object sender, PaintEventArgs e) 
{ 
    base.OnPaint(e); 

    Graphics g = e.Graphics; 

    BufferedGraphicsContext context = BufferedGraphicsManager.Current; 
    BufferedGraphics buffer = context.Allocate(g, e.ClipRectangle); 

    buffer.Graphics.Clear(Color.PaleVioletRed); 

    // skip drawing if cond is true (condition is not relevant) 
    if(!cond) 
    { 
     try 
     { 
      // l is some List<p> 
      foreach(Point p in l) 
      { 
      // ...calculate X and Y... (not relevant) 

      buffer.Graphics.FillEllipse(new SolidBrush(Color.Blue), p.X,p.Y, Point.SIZE,Point.SIZE); 
      }           
     } 

     catch {} // some exception handling (not relevant) 

     finally{ 
      buffer.Render(g); 
     } 
    }     
    buffer.Render(g); 
} 

注意,上面的碼是多還是僞代碼以下。我希望使用BufferedGraphics對象時,閃爍會消失。事實上,它沒有。起初,我認爲繪畫方法會花費很長時間,大概不會(每次調用我都會測量4-7毫秒)。如果我將cond設置爲true,它仍然會閃爍,儘管繪畫方法幾乎沒有時間。可能很重要的是繪畫方法會繪製在面板上,並且我使用計時器大致每隔50毫秒使面板失效。我怎樣才能最終消除閃爍?

+2

是最終需要的?不管你是在渲染。 – 2013-03-03 13:17:43

+0

謝謝,這真的不需要。但是,問題依然存在。 – 2013-03-03 14:35:33

+1

你的代碼並沒有消除閃爍的主要原因,這是由OnPaintBackground()完成的。支持Winforms中的雙緩衝內置支持。檢查[這個答案](http://stackoverflow.com/a/3113515/17034)爲雙緩衝面板。或者,如果您不需要滾動支持,只需使用PictureBox即可,默認情況下打開了雙緩衝的最基本控件。 – 2013-03-03 15:08:03

回答

2

剛剛嘗試在構造函數中設置屬性:

this.DoubleBuffered = true; 

那麼你不應該需要BufferedGraphics東西:

public void paint(object sender, PaintEventArgs e) 
{ 
    base.OnPaint(e); 

    Graphics g = e.Graphics;  
    g.Clear(Color.PaleVioletRed); 

    // skip drawing if cond is true (condition is not relevant) 
    if(!cond) 
    { 
    // l is some List<p> 
    foreach(Point p in l) 
    { 
     // ...calculate X and Y... (not relevant) 
     g.FillEllipse(new SolidBrush(Color.Blue), p.X,p.Y, Point.SIZE,Point.SIZE); 
    }           
    } 
} 
+0

感謝您的回答。不幸的是,該小組沒有這樣的財產。我擔心可能會有一些誤解:'paint'是我onPaint的事件監聽器,我沒有從Panel中派生出來。 – 2013-03-03 14:38:06

+0

@MaxBeikirch嘗試從面板派生。或者您可以使用一些反射:[如何在窗體上雙緩衝.NET控件?](http://stackoverflow.com/a/77233/719186) – LarsTech 2013-03-03 14:43:34

+0

從唯一解決方案中的面板派生。我希望我能避免這種情況,但遺憾的是這種方式行不通。感謝您的回答! – 2013-03-09 20:41:57