【问题标题】:How do you show animated GIFs on a Windows Form (c#)你如何在 Windows 窗体上显示动画 GIF (c#)
【发布时间】:2010-09-15 00:14:16
【问题描述】:

我有一个显示进度消息的表单,因为进程运行时间相当长。这是对 Web 服务的调用,所以我无法在进度条上有意义地显示完成百分比。 (我不是特别喜欢进度条的 Marquee 属性)

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

你是怎么做到的?

【问题讨论】:

标签: c# winforms animated-gif


【解决方案1】:

这并不难。

  1. 将图片框拖放到表单上。
  2. 将 .gif 文件添加为图片框中的图像
  3. 加载时显示图片框。

需要考虑的事项:

  • 禁用图片框将阻止 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】:

        当你开始一个长时间的操作时不会,因为你在同一个线程中,所以一切都停止了。

        【讨论】:

        • 就我在 StackOverflow 上阅读的内容而言,MTA 线程模式似乎是最糟糕的解决方案。
        【解决方案6】:

        请注意,在 Windows 中,您通常不使用动画 Gif,而是使用少量 AVI 动画:有一个 Windows 本机控件来显示它们。甚至还有工具可以将动画 Gif 转换为 AVI(反之亦然)。

        【讨论】:

        • 是的——也许这就是我应该问的。谢谢。
        • 链接到工具,s'il vous plaît?或者对文档、原因等的任何其他参考都会很棒。谢谢!
        • 我不关心编写传统的 Windows 软件。如果System.Windows.Forms.PictureBox 控件支持它,我将只使用动画 GIF。
        【解决方案7】:

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

        【讨论】:

        • 除非你禁用表单 ;)
        猜你喜欢
        • 1970-01-01
        • 2015-09-27
        • 2012-04-11
        • 1970-01-01
        • 2015-12-01
        • 1970-01-01
        • 2011-01-19
        相关资源
        最近更新 更多