代码例如以下:

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

自己定义控件 播放GIF动画相关推荐

  1. android 原理 组合控件_Android自定义控件进阶01-自定义控件开发套路与流程

    Android自定义控件进阶01-自定义控件开发套路与流程本章节为什么要叫进阶篇?(虽然讲的是基础内容),因为从本篇开始,将会逐渐揭开自定义View的神秘面纱,每一篇都将比上一篇内容更加深入,利用所学 ...

  2. git-osc自己定义控件之:CircleImageView

    git-osc自己定义控件之:CircleImageView 一.CircleImageView的使用 在项目中能够发现,用户的头像都是圆形的.感觉非常好奇,昨天最终发现了,原来是自定了一个Image ...

  3. 自己定义控件事实上非常easy1/6

    尊重原创转载请注明:From AigeStudio(http://blog.csdn.net/aigestudio)Power by Aige 侵权必究! 炮兵镇楼 上一节我们粗略地讲了下怎样去实现我 ...

  4. Android自己定义控件之应用程序首页轮播图

    如今基本上大多数的Android应用程序的首页都有轮播图.就是像下图这种(此图为转载的一篇博文中的图.拿来直接用了): 像这种组件我相信大多数的应用程序都会使用到,本文就是自己定义一个这种组件,能够动 ...

  5. 利用Animation控件制作帧动画过程详解

    利用Animation控件制作帧动画过程详解 前言 通过Animation控件来达到序列图的播放(素材和示例视频在文章末尾) 一.序列图 (此素材为已经分割好的序列图) 如若序列图在一张图片上,请参考 ...

  6. android 倒计时的控件,以动画的形式平滑的完成数字的过度

    原帖地址:http://gitonway.blog.163.com/blog/static/236894038201461894229615/ ※效果 ※简介 一个倒计时的控件,以动画的形式平滑的完成 ...

  7. 使用media player控件播放歌曲 winform

    使用media player控件播放歌曲 winform 播放格式 媒体播放控件.URL = 媒体路径 媒体路径可以是绝对路径 也可以是相对路径 媒体格式 视频 音频 功能演练 来一个按钮 编写事件代 ...

  8. c#winform演练 ktv项目 MediaPlayer控件播放音乐

    c#winform演练 ktv项目 MediaPlayer控件播放音乐 如何播放媒体 媒体控件.URL = 媒体文件的路径 路径说明 绝对路径 从盘符到目录到文件的完整路径 相对路径 项目的bin下有 ...

  9. media player 控件播放音乐与视频 0130 winform

    media player 控件播放音乐与视频 0130 winform 核心操作 播放器对象.URL = 媒体路径 播放音频 代码 效果 播放视频 代码 效果

最新文章

  1. 鸿蒙首个云网站,鸿蒙首个云平台服务全中国
  2. 点击页面空白处就关闭某个层是怎么做到的
  3. 【坑爹微信】微信支付相关问题解决
  4. .Net多线程文章收集
  5. java指定长度数组长度_Java声明数组时不能指定其长度
  6. Jenkins 插件安装方式全攻略
  7. VC中如何设置Socket的TCP/IP KeepAlive机制(MSDN)
  8. proteus 仿真软件
  9. 2020.8.2- 参加华数之星数学比赛 银奖(二等奖)
  10. 软件工程 - 个人博客系统 - 概要设计与详细设计文档
  11. 图像识别距离算法matlab
  12. mzy git学习,撤销修改(二)
  13. 单片机89C51最小系统讲解
  14. 使用Google colab的GPU运行resnet
  15. 包的概念与常见内置模块
  16. 阅读用户思维的思考。
  17. Android 通过adb禁止某个应用上网
  18. 拼多多商品id怎么查看 拼多多店铺ID怎样看
  19. 制作ESXI6.7启动盘
  20. 远程桌面怎么记住登录计算机,大神处理windows10电脑远程桌面自动记录登录密码的具体操作办法...

热门文章

  1. linux读取手机文件,linux at命令和batch从输入或指定文件读取命令
  2. UISlider-IOS开发
  3. 后端实现Excel 导入导出
  4. linux内核wifi驱动,基于2.6.35内核的SDIO-WiFi驱动移植
  5. 微信商家转账到零钱超过2000对敏感信息加密获取平台证书列表
  6. python复数的虚部怎么表达
  7. WebRTC与EasyRTC(视频聊天流程梳理)
  8. 8个免费UI图标网站,任何设计师都不该错过
  9. 致广大用户关于 iPhone 电池及性能的说明
  10. 《JavaScript程序设计》第2课:JS类型系统