zoukankan      html  css  js  c++  java
  • 自己定义控件 播放GIF动画

    代码例如以下:

    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;
    //debug 引用
    using System.Diagnostics;
    
    namespace CYSoft.TS.UI.StudentInfo
    {
        public partial class PicboxPlayGif : UserControl
        {
            private Image m_imgImage = null;
            private EventHandler m_evthdlAnimator = null;     
            public PicboxPlayGif()
            {
                InitializeComponent();
                this.SetStyle(ControlStyles.UserPaint, true);
                this.SetStyle(ControlStyles.DoubleBuffer, true);
                this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
                //为托付关联一个处理方法
                m_evthdlAnimator = new EventHandler(OnImageAnimate);
                Debug.Assert(m_evthdlAnimator != null);
            
            }
    
            private bool isPicboxFit = true;
            [Description("pic 的宽和高和 真实gif的宽和高 是否要一致 ture=一致  false=不一致 ")]
            public bool _isPicboxFit {
                get { return isPicboxFit; }
                set { this.isPicboxFit = value;
                this.Invalidate();
                }
            }
    
            private int picWidth = 0;
            [Description("图片宽度(假设isPicboxFit=true 这个參数无意义)")]
            public int _picWidth {
                get { return picWidth; }
                set {
                    if (!isPicboxFit) {
                        if(value!=0)
                        {
                        this.picWidth = value;
                        this.Invalidate();
                        }
                    }
                }
            }
    
            private int picHeight = 0;
           [Description("图片高度(假设isPicboxFit=true 这个參数无意义)")]
            public int _picHeight {
                get { return picHeight; }
                set {
                    if (!isPicboxFit)
                    {
                        if (value != 0)
                        {
                            this.picHeight = value;
                            this.Invalidate();
                        }
                    }
                }
            }
    
            private string imagePath = "C:\Users\Thinkpad\Desktop\素材\WaitLoading.gif";
            [Description("图片路径")]
            public string _imagePath {
                get { return imagePath; }
                set { this.imagePath = value;
                this.Invalidate();
                }
            }
    
            private AA imageLayout = AA.Stretch;
            [Description("图片在picbox中的显示方式")]
            public AA _imageLayout {
                get { return imageLayout; }
                set {
                    this.imageLayout = value;
                    this.Invalidate();
                }
            }
    
            public enum AA { 
               None,
                Title,
                Center,
                Stretch,
                Zoom
            }
    
    
            protected override void OnPaint(PaintEventArgs e)
            {
                base.OnPaint(e);
                if (m_imgImage != null)
                {
                    UpdateImage();
                    //不用picbox 直接输出
                   // e.Graphics.DrawImage(m_imgImage, new Rectangle(100, 100, m_imgImage.Width, m_imgImage.Height));
                   
                    //image 格式
                    if(imageLayout==AA.None)
                    {
                        pic.BackgroundImageLayout = ImageLayout.None;
                    }else if(imageLayout==AA.Title)
                    {
                        pic.BackgroundImageLayout = ImageLayout.Tile;
                    }
                    else if (imageLayout == AA.Stretch)
                    {
                        pic.BackgroundImageLayout = ImageLayout.Stretch;
                    }
                    else if (imageLayout == AA.Zoom)
                    {
                        pic.BackgroundImageLayout = ImageLayout.Zoom;
                    }
                    else {
                        pic.BackgroundImageLayout = ImageLayout.Center;
                    }
    
                    pic.BackgroundImage = m_imgImage;
                }
            }
    
            protected override void OnLoad(EventArgs e)
            {
                base.OnLoad(e);
                //载入图片
                m_imgImage = Image.FromFile(imagePath);
                if (isPicboxFit)
                {
                    this.Width = m_imgImage.Width;
                    this.Height = m_imgImage.Height;
                }
                else
                {
                    this.Width = picWidth;
                    this.Height = picHeight;
                }
    
                //pic设置
                pic.BackColor = Color.Transparent;
                pic.Dock = DockStyle.Fill;
    
                //BeginAnimate();
            }
    
            /// <summary>
            /// 播放或停止 动画
            /// </summary>
            /// <param name="isPlay">true=播放 false=停止</param>
            public void _PlayOrEndGif(bool isPlay) {
                if (isPlay)
                {                
                    BeginAnimate();
                }
                else {
                    if (m_imgImage != null)
                    {
                        StopAnimate();
                        //m_imgImage = null;
                    }
                }
            }
    
            //開始动画
            private void BeginAnimate()
            {
               if (m_imgImage == null)
                    return;
             
               if (ImageAnimator.CanAnimate(m_imgImage))
               {
                   //当gif动画每隔一定时间后,都会变换一帧。那么就会触发一事件,
                   //该方法就是将当前image每变换一帧时,都会调用当前这个托付所关联的方法。
                    ImageAnimator.Animate(m_imgImage,m_evthdlAnimator);
               }
            }
     
            //结束动画
            private void StopAnimate()
            {
                if (m_imgImage == null)
                    return;
     
                if (ImageAnimator.CanAnimate(m_imgImage))
                {
                    ImageAnimator.StopAnimate(m_imgImage,m_evthdlAnimator);
                }
            }
     
            //切换图片(帧图片)
            private void UpdateImage()
            {
                if (m_imgImage == null)
                    return;
     
                if (ImageAnimator.CanAnimate(m_imgImage))
                {
                    //获得当前gif动画的下一步须要渲染的帧。当下一步不论什么对当前gif动画的操作都是对该帧进行操作)
                    ImageAnimator.UpdateFrames(m_imgImage);
                }
            }
    
            
            private void OnImageAnimate(Object sender,EventArgs e)
            {
                //使得当前这个winfor重绘,然后去调用该winform的OnPaint()方法进行重绘
                this.Invalidate(); 
            }
    
            private void PicboxPlayGif_Load(object sender, EventArgs e)
            {
    
            }
        }
    }
    


    调用:

    上图右边是属性设置:

    播放gif:

    picboxPlayGif2._PlayOrEndGif(true);

    停止gif:

    picboxPlayGif2._PlayOrEndGif(true);

  • 相关阅读:
    课堂练习-找水王绪
    输入法评估
    课堂练习-找水王
    课堂练习—电梯调度
    第一阶段冲刺总结
    《你的灯亮着吗》阅读笔记Ⅱ
    《你的灯亮着吗》阅读笔记Ⅰ
    软件工程——寻找水桶
    软件工程——寻找水王
    软件工程——典型用户
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/6902608.html
Copyright © 2011-2022 走看看