【问题标题】:Flickering with transparent panel用透明面板闪烁
【发布时间】:2014-12-01 20:42:06
【问题描述】:

我创建了一个简单的程序,现在我正处于设计阶段。我有多个面板,我可以在“选项卡”之间切换可见/不可见(例如,1 个用于登录屏幕的面板和 1 个用于创建帐户屏幕的面板)。现在我让这些面板不可见,因为我希望它们就像容器一样能够快速移动控件并在其中创建按钮。

我的问题是我已将表单背景图像设置为我在 Photoshop 中制作的图像,并且每当我在面板之间切换时它会闪烁,每当我只使用系统颜色(白色、黑色)时,这种情况都不会发生。 有什么办法可以消除闪烁吗?

我试过了:

  • 将双缓冲设置为 true
  • 受保护的覆盖 OnPaint、CreateBackground 和 Createparam

我的代码非常基础:

private void btnNewAcc_Click(object sender, EventArgs e)
    {
        PanelNewAccount.Visible = true;
        PanelLogin.Visible = false;
    }

【问题讨论】:

  • 没有看到你的代码,我只能建议尝试双缓冲面板子类

标签: c# .net winforms panel


【解决方案1】:

尝试将表单属性 DoubleBuffered 设置为 true,在 winforms 中通常会发生闪烁,因为 GDI+ 会多次尝试绘制控件,所以在这种情况下 DoubleBuffering 你的图形应该会有所帮助

form.DoubleBuffered = true;

【讨论】:

  • 是的,抱歉,我只是在编辑我的帖子,我已经尝试过了,但恐怕没有任何效果
  • @BornToGrill 你试过使用 TabControl 吗?我在测试应用程序中使用了相同的方法,它没有闪烁
  • 我不知道如何将其用作替代品,我没有真正使用过 TabControls 但我找不到如何使其透明,我也不确定它是否允许我可以像我需要的那样动态添加按钮
  • @BornToGrill 您只需要使用 TabPage 动态添加按钮,但我不知道如何使其透明,但您可以设置其背景图像而不是表单
  • 双缓冲对我不起作用。但是,最初将表单不透明度设置为 0,然后在大约 100 毫秒后使用计时器将其设置回 1 对我有用
【解决方案2】:

感谢 Patrick,我解决了我的问题, 而不是使用面板,我使用的是 TabControl,并且我为每个选项卡分配了相同的背景。 就像添加动态按钮一样容易。 与面板功能相同,但没有闪烁。

【讨论】:

    【解决方案3】:
    #region .. Double Buffered function ..
           public static void SetDoubleBuffered(System.Windows.Forms.Control c)
            {
                if (System.Windows.Forms.SystemInformation.TerminalServerSession)
                    return;
                System.Reflection.PropertyInfo aProp = typeof(System.Windows.Forms.Control).GetProperty("DoubleBuffered", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
                aProp.SetValue(c, true, null);
            }
    
           #endregion
    
    
    #region .. code for Flucuring ..
    
           protected override CreateParams CreateParams
            {
                get
                {
                    CreateParams cp = base.CreateParams;
                    cp.ExStyle |= 0x02000000;
                    return cp;
                }
            }
    
            #endregion
    

    即使我迟到了,但如果其他人也遇到同样的问题,那么即使我不知道它是如何工作的,这段代码也为我修复了闪烁。 我找到了here。 在您的程序中添加上面的代码 sn-p 并在您的应用程序的构造器中添加以下行:

    SetDoubleBuffered(YourPanelName);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-29
      • 2010-12-30
      • 2017-09-08
      • 2012-12-26
      • 2018-08-25
      • 2023-03-28
      • 1970-01-01
      • 2015-06-27
      相关资源
      最近更新 更多