透明面板闪烁

时间:2014-12-01 20:42:06

标签: c# .net winforms panel

我创建了一个简单的程序,现在我正处于设计阶段。我有一个多个面板,我可以看到/不可见,以切换"标签" (EG.1面板用于登录屏幕,1面板用于创建帐户屏幕)。现在我已经让这些面板变得不可见,因为我希望它们只是作为容器能够快速移动控件并创建按钮。

我的问题是我已经将我的表格背景图像设置为我在photoshop中制作的图像,每当我在面板之间切换时,它就会闪烁,每当我使用系统颜色(白色,黑色)时,我都不会这样做。发生了。 我有什么方法可以消除闪烁吗?

我试过了:

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

我的代码非常基础:

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

3 个答案:

答案 0 :(得分:0)

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

form.DoubleBuffered = true;

答案 1 :(得分:0)

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

答案 2 :(得分:0)

#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。 在您的程序中添加上述代码片段,并在您的应用程序的构造函数中添加以下行:

SetDoubleBuffered(YourPanelName);
相关问题