如何在Windows窗体上显示动画GIF(c#)
本文关键字:GIF 动画 显示 Windows 窗体 | 更新日期: 2023-09-27 17:47:24
我有一个表单,在相当长的进程运行时显示进度消息。这是对web服务的调用,所以我无法在进度条上真正有意义地显示完成百分比。(我不特别喜欢进度条的Marquee属性)
我想展示一个动画GIF,让这个过程有一些活动的感觉(例如,文件从一台计算机飞到另一台计算机,就像Windows复制过程一样)。
你是怎么做到的?
这并不太难。
- 将图片框放到表单上
- 将.gif文件添加为图片框中的图像
- 加载时显示图片框
需要考虑的事项:
- 禁用图片框将阻止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"属性。