zoukankan      html  css  js  c++  java
  • 继承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));
                        }
            }
        }
    }
    


  • 相关阅读:
    08 linux文件检索和编辑
    Mybatis3详解(二十)——Mybatis中使用的9种设计模式(转)
    Mybatis3详解(十八)——Mybatis运行原理之Mapper接口的动态代理过程
    Mybatis3详解(十七)——Mybatis运行原理之SqlSession的构建过程
    Mybatis3详解(十六)——Mybatis运行原理之SqlSessionFactory的构建过程
    Mybatis3详解(十五)——Mybatis整合Spring框架
    Mybatis3详解(十四)——Mybatis的分页
    Mybatis3详解(十三)——Mybatis逆向工程
    Mybatis3详解(十二)——Mybatis缓存
    Mybatis3详解(十一)——延迟加载
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3174337.html
Copyright © 2011-2022 走看看