动态图片显示控件----------WinForm控件开发系列
Posted tlmbem
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态图片显示控件----------WinForm控件开发系列相关的知识,希望对你有一定的参考价值。
PictureBox控件无法显示gif格式的图片,该控件利用.NET自带ImageAnimator类来处理图片的帧。
/// <summary> /// 动态图片显示控件 /// </summary> [ToolboxItem(true)] [DefaultProperty("Image")] [Description("动态图片显示控件")] public partial class AnimationImageExt : Control /// <summary> /// 图像的框架维度的属性 /// </summary> private FrameDimension frameDimension; private Image image = null; /// <summary> /// 要显示的图片 /// </summary> [Browsable(true)] [DefaultValue(null)] [Description("要显示的图片")] public Image Image get return this.image; set if (this.image == null && value == null) return; if (value == null)//清除图片 if (this.isAnimation) this.StopAnimation(); this.image = value; this.Invalidate(); else//加载图片 if (this.isAnimation) this.StopAnimation(); this.image = value; lock (this.image) this.isAnimation = ImageAnimator.CanAnimate(this.image); if (this.isAnimation)//gif图片 Guid[] guid = this.image.FrameDimensionsList; this.frameDimension = new FrameDimension(guid[0]); this.frameCount = this.image.GetFrameCount(this.frameDimension); this.currentFrame = 0; this.image.SelectActiveFrame(this.frameDimension, this.currentFrame); this.Invalidate(); this.StartAnimation(); else//普通图片 this.frameCount = 1; this.currentFrame = 0; this.Invalidate(); private bool isAnimation; /// <summary> /// 是否为动态图片 /// </summary> [Browsable(false)] [DefaultValue(false)] [Description("是否为动态图片")] public bool IsAnimation get return this.isAnimation; private int frameCount = 1; /// <summary> /// 图片总帧数。 /// </summary> [Browsable(false)] [DefaultValue(1)] [Description("图片总帧数")] public int FrameCount get return this.frameCount; private int currentFrame = 0; /// <summary> /// 当前播放的帧索引 /// </summary> [Browsable(false)] [DefaultValue(0)] [Description("当前播放的帧数")] public int CurrentFrame get return this.currentFrame; protected override Size DefaultSize get return new Size(100, 100); public AnimationImageExt() SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.OptimizedDoubleBuffer, true); SetStyle(ControlStyles.ResizeRedraw, true); SetStyle(ControlStyles.SupportsTransparentBackColor, true); InitializeComponent(); this.BackColor = Color.Transparent; protected override void OnPaint(PaintEventArgs e) base.OnPaint(e); if (this.image != null) Graphics g = e.Graphics; g.DrawImage(this.image, new Point(0, 0)); /// <summary> /// 开始循环播放动态图片 /// </summary> private void StartAnimation() lock (this.image) ImageAnimator.Animate(this.image, new EventHandler(this.FrameChanged)); /// <summary> /// 停止循环播放动态图片 /// </summary> private void StopAnimation() lock (this.image) ImageAnimator.StopAnimate(this.image, new EventHandler(this.FrameChanged)); this.resetProperty(); /// <summary> /// 重置图片信息 /// </summary> private void resetProperty() this.frameDimension = null; this.isAnimation = false; this.frameCount = 0; this.currentFrame = -1; /// <summary> /// 当前帧更改事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FrameChanged(object sender, EventArgs e) this.currentFrame = this.currentFrame + 1 >= this.frameCount ? 0 : this.currentFrame + 1; lock (this.image) this.image.SelectActiveFrame(this.frameDimension, this.currentFrame); this.Invalidate();
源码下载:动态图片显示控件.zip
以上是关于动态图片显示控件----------WinForm控件开发系列的主要内容,如果未能解决你的问题,请参考以下文章
wpf显示视频,image控件闪屏,使用winform控件实现