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

时间:2008-10-08 22:19:29

标签: c# .net onpaint

我有一个简单的面板用作绘图表面。这里的目标是在某些情况下在子ListView周围绘制一个4像素宽的轮廓。当一些东西被拖进去时,我想让轮廓脉动。

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

我没有看到经常涂抹控件的方法。需要从不透明到固体再平滑过渡。当我将刻度间隔降低到足够低(大约300到500毫秒)时,闪烁停止,但刷新率太慢。

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

6 个答案:

答案 0 :(得分:4)

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

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

然后我首先在区域上绘制一个透明的颜色,然后我画边框。我有点像黑客,但它就像一个魅力。

编辑:还记得双重缓冲图像。

答案 1 :(得分:3)

在表单上设置DoubleBuffered = true。

答案 2 :(得分:1)

我没有强烈的答案,但由于你没有答案,我还是会发帖:

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

其次,如果失败了,你是否尝试使用双缓冲而不是?这是一个很长的镜头,但也许你的双缓冲代码实际上使它变得更糟。

答案 3 :(得分:1)

我很抱歉,这可能无济于事:WPF有动画,至少在理论上可以顺利完成。

答案 4 :(得分:0)

远射,但你试过吗

SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

在Panel Control上?

答案 5 :(得分:0)

您还可能希望查看位图上的绘图,然后只显示位图(如果已更改)。只是我的2c。