当前位置: 首页 > news >正文

自己定义控件 播放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);

 

相关文章:

  • WEB服务器-Nginx之虚拟主机、日志、认证及优化
  • day06 tar命令使用,vim简单操作以及linux开机过程
  • 面面观 | 使用dokcer 构建 mariadb 数据库
  • 3 个在 Linux 中永久并安全删除文件和目录的方法
  • 再会Java
  • 自动化运维工具SaltStack详细部署
  • PHP MySQL
  • 算法之选择排序算法
  • 我会采更多的雏菊
  • c语言中字符串函数的使用
  • 利用jquery编写加法运算验证码
  • 更改计算机名称,影响TFS之前映射的工作区 使用。
  • mysql/Java服务端对emoji的支持
  • 教你如何安装 Android L
  • 创意歌曲:我是一段死代码
  • 【Leetcode】101. 对称二叉树
  • canvas绘制圆角头像
  • co模块的前端实现
  • es的写入过程
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Java|序列化异常StreamCorruptedException的解决方法
  • Laravel 实践之路: 数据库迁移与数据填充
  • PAT A1120
  • PHP的Ev教程三(Periodic watcher)
  • Vue2.0 实现互斥
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • vue自定义指令实现v-tap插件
  • 工作中总结前端开发流程--vue项目
  • 理清楚Vue的结构
  • 力扣(LeetCode)965
  • 你真的知道 == 和 equals 的区别吗?
  • 配置 PM2 实现代码自动发布
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 原生 js 实现移动端 Touch 滑动反弹
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 自动记录MySQL慢查询快照脚本
  • hi-nginx-1.3.4编译安装
  • Spring第一个helloWorld
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ​一些不规范的GTID使用场景
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #1015 : KMP算法
  • #前后端分离# 头条发布系统
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (floyd+补集) poj 3275
  • (vue)页面文件上传获取:action地址
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)Sql Server 保留几位小数的两种做法
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .net打印*三角形