欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# Winform中如何繪制動(dòng)畫示例詳解

 更新時(shí)間:2020年05月14日 08:48:50   作者:小y  
這篇文章主要給大家介紹了關(guān)于C# Winform中如何繪制動(dòng)畫的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C# Winform具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

這里介紹一個(gè).net自身攜帶的類ImageAnimator,這個(gè)類類似于控制動(dòng)畫的時(shí)間軸,使用ImageAnimator.CanAnimate可以判斷一個(gè)圖片是否為動(dòng)畫,調(diào)用ImageAnimator.Animate可以開始播放動(dòng)畫,即每經(jīng)過一幀的時(shí)間觸發(fā)一次OnFrameChanged委托,我們只要在該委托中將Image的活動(dòng)幀選至下一幀再迫使界面重繪就可以實(shí)現(xiàn)動(dòng)畫效果了。

為了方便以后的使用,我將這些代碼整合到了一起,形成一個(gè)AnimateImage類,該類提供了CanAnimate、FrameCount、CurrentFrame等屬性,以及Play()、Stop()、Reset()等動(dòng)畫常用的方法,代碼如下

using System;  
using System.Collections.Generic;  
using System.Text;  
using System.Drawing;  
using System.Drawing.Imaging;  
 
namespace GifTest  
{  
  /// <summary>  
  /// 表示一類帶動(dòng)畫功能的圖像。  
  /// </summary>  
  public class AnimateImage  
  {  
    Image image;  
    FrameDimension frameDimension;  
    /// <summary>  
    /// 動(dòng)畫當(dāng)前幀發(fā)生改變時(shí)觸發(fā)。  
    /// </summary>  
    public event EventHandler<EventArgs> OnFrameChanged;  
 
    /// <summary>  
    /// 實(shí)例化一個(gè)AnimateImage。  
    /// </summary>  
    /// <param name="img">動(dòng)畫圖片。</param>  
    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;  
 
    /// <summary>  
    /// 圖片。  
    /// </summary>  
    public Image Image  
    {  
      get { return image; }  
    }  
 
    /// <summary>  
    /// 是否動(dòng)畫。  
    /// </summary>  
    public bool CanAnimate  
    {  
      get { return mCanAnimate; }  
    }  
 
    /// <summary>  
    /// 總幀數(shù)。  
    /// </summary>  
    public int FrameCount  
    {  
      get { return mFrameCount; }  
    }  
 
    /// <summary>  
    /// 播放的當(dāng)前幀。  
    /// </summary>  
    public int CurrentFrame  
    {  
      get { return mCurrentFrame; }  
    }  
 
    /// <summary>  
    /// 播放這個(gè)動(dòng)畫。  
    /// </summary>  
    public void Play()  
    {  
      if (mCanAnimate)  
      {  
        lock (image)  
        {  
          ImageAnimator.Animate(image, new EventHandler(FrameChanged));  
        }  
      }  
    }  
 
    /// <summary>  
    /// 停止播放。  
    /// </summary>  
    public void Stop()  
    {  
      if (mCanAnimate)  
      {  
        lock (image)  
        {  
          ImageAnimator.StopAnimate(image, new EventHandler(FrameChanged));  
        }  
      }  
    }  
 
    /// <summary>  
    /// 重置動(dòng)畫,使之停止在第0幀位置上。  
    /// </summary>  
    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);  
      }  
    }  
  }  
}

使用如下方法調(diào)用:

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 Settings\Administrator\My Documents\My Pictures\未命名.gif"));  
      image.OnFrameChanged += new EventHandler<EventArgs>(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();  
    }  
  }  
}

總結(jié)

到此這篇關(guān)于C# Winform中如何繪制動(dòng)畫的文章就介紹到這了,更多相關(guān)C# Winform繪制動(dòng)畫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c# 識(shí)別圖片格式的方法

    c# 識(shí)別圖片格式的方法

    這篇文章主要介紹了c# 識(shí)別圖片格式的方法,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-02-02
  • C#中richtextbox使用方法詳解

    C#中richtextbox使用方法詳解

    這篇文章主要介紹了C#中richtextbox使用方法,分析較為詳盡,需要的朋友可以參考下
    2014-07-07
  • WinForm實(shí)現(xiàn)為ComboBox綁定數(shù)據(jù)源并提供下拉提示功能

    WinForm實(shí)現(xiàn)為ComboBox綁定數(shù)據(jù)源并提供下拉提示功能

    這篇文章主要介紹了WinForm實(shí)現(xiàn)為ComboBox綁定數(shù)據(jù)源并提供下拉提示功能,是非常實(shí)用的功能,需要的朋友可以參考下
    2014-08-08
  • 一文詳解C#中重寫(override)及覆蓋(new)的區(qū)別

    一文詳解C#中重寫(override)及覆蓋(new)的區(qū)別

    這篇文章主要為大家詳細(xì)介紹了C#中重寫(override)及覆蓋(new)這兩個(gè)關(guān)鍵詞的區(qū)別,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-03-03
  • C#使用GDI+創(chuàng)建縮略圖實(shí)例

    C#使用GDI+創(chuàng)建縮略圖實(shí)例

    這篇文章主要介紹了C#使用GDI+創(chuàng)建縮略圖實(shí)例,是C#程序設(shè)計(jì)中非常實(shí)用的技巧,需要的朋友可以參考下
    2014-10-10
  • C#實(shí)現(xiàn)備忘錄功能

    C#實(shí)現(xiàn)備忘錄功能

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)備忘錄功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • C# 微信支付 wx.chooseWXPay 簽名錯(cuò)誤的解決方法

    C# 微信支付 wx.chooseWXPay 簽名錯(cuò)誤的解決方法

    本篇文章主要介紹了C# 微信支付 wx.chooseWXPay 簽名錯(cuò)誤的解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • Unity平臺(tái)模擬自動(dòng)擋駕駛汽車

    Unity平臺(tái)模擬自動(dòng)擋駕駛汽車

    這篇文章主要為大家詳細(xì)介紹了Unity平臺(tái)模擬自動(dòng)擋駕駛汽車,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • 最新評(píng)論