如何在Windows窗体上显示GIF动画(C#)


142

我有一个显示进度消息的表格,它显示了相当长的过程。这是对Web服务的调用,因此我无法真正在进度条上有意义地显示完成百分比。(我不太喜欢进度条的Marquee属性)

我想展示一个动画GIF,以使该过程具有某种活动的感觉(例如,文件从一台计算机飞到另一台计算机,例如Windows复制过程)。

你怎么做到这一点?


对于动画图像,可以使用此控制器。codeproject.com/Tips/1004624/Gif-viewer-Snipper-control
xwpedram

Answers:


249

不太难。

  1. 将一个图片框拖放到您的窗体上。
  2. 将.gif文件作为图片添加到图片框中
  3. 加载时显示图片框。

要考虑的事项:

  • 禁用图片框将阻止gif动画化。

GIF动画:

如果您正在寻找GIF动画,可以生成它们:

AjaxLoad-Ajax加载gif生成器

另一种方法是:

我发现效果很好的另一种方法是在代码项目中找到的异步对话框控件


5
尴尬轻松!我最初的“ Google搜索”没有显示此内容-也许太明显了。谢谢。
Stuart Helwig

1
但是,图片框不会在执行过程时刷新(重画)。
LarryBud

Durr,我误将其设置为背景图像。背景图片合理地不支持动画;前景图像呢。
neminem

@neminem:同样!这就是为什么我在这里。有一阵子我以为pictureBox不支持狐狸gif(我第一次使用它)
杰克

@LarryBud要使其在执行过程时刷新(重绘),可以调用Application.DoEvents();。可能的方法:部分完成某件事后,您的业务逻辑将触发一个事件,然后可以使用Application.DoEvents()
Do-do-new-

12

我有同样的问题。整个表单(包括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的pictureBox的可见属性设置为true / false的形式的委托。


6

请注意,在Windows中,传统上您不使用动画Gif,而是使用很少的AVI动画:有一个Windows本机控件仅用于显示它们。甚至还有将动画Gif转换为AVI的工具(反之亦然)。


是的-也许那是我应该问的。谢谢。
Stuart Helwig

6
链接到工具,s'il vousplaît吗?或任何其他有关文档的参考,原因等,将是很好的。谢谢!
杰夫·B

1
我不在乎编写传统的Windows软件。如果System.Windows.Forms.PictureBox控件支持,我将只使用动画GIF。
Mike de Klerk 2013年

3

如果将其放在PictureBox控件中,它应该可以正常工作


2
除非您禁用表格;)
Jeff B

1

当您在后面开始长时间的操作时,它不会出现,因为由于您位于同一线程中,所以一切都停止了。


就我在StackOverflow上阅读而言,MTA线程模式似乎是最糟糕的解决方案。
Yogurtu '16

1
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

0

我遇到了同样的问题,并且通过实施曾经遇到过多个不同问题的解决方案遇到了不同的解决方案。最后,下面是我将来自不同职位的一些文章放在一起,它们按预期工作。

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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.