继承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 ...
随机推荐
- C# 面向对象 , 类与对象
一,类的字段 类的字段, 就是类里面的 数据. 二,类的方法 1 , 函数的重载 , 如何判断: 是由两个或多个同名函数组成的,但是函数要有不同的参数.或个数.(参数 是函数的输入的东西) shu ...
- hdu 5105
题意: y=|a*x^3+b*x^2+c*x+d| 求y的最大值? 题目是bc上的,之前写的时候,没考虑0的情况(太笨了).... 水题吧.... AC代码: #include <iost ...
- css position 应用(absolute和relative用法)
1.absolute(绝对定位) absolute是生成觉对定位的元素,脱离了文本流(即在文档中已经不占据位置),参照浏览器的左上角通过top,right,bottom,left(简称TRBL) 定位 ...
- 第二章 控件架构与自定义控件详解 + ListView使用技巧 + Scroll分析
1.Android控件架构下图是UI界面架构图,每个Activity都有一个Window对象,通常是由PhoneWindow类来实现的.PhoneWindow将DecorView作为整个应用窗口的根V ...
- HTML中常用鼠标样式
语法:cursor : auto | all-scroll | col-resize| crosshair | default | hand | move | help | no-drop | not ...
- SQL函数:用于将小写的数值翻译成大写的字符串
--功能: 用于将小写的数值翻译成大写的字符串(支持到分,即小数点后两位) --入口参数:@decNum------数字型变量 --返回:字符串 --举例:select db ...
- Swift - 41 - swift1.2新特性(1)
更简洁的if-let import UIKit func attack(name: String, enemyName: String, weapon: String) { print("\ ...
- angularjs自定义日期过滤器,如:周日(前天 21:24)
今天给大家分享一个,我在项目中自定义的一个日期过滤器.具体过滤出来的效果可参看下图: 用法: {{ time | timeFilter }} filter: App.filter('timeFilte ...
- 武汉科技大学ACM :1003: A+B for Input-Output Practice (III)
Problem Description Your task is to Calculate a + b. Input Input contains multiple test cases. Each ...
- Netty 5 传送大文件的方法
Netty 5 提供了 一个ChunkedWriterHandler 来传送大文件,发送端如下: 添加chunedwriterhandler: ChannelPipeline p = ...; p.a ...