考慮以下塗料函數(縮寫):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毫秒使面板失效。我怎樣才能最終消除閃爍?
是最終需要的?不管你是在渲染。 – 2013-03-03 13:17:43
謝謝,這真的不需要。但是,問題依然存在。 – 2013-03-03 14:35:33
你的代碼並沒有消除閃爍的主要原因,這是由OnPaintBackground()完成的。支持Winforms中的雙緩衝內置支持。檢查[這個答案](http://stackoverflow.com/a/3113515/17034)爲雙緩衝面板。或者,如果您不需要滾動支持,只需使用PictureBox即可,默認情況下打開了雙緩衝的最基本控件。 – 2013-03-03 15:08:03