当控件必须在C#中不断重新绘制时,如何避免屏幕闪烁

本文关键字:绘制 闪烁 屏幕 何避免 新绘制 控件 | 更新日期: 2023-09-27 17:47:49

我有一个简单的面板,用作绘图表面。这里的目标是在特定情况下围绕子ListView绘制一个4像素宽的轮廓。当有东西可以拖进去的时候,我想让轮廓跳动起来。

我只是在ListView周围绘制一个简单的矩形,并更新计时器刻度事件内部矩形的不透明度。更改不透明度后,将重新绘制边界。在这一点上,我正在加倍缓冲这幅画。我也只允许每15次左右重新绘制一次(计时器间隔为20毫秒)。在所有这些之后,绘制过程仍然有点闪烁。这是不可接受的,所以我需要一些关于如何避免这种情况的指导。

我看不出有什么办法可以经常画控件。需要有一个从不透明到固体再到固体的平滑过渡。当我将刻度间隔降低到足够低(降低到大约300-500毫秒)时,闪烁会停止,但刷新率太慢。

我对任何想法都持开放态度。也许我处理这件事的方式完全错误,或者你们中的一个人已经创造了一种发光效果,知道该怎么办。谢谢你提前提供的帮助。

当控件必须在C#中不断重新绘制时,如何避免屏幕闪烁

如果有人感兴趣的话,我偶然发现了一个解决方案。事实证明,闪光是由背景的绘画引起的。我用SetStyle告诉控件我将处理所有的绘画。

SetStyle(ControlStyles.SupportsTransparentBackColor |
         ControlStyles.Opaque |
         ControlStyles.UserPaint |
         ControlStyles.AllPaintingInWmPaint, true);

然后我先在这个区域上画一个透明的颜色,然后画我的边界。我有点黑,但它很有魅力。

编辑:记住要加倍缓冲图像。

在表单上设置DoubleBuffered=true。

我没有一个强有力的答案,但既然你没有,我无论如何都会发布:

首先,我从未使用过System.Drawing.ImageAnimator类,但这对您来说是更好的方法吗?

第二,如果失败,您是否尝试过使用双缓冲的而不是?这是一个很长的机会,但也许你的双缓冲代码实际上让情况变得更糟。

我很抱歉,这可能不会有帮助,但:WPF有动画,至少在理论上可以顺利完成。

长镜头,但你尝试过吗

SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

在面板控制上?

您可能还想在位图上绘制,然后在位图发生更改时只显示位图。只是我的2c。