2008-08-14 78 views
19

想象一下,您想要为WinForm上的某个对象设置动画。您设置一个计时器来更新状态或模型,并覆盖窗体的绘画事件。但是从那里开始,不断重新绘制动画形式的最佳方法是什么?WinForms中的简单动画

  • 只要您完成绘图,就使表单无效?
  • 设置第二个计时器并使表单在规定的时间间隔失效?
  • 也许这件事有一个共同的模式?
  • 有没有什么有用的.NET类可以帮忙?

每当我需要这样做时,我发现一个新的方法有一个新的缺点。 SO社区的经验和建议是什么?

回答

9

在某些情况下,它的速度更快,更便捷地不画使用绘画事件,但从控件/窗体获取Graphics对象并绘制“on”。这可能会带来一些不透明/消除锯齿/文字等问题,但在不必重新绘制整个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++])); 
} 

我在一些控件使用这个自己,并缓冲图像“清”着,当关注移动对象或需要删除的背景。

+0

使用BufferedGraphics类更好吗? – 2013-01-19 00:46:03

+0

我敢打赌,这是!从来没有使用它。 – Peteter 2013-01-20 17:21:23

3

你在做什么是我在WinForms中使用的唯一解决方案(一个具有不断重绘的定时器)。有许多技术可以用来使用户的体验更平滑(如双缓冲)。

您可能想尝试一下WPF。在WPF中有用于做动画的内置工具,它们比基于定时器的解决方案更平滑(并且需要更少的代码和不同步)。

请注意,您不需要在整个应用程序中为该解决方案使用WPF;有可能收拾这个功能集成到一个WPF控件并嵌入在WinForms应用程序的控制(或者非托管的应用程序,对于这个问题):

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

44

我创建了一个库,可能有助于此。它被称为转换,可以在这里找到:http://code.google.com/p/dot-net-transitions/

它使用运行在后台线程上的定时器来为对象设置动画。这个库是开源的,所以如果它对你有任何用处,你可以看看代码,看看它在做什么。