代码如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; //debug 引用 using System.Diagnostics; namespace CYSoft.TS.UI.StudentInfo { public partial class PicboxPlayGif : UserControl { private Image m_imgImage = null; private EventHandler m_evthdlAnimator = null; public PicboxPlayGif() { InitializeComponent(); this.SetStyle(ControlStyles.UserPaint, true); this.SetStyle(ControlStyles.DoubleBuffer, true); this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); //为委托关联一个处理方法 m_evthdlAnimator = new EventHandler(OnImageAnimate); Debug.Assert(m_evthdlAnimator != null); } private bool isPicboxFit = true; [Description("pic 的宽和高和 真实gif的宽和高 是否要一致 ture=一致 false=不一致 ")] public bool _isPicboxFit { get { return isPicboxFit; } set { this.isPicboxFit = value; this.Invalidate(); } } private int picWidth = 0; [Description("图片宽度(如果isPicboxFit=true 这个参数无意义)")] public int _picWidth { get { return picWidth; } set { if (!isPicboxFit) { if(value!=0) { this.picWidth = value; this.Invalidate(); } } } } private int picHeight = 0; [Description("图片高度(如果isPicboxFit=true 这个参数无意义)")] public int _picHeight { get { return picHeight; } set { if (!isPicboxFit) { if (value != 0) { this.picHeight = value; this.Invalidate(); } } } } private string imagePath = "C:\\Users\\Thinkpad\\Desktop\\素材\\WaitLoading.gif"; [Description("图片路径")] public string _imagePath { get { return imagePath; } set { this.imagePath = value; this.Invalidate(); } } private AA imageLayout = AA.Stretch; [Description("图片在picbox中的显示方式")] public AA _imageLayout { get { return imageLayout; } set { this.imageLayout = value; this.Invalidate(); } } public enum AA { None, Title, Center, Stretch, Zoom } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); if (m_imgImage != null) { UpdateImage(); //不用picbox 直接输出 // e.Graphics.DrawImage(m_imgImage, new Rectangle(100, 100, m_imgImage.Width, m_imgImage.Height)); //image 格式 if(imageLayout==AA.None) { pic.BackgroundImageLayout = ImageLayout.None; }else if(imageLayout==AA.Title) { pic.BackgroundImageLayout = ImageLayout.Tile; } else if (imageLayout == AA.Stretch) { pic.BackgroundImageLayout = ImageLayout.Stretch; } else if (imageLayout == AA.Zoom) { pic.BackgroundImageLayout = ImageLayout.Zoom; } else { pic.BackgroundImageLayout = ImageLayout.Center; } pic.BackgroundImage = m_imgImage; } } protected override void OnLoad(EventArgs e) { base.OnLoad(e); //加载图片 m_imgImage = Image.FromFile(imagePath); if (isPicboxFit) { this.Width = m_imgImage.Width; this.Height = m_imgImage.Height; } else { this.Width = picWidth; this.Height = picHeight; } //pic设置 pic.BackColor = Color.Transparent; pic.Dock = DockStyle.Fill; //BeginAnimate(); } /// <summary> /// 播放或停止 动画 /// </summary> /// <param name="isPlay">true=播放 false=停止</param> public void _PlayOrEndGif(bool isPlay) { if (isPlay) { BeginAnimate(); } else { if (m_imgImage != null) { StopAnimate(); //m_imgImage = null; } } } //开始动画 private void BeginAnimate() { if (m_imgImage == null) return; if (ImageAnimator.CanAnimate(m_imgImage)) { //当gif动画每隔一定时间后,都会变换一帧,那么就会触发一事件, //该方法就是将当前image每变换一帧时,都会调用当前这个委托所关联的方法。 ImageAnimator.Animate(m_imgImage,m_evthdlAnimator); } } //结束动画 private void StopAnimate() { if (m_imgImage == null) return; if (ImageAnimator.CanAnimate(m_imgImage)) { ImageAnimator.StopAnimate(m_imgImage,m_evthdlAnimator); } } //切换图片(帧图片) private void UpdateImage() { if (m_imgImage == null) return; if (ImageAnimator.CanAnimate(m_imgImage)) { //获得当前gif动画的下一步需要渲染的帧,当下一步任何对当前gif动画的操作都是对该帧进行操作) ImageAnimator.UpdateFrames(m_imgImage); } } private void OnImageAnimate(Object sender,EventArgs e) { //使得当前这个winfor重绘,然后去调用该winform的OnPaint()方法进行重绘 this.Invalidate(); } private void PicboxPlayGif_Load(object sender, EventArgs e) { } } }
调用:
上图右边是属性设置:
播放gif:
picboxPlayGif2._PlayOrEndGif(true);
停止gif:
picboxPlayGif2._PlayOrEndGif(true);
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-17 19:10:09