這篇文章主要講解了C# Winform中繪制動(dòng)畫(huà)的方法,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。
成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),北票企業(yè)網(wǎng)站建設(shè),北票品牌網(wǎng)站建設(shè),網(wǎng)站定制,北票網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,北票網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
前言
這里介紹一個(gè).net自身攜帶的類ImageAnimator,這個(gè)類類似于控制動(dòng)畫(huà)的時(shí)間軸,使用ImageAnimator.CanAnimate可以判斷一個(gè)圖片是否為動(dòng)畫(huà),調(diào)用ImageAnimator.Animate可以開(kāi)始播放動(dòng)畫(huà),即每經(jīng)過(guò)一幀的時(shí)間觸發(fā)一次OnFrameChanged委托,我們只要在該委托中將Image的活動(dòng)幀選至下一幀再迫使界面重繪就可以實(shí)現(xiàn)動(dòng)畫(huà)效果了。
為了方便以后的使用,我將這些代碼整合到了一起,形成一個(gè)AnimateImage類,該類提供了CanAnimate、FrameCount、CurrentFrame等屬性,以及Play()、Stop()、Reset()等動(dòng)畫(huà)常用的方法,代碼如下
using System; using System.Collections.Generic; using System.Text; using System.Drawing; using System.Drawing.Imaging; namespace GifTest { ////// 表示一類帶動(dòng)畫(huà)功能的圖像。 /// public class AnimateImage { Image image; FrameDimension frameDimension; ////// 動(dòng)畫(huà)當(dāng)前幀發(fā)生改變時(shí)觸發(fā)。 /// public event EventHandlerOnFrameChanged; /// /// 實(shí)例化一個(gè)AnimateImage。 /// /// 動(dòng)畫(huà)圖片。 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; } } ////// 是否動(dòng)畫(huà)。 /// public bool CanAnimate { get { return mCanAnimate; } } ////// 總幀數(shù)。 /// public int FrameCount { get { return mFrameCount; } } ////// 播放的當(dāng)前幀。 /// public int CurrentFrame { get { return mCurrentFrame; } } ////// 播放這個(gè)動(dòng)畫(huà)。 /// 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)); } } } ////// 重置動(dòng)畫(huà),使之停止在第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); } } } }
使用如下方法調(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(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(); } } }
看完上述內(nèi)容,是不是對(duì)C# Winform中繪制動(dòng)畫(huà)的方法有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。