2008-10-08 349 views
3

我有一个用作绘图表面的简单面板。这里的目标是在某些情况下围绕子ListView绘制一个4像素宽的轮廓。我想在可以拖入某些内容时使轮廓起伏不定。如何在C#中不断重新绘制控件时避免屏幕闪烁?

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

我没有看到周围的绘画控制经常。需要从不透明到坚实再平稳过渡。当我将刻度间隔降低到足够低时(降至约300-500毫秒),闪烁停止,但刷新率太慢。

我愿意接受任何想法。也许我接近这一点的方式显然是错误的,或者你们中的一个已经创造了一种发光效果并且知道该做什么。感谢您提前提供任何帮助。

回答

4

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

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

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

编辑:并记住双缓冲图像以及。

1

我没有一个强大的答案,但因为你没有,无论如何,我会发布:

首先,我从来没有使用过的System.Drawing.ImageAnimator类,但会是一个更好的办法为你?

二,如果失败了,你试过不是使用双缓冲?这是一个漫长的过程,但是也许你的双缓冲代码实际上让它变得更糟。

+0

+1因为您提醒我ImageAnimator类对我的另一个项目很有用。 – 2008-10-09 00:25:45

0

远投,但你有没有试过

SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 

面板上的控制?

3

在窗体上设置DoubleBuffered = true。

0

您也可能想要查看位图上的图形,然后只显示位图,如果它已更改。只是我的2c。

+0

这是我一直在使用的双缓冲方法。 – 2008-10-08 23:14:26

1

事先对不起,这可能不会帮助,但:WPF有动画,至少在理论上可以做到这一点顺利。