3

我有一个简单的面板,用作绘图表面。这里的目标是在某些情况下围绕子 ListView 绘制一个 4 像素宽的轮廓。当可以将某些东西拖入其中时,我想让轮廓跳动。

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

我看不到经常绘制控件的方法。需要有一个从不透明到实体的平滑过渡,然后再返回。当我足够降低滴答间隔(降低到大约 300 -500 毫秒)时,闪烁停止,但刷新率太慢。

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

4

6 回答 6

4

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

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

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

编辑:记住还要对图像进行双重缓冲。

于 2008-10-09T00:24:58.523 回答
3

在表单上设置 DoubleBuffered = true。

于 2008-10-08T22:31:39.860 回答
1

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

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

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

于 2008-10-08T22:27:38.323 回答
1

我很抱歉这可能无济于事:WPF 有动画并且至少在理论上可以顺利地做到这一点。

于 2008-10-08T23:11:49.983 回答
0

远射,但你试过吗

SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

在面板控制上?

于 2008-10-08T22:31:25.163 回答
0

您可能还想查看在位图上进行绘图,然后仅显示位图(如果它已更改)。只是我的2c。

于 2008-10-08T23:10:22.107 回答