【问题标题】:What is the best way to do a flicker-free animated C# custom control?进行无闪烁动画 C# 自定义控件的最佳方法是什么?
【发布时间】:2010-09-15 23:48:30
【问题描述】:

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

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

myCustomControl.left -= m_iSpeed;

在计时器事件中触发会闪烁并且呈现很糟糕,即使打开了双缓冲也是如此。

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

谢谢!

【问题讨论】:

  • 您使用的是什么 GUI 工具包?
  • 他提到了 C#,所以我认为我们很可能在谈论 .Net Windows Forms。我认为 DoubleBuffering 是答案,但我现在不记得具体细节。
  • 对,我正在使用regulat .net windows forms。

标签: c# animation controls doublebuffered


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    您可以尝试在开始移动之前调用 this.SuspendLayout(); 并在移动完所有控件后尝试调用 this.ResumeLayout(false); .这样一来,所有控件都应该立即绘制,并且闪烁应该更少。

    顺便说一句,我曾尝试在工作中重现此内容,但似乎失败了。您能否提供一些我可以修复的示例代码?

    【讨论】:

      【解决方案3】:
      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2021-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-08
        • 2012-03-11
        • 2015-12-11
        • 1970-01-01
        • 2020-09-19
        相关资源
        最近更新 更多