【问题标题】:WinForms Flickering after Maximizing - Double Buffering最大化后WinForms闪烁 - 双缓冲
【发布时间】:2019-06-12 23:26:38
【问题描述】:

我有一个“主”表单,左侧带有导航按钮,右侧有一个面板,我将其用作子表单的支架。这很简单,但代码如下。

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 窗体的大小是否会在这种程度上禁用双缓冲?

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

【问题讨论】:

  • a) 什么闪烁?表格还是面板? b) 尝试使用this 代码打开数据库! c) 不,调整大小肯定不会打开或关闭 db。
  • @TaW 面板内的“Child”表单开始闪烁...我忘了说面板内的这个表单也有Paint Event,我会更新帖子。跨度>
  • @TaW DoubleBuffered 已为所有正在使用的表单启用,并且在调整大小之前不会成为问题。我唯一能想到的是“子”表单的面板支架没有专门为该控件启用双缓冲,并且以某种方式调整大小会影响它,但 idk

标签: c# winforms double-buffering


【解决方案1】:

必须从主窗体中删除任何类型的双缓冲/创建参数等,并将其专门放入子窗体中......

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);
}

【讨论】:

    猜你喜欢
    • 2016-04-04
    • 2015-05-01
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 2013-01-12
    相关资源
    最近更新 更多