【问题标题】:WinForms flickers when loading on Windows 8.1在 Windows 8.1 上加载时 WinForms 闪烁
【发布时间】:2015-05-23 08:34:15
【问题描述】:

当我的 Windows 窗体最初加载到 Windows 8.1 上时,我遇到了一些闪烁效果。

起初我尝试了一些涉及启用 DoubleBuffered 的解决方案,但这似乎并没有解决问题。后来我遇到了下面的解决方案,很多人说解决了他们所有的问题。但是,当我在我的 Windows 8.1 计算机上尝试修复时,它现在闪烁着一个黑框。

为了进一步研究这一点,我尝试了下面 MSDN 链接中的示例代码。但是,当表单加载时,这也会显示一个黑框。我尝试在“高级系统设置”->“高级”->“性能设置”->“视觉效果”中弄乱 Windows 8.1 视觉设置,以查看 Aero 或类似的透明度功能是否对此有任何影响,但我仍然得到一个闪烁的黑匣子。

此“修复”的各个线程中的所有 cmets 似乎都不是最近的。我想知道这个“修复”是否应该适用于 Windows 8/8.1,如果还有什么我可以尝试让表单及其控件同时出现而没有任何闪烁。

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

https://social.msdn.microsoft.com/Forums/windows/en-US/aaed00ce-4bc9-424e-8c05-c30213171c2c/flickerfree-painting?forum=winforms

How to fix the flickering in User controls

【问题讨论】:

  • 表单加载时你在做什么?一些代码应该不错
  • msdn 帖子中的示例代码可以复制问题(我认为它会创建一堆按钮)。基本上,每当表单中有很多控件时,它们都会导致表单在加载时闪烁,我的代码没有 msdn 代码那么激烈,因为我的表单控件较少,但同样的问题发生在我身上。我认为 msdn 帖子可能已经解决了旧操作系统的问题,但我没有看到有人在 Windows 8/8.1 上测试它
  • 我的表单控制较少 - 意思是多少?创建在哪里?在设计师的this.ResumeLayout(false); this.PerformLayout();之前还是之后?
  • 只有 4 或 5 个控件,但表单有一些具有主题选项的 3rd 方控件,这些选项可以调整表单及其控件的背景颜色,这可能会使它有点沉重。我在运行时应用了不同的主题选项,因此当表单从灰色变为深灰色背景时,我看到闪烁,或者如果我将代码放在上面,我的表单最初显示为黑框。如果我可以让 msdn 链接中的示例代码在 win8.1 上运行而不会闪烁或出现黑框,那么我确信相同的修复程序将适用于我的代码。

标签: c# winforms flicker doublebuffered


【解决方案1】:

我能够使用以下代码一次显示我的表单及其所有控件:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.Shown += Form1_Shown;
        this.Opacity = 0;
        SampleExpensiveCreateControlOperation();
    }

    private void SampleExpensiveCreateControlOperation()
    {
        for (int ix = 0; ix < 30; ++ix)
        {
            for (int iy = 0; iy < 30; ++iy)
            {
                Button btn = new Button();
                btn.Location = new Point(ix * 10, iy * 10);
                btn.BackColor = Color.Red;
                this.Controls.Add(btn);
            }
        }
    }

    private void Form1_Shown(object sender, EventArgs e)
    {
        this.Refresh();
        this.Opacity = 1;
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多