重写OnPaint事件对窗体重绘(显示gif动画) 实例2

时间:2023-03-08 17:23:54
重写OnPaint事件对窗体重绘(显示gif动画) 实例2
    /// <summary>
/// 可显示Gif 的窗体
/// </summary>
public class WinGif : Form
{
private Image _img = null;
public Image Img
{
get { return _img; }
set { _img = value; }
} private EventHandler evtHandler = null;
public WinGif(Image img)
{
//初始化设置
evtHandler = new EventHandler(OnImageAnimate);
this.Img = img;
this.Width = _img.Width+;
this.Height = _img.Height + ; //开始动画
BeginAnimate();
} //委托所关联的方法
private void OnImageAnimate(Object sender, EventArgs e)
{
//该方法,只是使得当前控件重绘,调用OnPaint()
this.Invalidate();
}
//设置开始动画
public void BeginAnimate()
{
if (_img != null)
{
//当gif动画每隔一定时间后,都会变换一帧,那么就会触发一事件
//该方法就是将当前image每变换一帧时,都会调用当前这个委托所关联的方法
ImageAnimator.Animate(_img,evtHandler);
}
}
//关闭显示动画,该方法可以在窗口关闭或者某事件触发时,已停止渲染当前gif动画
public void StopAnimate()
{
_img = null;
ImageAnimator.StopAnimate(_img,evtHandler);
}
/// <summary>
/// 重载的当前winform 的OnPaint方法,当界面被冲重绘制时显示gif的某一帧
/// </summary>
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (_img != null)
{
//获取当前gif动画下一步要渲染的帧
UpdateImage();
//将获得的当前gif动画需要渲染的帧显示在界面的某个位置
e.Graphics.DrawImage(_img,new Rectangle(,,_img.Width,_img.Height));
}
}
//获得当前gif动画的下一步需要渲染的帧,当下一步任何对当前gif动画的操作都是对该帧进行操作
private void UpdateImage()
{
ImageAnimator.UpdateFrames(_img);
}
}

使用和结果显示:

        private void button1_Click(object sender, EventArgs e)
{ string file = Application.StartupPath + "\\2.gif";
Image img = System.Drawing.Image.FromFile(file); WinGif gif = new WinGif(img); gif.Show();
}

重写OnPaint事件对窗体重绘(显示gif动画) 实例2