4

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

我想创建动画运动,因为元素在容器自定义控件中四处移动,但在我看来,使用线条移动控件,例如

myCustomControl.left -= m_iSpeed;

在计时器事件中触发是闪烁的并且具有糟糕的渲染,即使打开了双缓冲也是如此。

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

谢谢!

4

4 回答 4

3

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

this.SetStyle(ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | 
    ControlStyles.AllPaintingInWmPaint | ControlStyles.SupportsTransparentBackColor,
    true);
于 2008-10-08T12:25:30.427 回答
1

今天上午就这个问题进行了类似的讨论。visual c# 表单更新导致闪烁。所以我会很懒惰并给出我在那里给出的相同答案:

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

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

于 2008-10-08T12:23:14.177 回答
1

请参阅如何在表单上加倍缓冲 .NET 控件。

于 2009-06-02T15:16:45.540 回答
0

获得无闪烁动画的正常方法是实现双缓冲。看看这篇代码项目文章

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

在你准备好之前尽量减少对绘画的调用也是一个好主意。

于 2008-10-08T12:25:29.130 回答