【问题标题】:Animated gif on button stops after moving (redrawing) the form移动(重绘)表单后按钮上的动画 gif 停止
【发布时间】:2010-10-24 11:26:48
【问题描述】:

我在按钮上放置了一个动画 gif。它的动画效果很好(大多数时候:P),但是当窗口被重绘(重绘)时,动画停止了。我在处理 Paint 事件时尝试刷新按钮 (button.Refresh() ),但它没有解决问题。 \

有人知道如何解决这个问题吗?

【问题讨论】:

  • 我已经测试过了,当我的窗口被重绘时动画不会停止。在处理 onPaint 事件时你会做其他事情吗?您是否在不覆盖 onPaint 的情况下尝试过?
  • BackgroundWorker 正在工作(但那是另一个线程)。移动窗口时动画停止工作。有时动画也不会开始:/(ps.这个带有动​​画的按钮在单击另一个按钮之前是不可见的,所以在激活之前它既被禁用又不可见)。
  • 经过一番考虑-可能是windows 7的兼容性问题,我稍后需要在xp机器上测试它。不过这不是那么重要的问题。
  • 我也有类似的事情发生。 MDI 表单上的动画 GIF 有时会停止动画。将 MDI 窗体拖到其容器的一侧(以便 GIF 不可见),然后将其拖回查看使动画再次开始播放。我正在使用 Windows Vista。

标签: c# winforms gif animated-gif


【解决方案1】:

也许我弄错了,但我认为问题在于它不是在重绘表单时停止动画,而是当动画对象被另一个窗口遮挡时。这是预期的行为;错误在于,在 Windows Vista 和 Windows 7 中,显示是合成的,因此即使窗口被“遮挡”,它也从未真正被遮挡,并且在未遮挡时它永远不会收到绘制消息,这将重新启动动画。

此错误似乎会影响任何带有动画对象的 ButtonBase 派生控件。

问题在于 Control.IsWindowObscured 函数。它将返回 true。您可以在 ButtonBase.cs 文件的 System.Windows.Forms.ButtonBase.OnFrameChanged 中看到,最后有一行代码:

if (IsWindowObscured) {
 StopAnimate();
 return;
}

这就是问题所在。

仅供参考,OnFrameChanged 是从 ImageAnimator 线程调用的。这是在 ImageAnimator.Animate(image, eventhandler) 中指定的回调。 ButtonBase 在私有 void Animate(bool animate) 函数中设置它。 ImageAnimator 线程每 50 毫秒轮询一次,并检查是否需要为它正在监视的任何图像添加新帧;如果是这样,它会设置一个标志以使控件无效并绘制新框架。

由于我们无法访问,我认为我们对此无能为力。作为一种解决方法,我在我的表单中实现了一个计时器,它每 500 毫秒使控件无效,因此如果之前停止,它将强制它重新启动。我们无法覆盖甚至访问它,这很烦人。恐怕唯一的解决方案是上面的hack,或者创建或使用您自己或第三方创建的控件。

澄清一下——这只是在使用桌面组合的 Windows Vista 或 Windows 7 上的问题。问题是窗口永远不会真正被遮挡,就像不使用桌面组合时一样。它们总是由窗口管理器缓冲。 (Windows 2000+ 中有特殊的分层窗口,但暂时忽略它)。以前,如果窗口的某些部分不在屏幕上或被另一个窗口遮挡,则它们不可用。当它们重新出现时,通过改变焦点或位置等,系统将通知该区域重新绘制自己。但是,当使用桌面合成时,从不需要重新绘制,因为窗口的实际内容在其他地方缓冲。这就是为什么窗口预览在任务栏中工作的原因,例如 Flip-3d。副作用是,希望在被遮挡后再次可见时获得绘制消息的代码将失败。 ButtonBase 代码希望在返回视图后收到一条绘制消息,这将再次启动动画。因此,这种优化变成了一个错误。

应该在 Microsoft Connect 中报告该问题,但不太可能得到解决。

【讨论】:

  • 感谢深入的解释。我的问题以某种方式被解决了......嗯......真的不知道究竟是什么 - 更新我的VS,更改gif。我基本上放弃了,经过无数次代码和 gif 更改后,它终于开始按我想要的方式工作了:P
猜你喜欢
  • 1970-01-01
  • 2014-12-02
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
  • 2020-08-11
相关资源
最近更新 更多