继承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 ...
随机推荐
- ListIterator add remove 使用注意
add方法示例 //在最前面添加 List<String> list1 = new LinkedList<String>(Arrays.asList(new String[] ...
- ASP.NET 中的返回按钮的实现【转】
返回上一页的这个东东在我们做项目的时候一般是用于填写完表单后确认的时候,有对原来输入的数据进行修改时用的,或者是因为网站为了方便浏览者而有心添加 的一个东东,一般这种功能的实现在ASP.net中都 ...
- 获取android手机联系人信息
package com.yarin.android.Examples_04_04; import android.app.Activity; import android.database.Curso ...
- redux-simple 简化版的redux
作为react的粉丝,当然要吐槽一下react组件通信问题.react的单向数据流是组件通信的一大阻碍,只允许父组件向子组件传值,子组件向父组件传值只能通过父组件向子组件传递回调函数实现.如果在深层次 ...
- OREACLE 数据库建表 添加判断表是否存在 不存在则新建
declare cnt number; begin ---查询要创建的表是否存在 select count(*)into cnt from user_tables where table_n ...
- 安装SQL Server 那些事儿
SQL版本: Microsoft SQL Server2008 R2 RTM - Express with Advanced Services 错误描述: System.Configuration.C ...
- iBox v2.0 发布,Web化仿iOS7界面/交互的JavaScirpt库
iBox2 是一个仿 iOS 7 界面/交互的 JavaScirpt 库,它运行在 webkit 内核的移动浏览器之上,依赖 iScroll5,帮助开发者构建更接近 iOS 体验的 WebApp. 伴 ...
- phpCMS V9 自定义添加 全局变量{SKIN_PATH}方法
前言:目前v9版本新增{js_path},{css_path},{img_path}三个全局变量,代替2008版本中{skin_path},样式图片脚本分开路径,确实达到了一定在后台管理方便的目的,但 ...
- WinForm------DateTime获取月第一天和最后一天取法
转载: http://blog.csdn.net/livening/article/details/6049341/ 代码: /// <summary> /// 取得某月的第一天 /// ...
- javaWeb实现使用邮箱邮件找回密码功能
JSP+Jmail+JavaBean 发邮件(转)2010-08-23 18:052007年04月14日 14:32/* * SendMail.java * * Created on 2007年3月3 ...