C\#Winform 에서 애니메이션 예 시 를 어떻게 그 리 는 지 상세 하 게 설명 합 니 다.

머리말
여기 서.net 자체 가 가지 고 있 는 종류의 ImageAnimator 를 소개 합 니 다.애니메이션 을 제어 하 는 시간 축 과 유사 합 니 다.ImageAnimator.CanAnimate 를 사용 하면 그림 이 애니메이션 인지 아 닌 지 를 판단 할 수 있 습 니 다.ImageAnimator.Animate 를 호출 하면 애니메이션 을 재생 할 수 있 습 니 다.즉,프레임 을 거 칠 때마다 OnFrame Changed 의뢰 를 실행 할 수 있 습 니 다.우 리 는 이 의뢰 에서 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  
{  
  /// <summary>  
  ///             。  
  /// </summary>  
  public class AnimateImage  
  {  
    Image image;  
    FrameDimension frameDimension;  
    /// <summary>  
    ///             。  
    /// </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>  
    ///    。  
    /// </summary>  
    public int FrameCount  
    {  
      get { return mFrameCount; }  
    }  
 
    /// <summary>  
    ///       。  
    /// </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);  
      }  
    }  
  }  
}
다음 방법 으로 호출:

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();  
    }  
  }  
}
총결산
C\#Winform 에서 애니메이션 을 어떻게 그 리 는 지 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.C\#Winform 에서 애니메이션 을 그 리 는 내용 에 대해 서 는 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기