1. /// <summary>
  2. /// 可显示Gif 的窗体
  3. /// </summary>
  4. public class WinGif : Form
  5. {
  6. private Image _img = null;
  7. public Image Img
  8. {
  9. get { return _img; }
  10. set { _img = value; }
  11. }
  12.  
  13. private EventHandler evtHandler = null;
  14. public WinGif(Image img)
  15. {
  16. //初始化设置
  17. evtHandler = new EventHandler(OnImageAnimate);
  18. this.Img = img;
  19. this.Width = _img.Width+;
  20. this.Height = _img.Height + ;
  21.  
  22. //开始动画
  23. BeginAnimate();
  24. }
  25.  
  26. //委托所关联的方法
  27. private void OnImageAnimate(Object sender, EventArgs e)
  28. {
  29. //该方法,只是使得当前控件重绘,调用OnPaint()
  30. this.Invalidate();
  31. }
  32. //设置开始动画
  33. public void BeginAnimate()
  34. {
  35. if (_img != null)
  36. {
  37. //当gif动画每隔一定时间后,都会变换一帧,那么就会触发一事件
  38. //该方法就是将当前image每变换一帧时,都会调用当前这个委托所关联的方法
  39. ImageAnimator.Animate(_img,evtHandler);
  40. }
  41. }
  42. //关闭显示动画,该方法可以在窗口关闭或者某事件触发时,已停止渲染当前gif动画
  43. public void StopAnimate()
  44. {
  45. _img = null;
  46. ImageAnimator.StopAnimate(_img,evtHandler);
  47. }
  48. /// <summary>
  49. /// 重载的当前winform 的OnPaint方法,当界面被冲重绘制时显示gif的某一帧
  50. /// </summary>
  51. protected override void OnPaint(PaintEventArgs e)
  52. {
  53. base.OnPaint(e);
  54. if (_img != null)
  55. {
  56. //获取当前gif动画下一步要渲染的帧
  57. UpdateImage();
  58. //将获得的当前gif动画需要渲染的帧显示在界面的某个位置
  59. e.Graphics.DrawImage(_img,new Rectangle(,,_img.Width,_img.Height));
  60. }
  61. }
  62. //获得当前gif动画的下一步需要渲染的帧,当下一步任何对当前gif动画的操作都是对该帧进行操作
  63. private void UpdateImage()
  64. {
  65. ImageAnimator.UpdateFrames(_img);
  66. }
  67. }

使用和结果显示:

  1. private void button1_Click(object sender, EventArgs e)
  2. {
  3.  
  4. string file = Application.StartupPath + "\\2.gif";
  5. Image img = System.Drawing.Image.FromFile(file);
  6.  
  7. WinGif gif = new WinGif(img);
  8.  
  9. gif.Show();
  10. }

