如何停止包含多个控件的面板的闪烁

本文关键字:闪烁 控件 何停止 包含多 | 更新日期: 2023-09-27 18:15:53

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

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

在这样的UserControl"表单"上放置了一个Progress . net控件,它嵌入了真正的进度框架。所以我们可以重用现有的进度表单,而不是在。net中从头开始重新构建它们。更糟糕的是,我们在(选项卡)面板上使用平铺背景图。

现在我们有一个问题,面板的内容(来自Infragistics.Win.Misc.UltraPanel)闪烁着沉重的光芒。(特别是当主应用程序被调整大小时)一些控件(特别是进度控件)被删除并重新绘制。

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

我试着设置面板和UserControl的样式,完全没有效果。

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似乎都被重新绘制,不管它的可见性如何。(可以滚动到视线的一半)为什么没有进行剪辑呢?面板应该知道有些区域不需要刷新,还是我弄错了?

如何停止包含多个控件的面板的闪烁

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

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

我们删除了透明颜色,并在调整大小时禁用了自动滚动

尝试在程序中使用

可能没有给出重绘事件之间的速度

但它肯定会看起来很优雅,因为重新绘制的活动将在所有绘制完成后进行

你只需要把它添加到你的主表单。

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

看看这个和这个

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