自定义控件 播放GIF动画
2015-08-11 09:28
477 查看
代码如下:
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);
相关文章推荐
- saiku安装方法总结
- Leetcode#2||Add Two Numbers
- malloc的使用
- 朝鲜战争:轰炸大小和岛
- Algorithms-63.Unique Paths II
- Linux进程管理 - PRI,nice,free,uname,netstat
- PostgreSQ 连接问题 FATAL: no pg_hba.conf entry for host
- caffe net 类代码分析
- Linux进程管理 - PRI,nice,free,uname,netstat
- 16-集合框架-03-常用对象API(集合框架-方法演示_1)
- 16-集合框架-04-常用对象API(集合框架-方法演示_2)
- 关于导航栏的六个小技巧
- 深入集合框架之ArrayList源码剖析
- 素材收集
- 在C下执行DOS命令
- unique() 去重函数
- JAVA 设计模式-工厂模式
- SYBASE bcp用法及例子
- Android开发博客推荐
- Matlab下地理热度图的绘制