栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

C# Winform中如何绘制动画示例详解

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C# Winform中如何绘制动画示例详解

前言

这里介绍一个.net自身携带的类ImageAnimator,这个类类似于控制动画的时间轴,使用ImageAnimator.CanAnimate可以判断一个图片是否为动画,调用ImageAnimator.Animate可以开始播放动画,即每经过一帧的时间触发一次OnframeChanged委托,我们只要在该委托中将Image的活动帧选至下一帧再迫使界面重绘就可以实现动画效果了。

为了方便以后的使用,我将这些代码整合到了一起,形成一个AnimateImage类,该类提供了CanAnimate、frameCount、Currentframe等属性,以及Play()、Stop()、Reset()等动画常用的方法,代码如下

using System;  
using System.Collections.Generic;  
using System.Text;  
using System.Drawing;  
using System.Drawing.Imaging;  
 
namespace GifTest  
{  
  ///   
  /// 表示一类带动画功能的图像。  
  ///   
  public class AnimateImage  
  {  
    Image image;  
    frameDimension frameDimension;  
    ///   
    /// 动画当前帧发生改变时触发。  
    ///   
    public event EventHandler OnframeChanged;  
 
    ///   
    /// 实例化一个AnimateImage。  
    ///   
    /// 动画图片。  
    public AnimateImage(Image img)  
    {  
      image = img;  
 
      lock (image)  
      {  
 mCanAnimate = ImageAnimator.CanAnimate(image);  
 if (mCanAnimate)  
 {  
   Guid[] guid = image.frameDimensionsList;  
   frameDimension = new frameDimension(guid[0]);  
   mframeCount = image.GetframeCount(frameDimension);  
 }  
      }  
    }  
 
    bool mCanAnimate;  
    int mframeCount = 1, mCurrentframe = 0;  
 
    ///   
    /// 图片。  
    ///   
    public Image Image  
    {  
      get { return image; }  
    }  
 
    ///   
    /// 是否动画。  
    ///   
    public bool CanAnimate  
    {  
      get { return mCanAnimate; }  
    }  
 
    ///   
    /// 总帧数。  
    ///   
    public int frameCount  
    {  
      get { return mframeCount; }  
    }  
 
    ///   
    /// 播放的当前帧。  
    ///   
    public int Currentframe  
    {  
      get { return mCurrentframe; }  
    }  
 
    ///   
    /// 播放这个动画。  
    ///   
    public void Play()  
    {  
      if (mCanAnimate)  
      {  
 lock (image)  
 {  
   ImageAnimator.Animate(image, new EventHandler(frameChanged));  
 }  
      }  
    }  
 
    ///   
    /// 停止播放。  
    ///   
    public void Stop()  
    {  
      if (mCanAnimate)  
      {  
 lock (image)  
 {  
   ImageAnimator.StopAnimate(image, new EventHandler(frameChanged));  
 }  
      }  
    }  
 
    ///   
    /// 重置动画,使之停止在第0帧位置上。  
    ///   
    public void Reset()  
    {  
      if (mCanAnimate)  
      {  
 ImageAnimator.StopAnimate(image, new EventHandler(frameChanged));  
 lock (image)  
 {  
   image.SelectActiveframe(frameDimension, 0);  
   mCurrentframe = 0;  
 }  
      }  
    }  
 
    private void frameChanged(object sender, EventArgs e)  
    {  
      mCurrentframe = mCurrentframe + 1 >= mframeCount ? 0 : mCurrentframe + 1;  
      lock (image)  
      {  
 image.SelectActiveframe(frameDimension, mCurrentframe);  
      }  
      if (onframeChanged != null)  
      {  
 onframeChanged(image, e);  
      }  
    }  
  }  
}

使用如下方法调用:

using System;  
using System.Collections.Generic;  
using System.ComponentModel;  
using System.Data;  
using System.Drawing;  
using System.Drawing.Imaging;  
using System.Text;  
using System.Windows.Forms;  
 
namespace GifTest  
{  
  public partial class Form1 : Form  
  {  
    AnimateImage image;  
 
    public Form1()  
    {  
      InitializeComponent();  
      image = new AnimateImage(Image.FromFile(@"C:documents and SettingsAdministratorMy documentsMy Pictures未命名.gif"));  
      image.onframeChanged += new EventHandler(image_OnframeChanged);  
      SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);  
    }  
 
    void image_onframeChanged(object sender, EventArgs e)  
    {  
      Invalidate();  
    }  
 
    private void Form1_Load(object sender, EventArgs e)  
    {  
      image.Play();  
    }  
 
    private void Form1_Paint(object sender, PaintEventArgs e)  
    {  
      lock (image.Image)  
      {  
 e.Graphics.DrawImage(image.Image, new Point(0, 0));  
      }  
    }  
 
    private void button1_Click(object sender, EventArgs e)  
    {  
      if (button1.Text.Equals("Stop"))  
      {  
 image.Stop();  
 button1.Text = "Play";  
      }  
      else 
      {  
 image.Play();  
 button1.Text = "Stop";  
      }  
      Invalidate();  
    }  
 
    private void button2_Click(object sender, EventArgs e)  
    {  
      image.Reset();  
      button1.Text = "Play";  
      Invalidate();  
    }  
  }  
}

总结

到此这篇关于C# Winform中如何绘制动画的文章就介绍到这了,更多相关C# Winform绘制动画内容请搜索考高分网以前的文章或继续浏览下面的相关文章希望大家以后多多支持考高分网!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/122096.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号