.NET Winform应用程序中,要实现加载等待的动画效果需要借助于ImageAnimator类,该类可实现多帧图像的动画处理显示。该类的主要的方法如下:
public static void Animate(Image image, EventHandler onFrameChangedHandler) 用于播放动画,image为要处理的多帧图像,图像没经过一阵会调用onFrameChangedHandler委托,在委托中让图像显示到下一阵并重画该帧图像便可以实现动画效果。
public static void UpdateFrames(Image image) 该方法让多帧图像更新到下一帧
public static void StopAnimate(Image image, EventHandler onFrameChangedHandler) 停止动画效果
代码如下所示:
public void BeginLoading(Control container)
{
this.BackColor = container.BackColor;
this.Refresh();
Screen screen = Screen.FromControl(container);
this.Location = new Point((container.Width - this.Width) / 2, (container.Height - this.Height) / 2);
container.SizeChanged -= container_SizeChanged;
container.SizeChanged += container_SizeChanged;
if (!container.Controls.Contains(this))
container.Controls.Add(this);
this.BringToFront();
ImageAnimator.Animate(image, new EventHandler(OnImageAnimate));
this.Show();
}
/// <summary>
/// 结束loading
/// </summary>
public void EndLoading()
{
ImageAnimator.StopAnimate(image, eventHandler);
this.Hide();
}
private void UpdateImage()
{
ImageAnimator.UpdateFrames(image);
}
#endregion
#region Override
protected override void OnPaint(PaintEventArgs e)
{
UpdateImage();
Rectangle rectImage = new Rectangle(0, 0, CONST_INT_WIDTH, CONST_INT_HEIGHT);
e.Graphics.DrawImage(image, rectImage);
}
#endregion
private void container_SizeChanged(object sender, EventArgs e)
{
if(sender is Control)
{
Control container = sender as Control;
this.Location = new Point((container.Width - this.Width) / 2, (container.Height - this.Height) / 2);
}
}
private void OnImageAnimate(Object sender, EventArgs e)
{
//该方法中,只是使得当前这个winform重绘,然后去调用该winform的OnPaint()方法进行重绘)
this.Invalidate();
}
效果图如下所示: