最大化后WinForms闪烁-双缓冲

时间:2019-01-18 16:55:37

标签: c# winforms double-buffering

我有一个“主”表单,左侧带有导航按钮,右侧是一个面板,用作子表单的持有人。很简单,但是下面的代码。

public void showForm(Form form)
{
    // Disposed Prior Form & Load New
    form.Dock = DockStyle.Fill;
    form.TopLevel = false;
    pnlMain.Controls.Clear();
    pnlMain.Controls.Add(form);
    form.Show();
}

我遇到的主要问题是,一切正常,在从一个表单到另一个表单的导航时,使用下面的代码几乎不会出现闪烁,但是一旦我最大化了“主”表单(反过来会放大“儿童”表单)...即使我取消最大化并返回到原始大小,当我导航到新表单时,它也会开始像疯了似的闪烁。好像最大化它之后,它完全忽略了用于解决闪烁问题的代码。我还应该提到,“子窗体”具有它自己的窗体绘制事件,这就是为什么我准备好这些东西来减少闪烁的原因,通常在最大化之前这不是问题。

public void drawBackgroundChild(PaintEventArgs e, Form form)
{
   // prevents error on resize
   if (form.ClientRectangle.Width == 0 || form.ClientRectangle.Height == 0)
       return;

   using (LinearGradientBrush brush = new LinearGradientBrush(form.ClientRectangle,
                                                                     UserSettings.secondaryColor1,
                                                                      UserSettings.secondaryColor2,
                                                                      90F))
            {
                e.Graphics.FillRectangle(brush, form.ClientRectangle);
            }
}



protected override CreateParams CreateParams
{
    get
    {
        var cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;    // Turn on WS_EX_COMPOSITED
        return cp;
    }
}

我已经多次在“主”和“子”表单上尝试了上面的代码以及下面的代码。以多种方式对其进行了测试,但是没有运气。有人知道Windows窗体的大小是否禁用了Double Buffering或某种程度的功能?

 DoubleBuffered = true;
 this.SetStyle(ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.SupportsTransparentBackColor, true);

1 个答案:

答案 0 :(得分:0)

必须从主表单中删除任何形式的双缓冲/ createparams等,并将其专门放入子表单中。...

protected override CreateParams CreateParams
{
    get
       {
         var cp = base.CreateParams;
         cp.ExStyle |= 0x02000000;    // Turn on WS_EX_COMPOSITED
         return cp;
       }
}


frmChild()
{
    ResizeRedraw = true;
    this.SetStyle(ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer |
                  ControlStyles.AllPaintingInWmPaint | ControlStyles.SupportsTransparentBackColor, true);
}