【问题标题】:How to stop the flickering of Panels containing multiple controls如何停止包含多个控件的面​​板闪烁
【发布时间】:2013-05-23 06:01:19
【问题描述】:

我对闪烁和 UI 更新的一般流程有一些疑问 当涉及多个对象时。

背景: 我们在 Progress ABL 应用程序中使用 C# 程序集来驱动 UI。 此外,我们使用 Infragistics 控件,因为它们可以轻松设置样式。 我们有一种自制的 MDI。 (选项卡)面板包含多个用户控件,其中 用作“表格”。 (注意:不能使用真实的表单,因为非顶级表单在正确处理鼠标点击时有问题) 这些选项卡由 Infragistics UltraDockManager 实现。

在这样的用户控件“表单”上放置了一个进度 .Net 控件,该控件嵌入了真实的进度框架。 所以我们可以重复使用现有的进度表,而不是在 .NET 中从头开始重建它们。 更糟糕的是,我们在(选项卡)面板上使用平铺背景图像。

现在我们有问题是面板的内容(源自 Infragistics.Win.Misc.UltraPanel) 严重闪烁。 (特别是在调整主应用程序大小时) 一些控件(尤其是 Progress 控件)被删除并重新绘制。

我可以通过使用 WS_CLIPCHILDREN 和 WS_EX_COMPOSITED 来消除闪烁 (正如 Hans Passant 在How to fix the flickering in User controls 中提到的)在面板和用户控件中。 但是应用程序明显比以前慢了,所以我不得不再次删除代码。

我尝试设置面板和用户控件的样式,完全没有效果。

this.SetStyle(ControlStyles.AllPaintingInWmPaint |
              ControlStyles.UserPaint |
              ControlStyles.OptimizedDoubleBuffer |
              ControlStyles.ResizeRedraw, true);

试图忽略面板中的 WM_ERASEBKGND 并且 UserControl 似乎也没有效果。

protected override void WndProc(ref Message m)
{
    if (m.Msg != WM_ERASEBKGND)
    {
        base.WndProc(ref m);
    }
}

处理所有这些对象的重绘以减少闪烁的正确方法是什么?

我考虑过使用 SendMessage 和 WM_SETREDRAW。但我不知道把它放在哪里 在这种情况下,它是否真的有帮助。

当应用程序调整大小时,每个 UserControl 似乎都被重新绘制,无论其可见性如何。 (可以滚动到视线之外) 为什么不进行某种剪辑?面板应该知道有些区域不需要刷新还是我弄错了?

如果有任何建议,我将不胜感激。

【问题讨论】:

    标签: c# .net user-controls panel flicker


    【解决方案1】:

    我们终于设法摆脱了闪烁。 有两个因素导致了这个问题:

    1. 使用颜色:透明
    2. 使用面板的自动滚动功能

    我们在调整大小时移除了透明颜色并禁用了 AutoScroll。

    【讨论】:

      【解决方案2】:

      看看thisthis

      他们是关于在调整大小时调用 SuspendLayout

      【讨论】:

      • 嗯,我在面板的 OnPaint 方法中尝试了 Suspend 和 ResumeLayout。没有喜悦。那是正确的地方吗?
      • 如果它不起作用,可能不会......我很抱歉:( ...我正在关注这个,如果你找到一个可行的解决方案,请发布
      【解决方案3】:

      尝试在程序中使用它

      它可能不会给出重绘事件之间的速度

      但它肯定会看起来很优雅,因为在所有绘画完成后会发生重绘活动

      你只需要将它添加到你的主窗体中。

      protected override System.Windows.Forms.CreateParams CreateParams
              {
                  get
                  {
                      System.Windows.Forms.CreateParams cp = base.CreateParams;
                      cp.ExStyle |= 0x02000000;
                      return cp;
                  }
              } 
      

      【讨论】:

      • 您好,感谢您的提示,但这是 WS_EX_COMPOSITED。我已经试过了。 (见上面的帖子)它可以工作,但之后应用程序非常慢,所以我再次删除了代码。我希望可能有另一种方式。其他论坛的帖子也指出使用 WS_EX_COMPOSITED 时可能会出现图形故障。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 2011-12-24
      • 1970-01-01
      • 2018-12-23
      • 1970-01-01
      • 2017-09-08
      相关资源
      最近更新 更多