C# Winform中如何繪制動畫示例詳解
前言
這里介紹一個.net自身攜帶的類ImageAnimator,這個類類似于控制動畫的時間軸,使用ImageAnimator.CanAnimate可以判斷一個圖片是否為動畫,調(diào)用ImageAnimator.Animate可以開始播放動畫,即每經(jīng)過一幀的時間觸發(fā)一次OnFrameChanged委托,我們只要在該委托中將Image的活動幀選至下一幀再迫使界面重繪就可以實現(xiàn)動畫效果了。
為了方便以后的使用,我將這些代碼整合到了一起,形成一個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 { /// <summary> /// 表示一類帶動畫功能的圖像。 /// </summary> public class AnimateImage { Image image; FrameDimension frameDimension; /// <summary> /// 動畫當(dāng)前幀發(fā)生改變時觸發(fā)。 /// </summary> public event EventHandler<EventArgs> OnFrameChanged; /// <summary> /// 實例化一個AnimateImage。 /// </summary> /// <param name="img">動畫圖片。</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> /// 是否動畫。 /// </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> /// 播放這個動畫。 /// </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> /// 重置動畫,使之停止在第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中如何繪制動畫的文章就介紹到這了,更多相關(guān)C# Winform繪制動畫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
WinForm實現(xiàn)為ComboBox綁定數(shù)據(jù)源并提供下拉提示功能
這篇文章主要介紹了WinForm實現(xiàn)為ComboBox綁定數(shù)據(jù)源并提供下拉提示功能,是非常實用的功能,需要的朋友可以參考下2014-08-08一文詳解C#中重寫(override)及覆蓋(new)的區(qū)別
這篇文章主要為大家詳細介紹了C#中重寫(override)及覆蓋(new)這兩個關(guān)鍵詞的區(qū)別,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2023-03-03C# 微信支付 wx.chooseWXPay 簽名錯誤的解決方法
本篇文章主要介紹了C# 微信支付 wx.chooseWXPay 簽名錯誤的解決方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12