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

3
我有一个简单的面板,用作绘图表面。目标是在特定情况下,在子ListView周围绘制4像素宽的轮廓。当可以将某些东西拖入其中时,我想让轮廓闪烁起来。
我只是在ListView周围画一个简单的矩形,并在计时器滴答事件中更新矩形的不透明度。当不透明度改变时,边框会重新绘制。此时我正在进行双缓冲绘制。我还只允许每15个滴答或更多次重绘(计时器间隔为20毫秒)。即使经过所有这些操作,绘图过程仍然会有点闪烁。这是不可接受的,所以我需要一些指导,了解如何避免这种情况。
我看不到避免经常绘制控件的方法。需要从不透明到实体之间的平稳过渡。当我将滴答间隔降低到足够低(约为300-500毫秒)时,闪烁就停止了,但刷新率太慢。
我对任何想法都持开放态度。也许我处理这个问题的方式完全错误,或者你们中的某个人已经创建了发光效果并知道该怎么做。提前感谢任何帮助。
6个回答

4

如果有人感兴趣,我找到了一个解决方法。原来闪烁是由于背景绘制引起的。我使用SetStyle告诉控件我将处理所有的绘制。

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

我会先在区域上涂上透明颜色,然后再画边框。虽然有点取巧,但效果非常好。编辑:还要记得双缓冲图像。

3
在表单上设置DoubleBuffered = true。

1

我没有一个很强的答案,但既然你没有,我还是会发帖:

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

其次,如果那个方法失败了,你尝试过不使用双缓冲吗?虽然可能性不大,但也许你的双缓冲代码实际上使情况变得更糟。


+1 因为你提醒了我 ImageAnimator 类,这对我的另一个项目很有用。 - Ed S.

1

很抱歉这可能不会有太大帮助:WPF具有动画功能,理论上至少可以平滑地完成此操作。


0
你可能也想考虑在位图上进行绘制,然后只显示位图(如果它已更改)。这只是我的个人意见。

这是我一直在使用的双缓冲方法。 - Ed S.

0

可能有点冒险,但你试过了吗?

SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

在控制面板上吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接