你如何在 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#)的主要内容,如果未能解决你的问题,请参考以下文章

C# Windows 窗体中的 WMP 在显示 GIF 后停止播放声音

如何在Canvas上显示gif动画 SWT

wpf如何显示gif图片

如何在wps文档里面显示gif动画?

C#窗体上怎么显示动态图片如gif

EVC编程点滴-GIF动画显示类