BufferedGraphics闪烁

时间:2013-01-27 17:34:31

标签: c# winforms double-buffering

我试图实现自定义双缓冲,但它会导致闪烁。

这是控件中的代码(从Control继承的自定义控件)构造函数:

bufferContext = new BufferedGraphicsContext();
SetStyle(ControlStyles.OptimizedDoubleBuffer, false);
SetStyle(ControlStyles.DoubleBuffer, false);
SetStyle(ControlStyles.ResizeRedraw, false);
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
SetStyle(ControlStyles.Opaque, true);

OnPaint事件:

protected override void OnPaint(PaintEventArgs e)
{
    if (buffer == null)
    {
        Draw(e);
        return;
    }

    if (Repaint)
    {
        Repaint = false;
        PaintEventArgs pe = new PaintEventArgs(buffer.Graphics, e.ClipRectangle);
        Draw(pe);
    }

    buffer.Render(e.Graphics);
}

此外,此代码在与缓冲相关的调整大小时激活:

Graphics g = this.CreateGraphics();

if (buffer != null)
{
    buffer.Dispose();
    buffer = null;
}

if (!(bufferContext == null || DisplayRectangle.Width <= 0 || DisplayRectangle.Height <= 0))
{
    buffer = bufferContext.Allocate(g, DisplayRectangle);
    Repaint = true;
}

绘制方法很复杂,但它首先使用BackColor填充控件,其他则无关紧要。

我可以用眼睛发现有时闪烁,主要是在调整窗口大小时。正如我所知,黑色首先在控件上绘制,然后是缓冲区中的图形,它会导致闪烁。但是,BackColor永远不会是黑色。

如何阻止这种情况?

1 个答案:

答案 0 :(得分:-1)

此示例显示如何正确使用缓冲图形:

<button class="btn btn-link" type="button" data-toggle="collapse"     data-target="#collapseExample" aria-expanded="false"     aria-controls="collapseExample">
  Button with data-target
</button>
 <div class="collapse" id="collapseExample">
   <div class="well">
     ...
   </div>
 </div>