WinForms中的简单动画

时间:2020-03-05 18:39:41  来源:igfitidea点击:

假设我们要为WinForm上的某些对象设置动画。我们设置了一个计时器来更新状态或者模型,并覆盖窗体的绘制事件。但是从那里开始,为动画连续重新绘制窗体的最佳方法是什么?

  • 完成绘制后,使表单失效吗?
  • 设置第二个计时器并定期使表格无效?
  • 也许这件事有一个共同的模式?
  • 是否有任何有用的.NET类可以?

每次需要执行此操作时,我都会发现具有新缺点的新方法。 SO社区有哪些经验和建议?

解决方案

回答

我们正在执行的操作是我在WinForms(具有不断重绘的计时器)中使用过的唯一解决方案。我们可以使用多种技术使用户的使用体验更加流畅(例如双缓冲)。

我们可能想尝试一下WPF。有内置的功能可以在WPF中制作动画,它们比基于计时器的解决方案更流畅(并且需要更少的代码,并且我们不需要同步)。

请注意,对于该解决方案,我们无需在整个应用程序中使用WPF;可以将此功能打包到WPF控件中,然后将该控件嵌入WinForms应用程序(或者非托管应用程序)中:

http://www.codeproject.com/KB/WPF/WPF_UserControls.aspx

回答

在某些情况下,不使用paint事件进行绘制,而是从控件/窗体获取Graphics对象并在其上进行绘制,这样会更快,更方便。这可能会给不透明度/反锯齿/文本等带来一些麻烦,但在不必重新绘制整个shabang方面值得考虑。类似于以下内容:

private void AnimationTimer_Tick(object sender, EventArgs args)
{
    // First paint background, like Clear(Control.Background), or by
    // painting an image you have previously buffered that was the background.
    animationControl.CreateGraphics().DrawImage(0, 0, animationImages[animationTick++])); 
}

我本人在某些控件中使用了此控件,并在感兴趣的对象移动或者需要删除时使用缓冲图像"清除"背景。

回答

我创建了一个库可能对此有所帮助。它称为过渡,可以在以下位置找到:http://code.google.com/p/dot-net-transitions/

它使用在后台线程上运行的计时器为对象设置动画。该库是开源的,因此,如果对我们有用,则可以查看代码以查看其作用。