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

balp4ylt  于 2022-11-17  发布在  Windows
关注(0)|答案(8)|浏览(232)

我有一个表单,在一个相当长的进程运行时显示进度消息。它是对Web服务的调用,所以我不能真正有意义地在进度条上显示完成百分比。(我不太喜欢进度条的Marquee属性)
我想展示一个动画GIF,给予这个过程看起来像某种活动(例如,文件从一台计算机飞到另一台计算机,就像Windows复制过程)。
你是怎么做到的?

zynd9foi

zynd9foi1#

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

qkf9rpyu

qkf9rpyu2#

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

v1uwarro

v1uwarro3#

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
u4dcyp6a

u4dcyp6a4#

太晚了,但是!将图像设置为PictureBox.Image并设置PictureBox.SizeMode = PictureBoxSizeMode.Zoom就可以实现此目的。
PictureBox.Image = Image.FromFile("location"); // OR From base64 PictureBox.SizeMode = PictureBoxSizeMode.Zoom;

oxosxuxt

oxosxuxt5#

我遇到了同样的问题,并遇到了不同的解决方案,通过实施,我曾经面临几个不同的问题。最后,下面是我把一些片段从不同的职位在一起,为我工作的预期。

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

kpbwa7wx6#

这不是太难。
1.将图片框拖放到窗体上。
1.将.gif文件作为图像添加到图片框中。
1.加载时显示图片框。

需要考虑的事项:

  • 禁用图片框将阻止gif动画。
    另一种方法:

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

t0ybt7op

t0ybt7op7#

我也遇到过同样的问题。整个表单(包括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 with gif的visible属性设置为true/false。

ne5o7dgx

ne5o7dgx8#

请注意,在Windows中,您通常不使用动画Gif,而是使用小AVI动画:有一个Windows原生控件来显示它们。甚至有工具来转换动画Gif到AVI(反之亦然)。

相关问题