进行无闪烁动画C#自定义控件的最佳方法是什么?

时间:2008-10-08 12:01:40

标签: c# animation controls doublebuffered

我目前正在创建一个需要在C#项目中处理动画的自定义控件。它基本上是一个列表框,其中包含可移动的固定数量的元素。元素(具有背景图像的另一个用户控件和一些生成的标签)可以向上,向下移动或从列表中取出。

我想创建动画移动,因为元素在容器自定义控件中移动,但在我看来,使用诸如

之类的行移动控件
myCustomControl.left -= m_iSpeed;
在定时器事件中触发的

是flickery并且具有可怕的渲染,即使打开了双缓冲也是如此。

所以这里有一个问题:实现无闪烁动画C#控件的最佳方法是什么?我应该不创建自定义控件并处理面板背景图像中的所有绘图生成?有没有我没有发现的超级动画方法? :)

谢谢!

4 个答案:

答案 0 :(得分:3)

无闪烁动画的最佳选择是自己绘画(使用Paint事件处理程序中的Graphics对象)并使用双缓冲。在自定义控件中,您将需要在构造函数中使用以下代码:

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

答案 1 :(得分:1)

今天上午就这个问题进行了类似的讨论。 visual c# form update results in flickering.所以我会懒惰并给出我在那里给出的答案:

您可以尝试在开始移动之前调用 this.SuspendLayout(); ,并在完成所有控件的移动后尝试 this.ResumeLayout(false); 。通过这种方式,所有控件都应该立即绘制,并且您应该减少闪烁。

在旁注中,我试图在工作中重现这一点,但似乎失败了。你能提供一些我可以修复的示例代码吗?

答案 2 :(得分:1)

答案 3 :(得分:0)

获得无闪烁动画的正常方法是实现双缓冲。看看这个Code Project文章

http://www.codeproject.com/KB/GDI-plus/flickerFreeDrawing.aspx

在你准备好之前尽量减少画画的召唤也是一个好主意。

相关问题