继承PictureBox显示GIF的自定义控件实现
处理GIF部分
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging; namespace AnimatePaint
{
/// <summary>
/// 处理gif动画
/// </summary>
public class AnimateImage
{
private Image _image;
private FrameDimension _frameDimension;
private bool _bCanAnimate;
private int _iFrameCount = 1, _iCurrentFrame = 0; public event EventHandler OnFrameChanged;
public Image Image { get { return _image;} }
public bool CanAnimate { get { return _bCanAnimate;} }
public int FrameCount { get { return _iFrameCount; } }
public int CurrentFrame { get { return _iCurrentFrame; } } private void FrameChanged(object sender, EventArgs e)
{
_iCurrentFrame = _iCurrentFrame + 1 >= _iFrameCount ? 0 : _iCurrentFrame + 1;
lock (_image)
{
_image.SelectActiveFrame(_frameDimension, _iCurrentFrame);
if (OnFrameChanged != null)
{
OnFrameChanged(sender, e);
}
}
} public AnimateImage(Image img)
{
_image = img;
lock (_image)
{
_bCanAnimate = ImageAnimator.CanAnimate(_image);
if (_bCanAnimate)
{
Guid[] guids = _image.FrameDimensionsList;
_frameDimension = new FrameDimension(guids[0]);
_iFrameCount = _image.GetFrameCount(_frameDimension);
}
}
} public void Play()
{
if (_bCanAnimate)
{
lock (_image)
{
ImageAnimator.Animate(_image, new EventHandler(FrameChanged));
}
}
} public void Stop()
{
if (_bCanAnimate)
{
lock (_image)
{
ImageAnimator.StopAnimate(_image, new EventHandler(FrameChanged));
}
}
} public void Reset()
{
if (_bCanAnimate)
{
ImageAnimator.StopAnimate(_image, new EventHandler(FrameChanged));
lock (_image)
{
_image.SelectActiveFrame(_frameDimension, 0);
_iCurrentFrame = 0;
}
}
} }
}
自定义控件部分
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; namespace AnimatePicture
{
public partial class AnimatePictureBox : PictureBox
{
private AnimatePaint.AnimateImage _animateimg; private void image_OnFrameChanged(object sender, EventArgs e)
{
Invalidate();
} public AnimatePictureBox()
{
SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
} public void LoadGIF(string strFileName)
{
_animateimg = new AnimatePaint.AnimateImage(Image.FromFile(strFileName));
_animateimg.OnFrameChanged += new EventHandler(image_OnFrameChanged);
_animateimg.Play();
} protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
if (_animateimg != null)
if (_animateimg.Image != null)
lock (_animateimg.Image)
{
pe.Graphics.DrawImage(_animateimg.Image, new Point(0, 0));
}
}
}
}
继承PictureBox显示GIF的自定义控件实现的更多相关文章
- EmguCV控件Emgu.CV.UI.ImageBox及C# picturebox显示图片连续刷新出现闪烁问题
在上一篇里,EmguCV(OpenCV)实现高效显示汉字及叠加 实现了视频叠加及显示,但存在问题,就是 Emgu.CV.UI.ImageBox及C# picturebox显示图片时都会出现闪烁,尤其 ...
- C#继承基本控件实现自定义控件
C#继承基本控件实现自定义控件 摘自:http://www.cnblogs.com/greatverve/archive/2012/04/25/user-control-inherit.html 自定 ...
- Android单独继承View类来实现自定义控件
一个单独继承view类来实现自定义控件,在该方法中,需要重写ondraw方法来绘制自己所需要的控件,下面也以一个简单的例子来说明如何实现自定义控件.该方法可以实现所需要的所有的自定义控件. 属性文件中 ...
- 关于C# winform中使用pictureBox显示大红叉的原因
pictureBox的关于image的属性有三 个,InitalImage,Image,ErrorImage分别表示picturebox的默认初始图片,当前可以设置的图片和出错之后默认显示的图 片,而 ...
- C#继承基本控件实现自定义控件 (转帖)
自定义控件分三类: 1.复合控件:基本控件组合而成.继承自UserControl 2.扩展控件:继承基本控件,扩展一些属性与事件.比如继承Button 3.自定义控件:直接继承自Control 第一种 ...
- winfrom datagridview ,picturebox,显示图片,以及删除问题
private void write_listview(DataSet ds) { DataTable dt = ds.Tables[0]; ...
- winform下 PictureBox 显示网络图片
Image pic = new Image.FromStream(WebRequest.Create("http://x.com/x.jpg").GetResponse().Get ...
- winform中让pictureBox 显示的图片旋转
img.RotateFlip(RotateFlipType.Rotate90FlipNone);顺时针旋转90度 RotateFlipType.Rotate90FlipNone 逆时针旋转90度 Ro ...
- c#用picturebox显示多页TIF
//引用 using System.Drawing; using System.Drawing.Imaging; //以下是方法 private Bitmap myImage = null; priv ...
随机推荐
- 95秀-ViewPager 使用实例
Activity的样式 <style name="under_live_indicator" parent="android:Theme.NoTitleBa ...
- php和java静态变量用途的思考
静态变量有哪些用途? 比如创建单例对象. 统计访问次数.数量等等. 多线路和进程中可能会使用. 深入理解补充.... PHP 单例模式解析和实战 php设计模式——单例模式 php static 与 ...
- CSS3 背景
CSS3包含多个新的背景属性,他们提供了对背景更强大的控制. 本章将学到一下背景属性: background-size background-origin 你也将学到如何使用多重背景图片. 浏览器支持 ...
- Core Data 学习简单整理01
Core Data是苹果针对Mac和iOS平台开发的一个框架, 通过CoreData可以在本地生成数据库sqlite,提供了ORM的功能,将对象和数据模型相互转换 . 通过Core Data管理和操作 ...
- 如何安装Git到MAC OS X
这里介绍两种方式:一,使用Git command-line二,使用GUI工具SourceTree,功能很强大,很方便 在进行安装前,要说一下,Git和SVN一样,都需要创建一个服务器的,他们都可以创建 ...
- windows下安装apache笔记
之前一直是用别人配置好的apache环境来开放,今天想自己安装配置下windows下的apache(nginx+fastcgi).mysql.php等. 虽然大部分时间是在搞前端开发,偶尔也要搞服务端 ...
- 武汉科技大学ACM :1002: 零起点学算法66——反话连篇
Problem Description 把输入的字符按照反着顺序输出 Input 多组测试数据 每组一行(每组数据不超过200个字符) Output 按照输入的顺序反着输出各个字符 Sample I ...
- MySQL单列索引和组合索引的区别介绍
MySQL单列索引和组合索引的区别介绍 作者:佚名出处:IT专家网2010-11-22 13:05 MySQL单列索引是我们使用MySQL数据库中经常会见到的,MySQL单列索引和组合索引的区别可能有 ...
- 博客迁移至http://www.maxzhang.com,欢迎访问!
博客迁移至http://www.maxzhang.com,欢迎访问!
- 《javascript权威指南》读书笔记 -part2
我真的很佩服副院长~他是一个很有耐心 极其细致的人 工作态度严谨 代码简洁风格统一~再乱遭遭的代码只要经过他的手就会变的很漂亮 羡煞我也~ 不说废话了 还是乖乖看书吧~maybe可能也许的某一天 ...