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 에서 애니메이션 을 그 리 는 내용 에 대해 서 는 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.