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

本文关键字:GIF 动画 显示 Windows 窗体 | 更新日期: 2023-09-27 17:47:24

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

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

你是怎么做到的?

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

这并不太难。

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

需要考虑的事项:

  • 禁用图片框将阻止gif设置动画

另一种方法:

我发现另一种工作得很好的方法是我在代码项目

中发现的异步对话框控件

我也遇到了同样的问题。由于在后台进行长时间操作,整个表单(包括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和HideProgressGif Delegate是将带有gif的pictureBox的可见属性设置为true/false的表单中的委托。

请注意,在Windows中,传统上不使用动画Gifs,而是使用一些AVI动画:有一个Windows原生控件来显示它们。甚至还有一些工具可以将动画Gifs转换为AVI(反之亦然)。

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

当你在后面开始一个长操作时,它不会,因为当你在同一个线程中时,一切都会停止。

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

太迟了,但是!将图像设置为PictureBox.image并设置PictureBox.SizeMode=PictureBoxSizeMode.Zoom即可.Net Framework 4.8

PictureBox.Image = Image.FromFile("location"); // OR From base64 PictureBox.SizeMode = PictureBoxSizeMode.Zoom;

我遇到了同样的问题,通过实现我曾经面临的几个不同问题,我遇到了不同的解决方案。最后,下面是我把不同帖子中的一些片段放在一起,这些片段对我来说如预期的那样有效。

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; });
}

请记住,图片框在属性窗口中是不可见的,或者执行以下操作:

private void ComparerForm_Load(object sender, EventArgs e)
{
    pictureBox1.Visible = false;
}

WinForms中的图片框支持多种不同的文件扩展名。除了支持PNG文件外,它还可以支持GIF。所以实际上,你所要做的就是将图片框中的图像设置为GIF。请注意,禁用图片框会使其保持为静态图片。

您可以通过代码或使用图片框的属性选项卡来修改图像。

代码

pictureBox1.Image = ImageFileHere;

如果这不起作用,你也可以尝试:

pictureBox1.Image = Image.FromFile("ImageFileHere");

属性

只需查找"Image"属性即可背景图像。


不要忘记更改大小模式,以防格式不正确!你也可以通过两种方式做到这一点。

代码

pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;(有几种不同的模式可供选择,这一种是拉伸)

属性

查找"SizeMode"属性。