如何停止包含多个控件的面板的闪烁
本文关键字:闪烁 控件 何停止 包含多 | 更新日期: 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似乎都被重新绘制,不管它的可见性如何。(可以滚动到视线的一半)为什么没有进行剪辑呢?面板应该知道有些区域不需要刷新,还是我弄错了?
我们最终设法摆脱了闪烁。有两个因素导致了这个问题:
- 使用颜色:透明
- 使用面板的自动滚动功能
我们删除了透明颜色,并在调整大小时禁用了自动滚动
尝试在程序中使用
可能没有给出重绘事件之间的速度
但它肯定会看起来很优雅,因为重新绘制的活动将在所有绘制完成后进行
你只需要把它添加到你的主表单。
protected override System.Windows.Forms.CreateParams CreateParams
{
get
{
System.Windows.Forms.CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000;
return cp;
}
}
看看这个和这个
他们是关于调用SuspendLayout在调整大小