3

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

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

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

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

我可以通过在面板和 UserControl 中使用 WS_CLIPCHILDREN 和 WS_EX_COMPOSITED(如 Hans Passant 在如何修复用户控件中的闪烁中提到的)来消除闪烁。但是应用程序明显比以前慢,所以我不得不再次删除代码。

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

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 似乎都被重新绘制,无论其可见性如何。(可以滚动到视线之外)为什么没有发生某种剪裁?面板应该知道有些区域不需要刷新还是我弄错了?

我会很感激任何建议。

4

3 回答 3

3

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

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

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

于 2013-10-14T12:14:41.200 回答
2

尝试在程序中使用它

它可能无法提供重绘事件之间的速度

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

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

protected override System.Windows.Forms.CreateParams CreateParams
        {
            get
            {
                System.Windows.Forms.CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x02000000;
                return cp;
            }
        } 
于 2013-05-28T10:03:56.427 回答
0

看看这个这个

他们是关于在 Resize 上调用 SuspendLayout

于 2013-05-28T10:08:35.707 回答