C# 画法闪烁

C# 画法闪烁,c#,doublebuffered,C#,Doublebuffered,考虑以下绘制功能(缩写): public void paint(对象发送器,PaintEventArgs e) { 基础漆(e); 图形g=e.图形; BufferedGraphicsContext上下文=BufferedGraphicsManager.Current; BufferedGraphics buffer=context.Allocate(g,e.ClipRectangle); 缓冲区。图形。清晰(颜色。淡紫色); //如果条件为真(条件不相关),则跳过绘图 如果(!cond) {

考虑以下绘制功能(缩写):

public void paint(对象发送器,PaintEventArgs e)
{
基础漆(e);
图形g=e.图形;
BufferedGraphicsContext上下文=BufferedGraphicsManager.Current;
BufferedGraphics buffer=context.Allocate(g,e.ClipRectangle);
缓冲区。图形。清晰(颜色。淡紫色);
//如果条件为真(条件不相关),则跳过绘图
如果(!cond)
{
尝试
{
//l是一些列表
foreach(l中的p点)
{ 
//…计算X和Y…(不相关)
缓冲区。图形。填充椭圆(新的SolidBrush(颜色。蓝色),p.X,p.Y,Point.SIZE,Point.SIZE);
}                                          
}
catch{}//某些异常处理(不相关)
最后{
缓冲。渲染(g);
}
}                
缓冲。渲染(g);
}

请注意,上面的代码或多或少是伪代码。我希望使用BufferedGraphics对象,闪烁将消失。事实上,它没有。起初,我认为paint方法需要很长的时间,但它可能没有(我测量了每个调用4-7毫秒)。如果我将
cond
设置为true,它仍然会闪烁,尽管绘制方法几乎不需要时间。绘制方法将在面板上绘制,并且我大约每50毫秒使用一个计时器使面板无效,这可能很重要。如何最终消除闪烁?

只需尝试在构造函数中设置属性:

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);
    }                                          
  }
}
public void paint(对象发送器,PaintEventArgs e)
{
基础漆(e);
图形g=e.图形;
g、 清晰(颜色为淡紫色);
//如果条件为真(条件不相关),则跳过绘图
如果(!cond)
{
//l是一些列表
foreach(l中的p点)
{ 
//…计算X和Y…(不相关)
g、 FillEllipse(新的SolidBrush(颜色为蓝色)、p.X、p.Y、点大小、点大小);
}                                          
}
}

最终需要这样做吗?不管怎样,你都在渲染。谢谢,这真的不需要。但是,问题仍然存在。您的代码没有消除闪烁的主要原因,即OnPaintBackground()完成的绘图。一定要支持Winforms中内置的双缓冲。检查是否有双缓冲面板。如果不需要滚动支持,也可以使用PictureBox,这是默认情况下启用双缓冲的最基本控件。感谢PictureBox上的提示!谢谢你的回答。不幸的是,小组没有这样的财产。我担心会有一些误解:
paint
是onPaint的事件侦听器,我不是从面板派生的。@MaxBeikirch尝试从面板派生。或者您可以使用一些反射:从唯一解决方案中的面板派生。我希望我能避免这种情况,但遗憾的是,这种做法行不通。谢谢你的回答!
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);
    }                                          
  }
}