你如何在 Windows 窗体上显示动画 GIF (c#)
Posted
技术标签:
【中文标题】你如何在 Windows 窗体上显示动画 GIF (c#)【英文标题】:How do you show animated GIFs on a Windows Form (c#) 【发布时间】:2010-09-15 00:14:16 【问题描述】:我有一个显示进度消息的表单,因为进程运行时间相当长。这是对 Web 服务的调用,所以我无法在进度条上有意义地显示完成百分比。 (我不是特别喜欢进度条的 Marquee 属性)
我想展示一个动画 GIF,让该过程具有某种活动的感觉(例如,文件从一台计算机传输到另一台计算机,如 Windows 复制过程)。
你是怎么做到的?
【问题讨论】:
对于动画图像,您可以使用此控制器。 codeproject.com/Tips/1004624/Gif-viewer-Snipper-control 【参考方案1】:这并不难。
-
将图片框拖放到表单上。
将 .gif 文件添加为图片框中的图像
加载时显示图片框。
需要考虑的事项:
禁用图片框将阻止 gif 动画。GIF 动画:
如果您正在寻找动画 gif,您可以生成它们:
AjaxLoad - Ajax Loading gif generator
另一种方法:
我发现另一种效果很好的方法是我在 code project 上找到的异步对话框控件
【讨论】:
非常简单!我最初的“谷歌搜索”没有显示这一点——也许太明显了。谢谢。 但是,图片框不会随着进程的执行而刷新(重绘)。 Durr,我错误地将其设置为背景图像。背景图像,合理地,不支持动画;前景图像。 @neminem:这里也一样!这就是我在这里的原因。有一段时间我认为pictureBox不支持fox gifs(我第一次使用它) @LarryBud 要使其在进程执行时刷新(重绘),您可以调用Application.DoEvents();
。可能的方法:您的业务逻辑在部分完成时触发一个事件,然后可以更新任何属性(例如进度条或百分比),并且可以使用 Application.DoEvents() 更新动画【参考方案2】:
Public Class Form1
Private animatedimage As New Bitmap("C:\MyData\Search.gif")
Private currentlyanimating As Boolean = False
Private Sub OnFrameChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
Me.Invalidate()
End Sub
Private Sub AnimateImage()
If currentlyanimating = True Then
ImageAnimator.Animate(animatedimage, AddressOf Me.OnFrameChanged)
currentlyanimating = False
End If
End Sub
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
AnimateImage()
ImageAnimator.UpdateFrames(animatedimage)
e.Graphics.DrawImage(animatedimage, New Point((Me.Width / 4) + 40, (Me.Height / 4) + 40))
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
BtnStop.Enabled = False
End Sub
Private Sub BtnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnStop.Click
currentlyanimating = False
ImageAnimator.StopAnimate(animatedimage, AddressOf Me.OnFrameChanged)
BtnStart.Enabled = True
BtnStop.Enabled = False
End Sub
Private Sub BtnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnStart.Click
currentlyanimating = True
AnimateImage()
BtnStart.Enabled = False
BtnStop.Enabled = True
End Sub
End Class
【讨论】:
【参考方案3】:我遇到了同样的问题,并且通过实施我曾经面临几个不同的问题遇到了不同的解决方案。最后,下面是我将来自不同帖子的一些部分放在一起的内容,这些内容对我来说符合预期。
private void btnCompare_Click(object sender, EventArgs e)
ThreadStart threadStart = new ThreadStart(Execution);
Thread thread = new Thread(threadStart);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
这里是Execution方法,也带有调用PictureBox控件:
private void Execution()
btnCompare.Invoke((MethodInvoker)delegate pictureBox1.Visible = true; );
Application.DoEvents();
// Your main code comes here . . .
btnCompare.Invoke((MethodInvoker)delegate pictureBox1.Visible = false; );
请记住,PictureBox 在属性窗口中是不可见的,或者执行以下操作:
private void ComparerForm_Load(object sender, EventArgs e)
pictureBox1.Visible = false;
【讨论】:
【参考方案4】:我遇到了同样的问题。由于在后台工作的长时间操作,整个表单(包括 gif)停止重绘自身。这是我解决这个问题的方法。
private void MyThreadRoutine()
this.Invoke(this.ShowProgressGifDelegate);
//your long running process
System.Threading.Thread.Sleep(5000);
this.Invoke(this.HideProgressGifDelegate);
private void button1_Click(object sender, EventArgs e)
ThreadStart myThreadStart = new ThreadStart(MyThreadRoutine);
Thread myThread = new Thread(myThreadStart);
myThread.Start();
我只是创建了另一个线程来负责这个操作。多亏了这个初始形式,继续重绘没有问题(包括我的 gif 工作)。 ShowProgressGifDelegate 和 HideProgressGifDelegate 是表单中的代表,将带有 gif 的图片框的可见属性设置为真/假。
【讨论】:
【参考方案5】:当你开始一个长时间的操作时不会,因为你在同一个线程中,所以一切都停止了。
【讨论】:
就我在 *** 上阅读的内容而言,MTA 线程模式似乎是最糟糕的解决方案。【参考方案6】:请注意,在 Windows 中,您通常不使用动画 Gif,而是使用少量 AVI 动画:有一个 Windows 本机控件来显示它们。甚至还有工具可以将动画 Gif 转换为 AVI(反之亦然)。
【讨论】:
是的——也许这就是我应该问的。谢谢。 链接到工具,s'il vous plaît?或者对文档、原因等的任何其他参考都会很棒。谢谢! 我不关心编写传统的 Windows 软件。如果System.Windows.Forms.PictureBox
控件支持它,我将只使用动画 GIF。【参考方案7】:
如果你把它放在 PictureBox 控件中,它应该可以工作
【讨论】:
除非你禁用表单 ;)以上是关于你如何在 Windows 窗体上显示动画 GIF (c#)的主要内容,如果未能解决你的问题,请参考以下文章