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

时间:2008-10-03 04:54:22

标签: c# winforms animated-gif

我有一个表单显示进度消息,因为运行时间过长。这是对Web服务的调用,因此我无法真正显示进度条上的百分比完整数字。 (我不特别喜欢进度条的Marquee属性)

我想展示一个动画GIF,让过程感受到某些活动(例如,从一台计算机飞到另一台计算机的文件,如Windows复制过程)。

你是怎么做到的?

7 个答案:

答案 0 :(得分:232)

这不太难。

  1. 将图片框放到表单上。
  2. 将.gif文件添加为图片框中的图像
  3. 加载时显示图片框。
  4. 需要考虑的事项:

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

    GIF动画:

    如果您正在寻找动画GIF,可以生成here

    另一种方法:

    我发现效果很好的另一种方法是我在code project上找到的异步对话框控件

答案 1 :(得分:11)

我遇到了同样的问题。整个表单(包括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是表单的委托,它将pictureBox的可见属性设置为gif为true / false。

答案 2 :(得分:6)

请注意,在Windows中,您通常不使用动画Gif,但使用AVI动画:只有一个Windows本机控件才能显示它们。甚至还有将GIF动画转换为AVI的工具(反之亦然)。

答案 3 :(得分:3)

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

答案 4 :(得分:1)

当你开始长时间的操作时,它不会,因为你在同一个线程中的所有东西都是STOPS。

答案 5 :(得分: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

答案 6 :(得分: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();
}

这是执行方法,它也包含调用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;
}