重写OnPaint事件对窗体重绘(显示gif动画) 实例2的更多相关文章

  1. 重写OnPaint事件对窗体重绘 实例1

    public class WindowOne:Form { public WindowOne() { InitializeCompnent(); } public void InitializeCom ...

  2. 窗体背景的绘制(Windows窗体每次都会重绘其窗体背景,所以我们可以通过拦截窗体重绘背景的消息(WM_ERASEBKGND),并自定义方法来实现重绘窗体背景)

    核心思想:由于Windows窗体每次都会重绘其窗体背景,所以我们可以通过拦截窗体重绘背景的消息(WM_ERASEBKGND),并自定义方法来实现重绘窗体背景.通过TImage组件也可以实现,但是重写W ...

  3. winform重绘控件边框

    首先添加一个用户控件 对于重绘边框有三个需要考虑的东西 1:是否显示边框 2:边框颜色 3:边框宽度 所以定义三个私有变量 /// <summary>/// 是否显示边框/// </ ...

  4. iOS - 布局重绘机制相关方法的研究

    iOS View布局重绘机制相关方法 布局 - (void)layoutSubviews - (void)layoutIfNeeded- (void)setNeedsLayout —————————— ...

  5. iOS 视图:重绘与UIScrollView(内容根据iOS编程编写)

    我们继续之前的 Hypnosister 应用,当用户开始触摸的时候,圆形的颜色会改变. 首先,在 JXHypnosisView 头文件中声明一个属性,用来表示圆形的颜色. #import " ...

  6. 【JS】313- 复习 回流和重绘

    点击上方"前端自习课"关注,学习起来~ 原文地址:我不是陈纪庚 segmentfault.com/a/1190000017329980 回流和重绘可以说是每一个web开发者都经常听 ...

  7. xp系统重绘边框线不显示(首次加载没有触发paint事件)

    同样是,重绘边框事件,win7系统显示正常,而xp系统却不显示,这是什么原因造成的呢? 于是,小编开始百度,不停的查找原因,通过一番查找,小编也意外的收获了一些内容: 例如:窗口的拖动,放大,缩小,等 ...

  8. 重绘Winform窗体

    本文转载自:http://www.cnblogs.com/encoding/p/5603080.html 按照惯例,先来几张样例图(注:为了展示窗口阴影效果,截图范围向外扩展了些,各位凭想象吧). 还 ...

  9. 玩转控件:重写/重绘Dev中MessageBox弹窗控件

    很久没有更新博客了,本想着直接发一篇<手撕ERP>系列,从控件重写.重绘,到框架搭建,再到部分模块实现+业务的.但是每次动手的时候,都觉得难以下手.直接从数据库设计开始吧,模块设计还没定下 ...

随机推荐

  1. C#学习笔记之结构体

    1.概述 结构是一种与类相似的数据类型,不过它较类更为轻量,一般适用于表示类似Point.Rectangle.Color的对象.基本上结构能办到的类全都能办到,但在某些情况下使用结构更为合适,后面会有 ...

  2. nyoj组合数

    算法:深搜 描述 找出从自然数1.2.... .n(0<n<10)中任取r(0<r<=n)个数的所有组合. 输入输入n.r.输出按特定顺序输出所有组合. 特定顺序:每一个组合中 ...

  3. 【回忆1314】回忆之placeholder

    直接看效果点这里 HTML <!DOCTYPE html> <html> <head lang="zh-CN"> <meta charse ...

  4. python中os.walk()遍历目录中所有文件

    之前一直用判断目录和文件的递归方法来获取一个目录下的所有文件,后来发现python里面已经写好了这个函数,不需要自己递归获取了,记录下os.walk()函数的用法 目的:获取path下所有文件,返回由 ...

  5. MobileProject

    iOS开源项目MobileProject功能点介绍 一:MobileProject简介 MobileProject项目是一个以MVC模式搭建的开源功能集合,基于Objective-C上面进行编写,意在 ...

  6. 由于 UNION ALL Chinese_PRC_CI_AS”之间的排序规则冲突,值的排序规则未经解析

    由于不同的表之间的排序规则不一样,在归并集合的 时候会出现排序问题. 只要在查询的列后面 声明结果列的排序规则保持一致即可:  SELECT b0.[CardCode] collate SQL_Lat ...

  7. BZOJ1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚

    1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 414  Solved: ...

  8. BZOJ2768: [JLOI2010]冠军调查

    2768: [JLOI2010]冠军调查 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 484  Solved: 332[Submit][Status ...

  9. DateTime字段控件值显示短格式的做法

    后台取dateTime格式,前台格式化就好了 <input type="text" name="txtPartyTime" id="txtPar ...

  10. (一)一个简单的Web服务器

    万丈高楼平地起,首先我们必须了解 超文本传输协议(HTTP) 以后才能够比较清晰的明白web服务器是怎么回事. 1. 浅析Http协议 HTTP是一种协议,允许web服务器和浏览器通过互联网进行来发送 ...