/// <summary>
    /// 可显示Gif  的窗体
    /// </summary>
    public class WinGif : Form
    {
        private Image _img = null;
        public Image Img
        {
            get { return _img; }
            set { _img = value; }
        }

        private EventHandler evtHandler = null;
        public WinGif(Image img)
        {
            //初始化设置
            evtHandler = new EventHandler(OnImageAnimate);
            this.Img = img;
            ;
            ;

            //开始动画
            BeginAnimate();
        }

        //委托所关联的方法
        private void OnImageAnimate(Object sender, EventArgs e)
        {
            //该方法,只是使得当前控件重绘,调用OnPaint()
            this.Invalidate();
        }
        //设置开始动画
        public void BeginAnimate()
        {
            if (_img != null)
            {
                //当gif动画每隔一定时间后,都会变换一帧,那么就会触发一事件
                //该方法就是将当前image每变换一帧时,都会调用当前这个委托所关联的方法
                ImageAnimator.Animate(_img,evtHandler);
            }
        }
        //关闭显示动画,该方法可以在窗口关闭或者某事件触发时,已停止渲染当前gif动画
        public void StopAnimate()
        {
            _img = null;
            ImageAnimator.StopAnimate(_img,evtHandler);
        }
        /// <summary>
        /// 重载的当前winform 的OnPaint方法,当界面被冲重绘制时显示gif的某一帧
        /// </summary>
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            if (_img != null)
            {
                //获取当前gif动画下一步要渲染的帧
                UpdateImage();
                //将获得的当前gif动画需要渲染的帧显示在界面的某个位置
                e.Graphics.DrawImage(_img,,,_img.Width,_img.Height));
            }
        }
        //获得当前gif动画的下一步需要渲染的帧,当下一步任何对当前gif动画的操作都是对该帧进行操作
        private void UpdateImage()
        {
            ImageAnimator.UpdateFrames(_img);
        }
    }

使用和结果显示:

        private void button1_Click(object sender, EventArgs e)
        {

            string file = Application.StartupPath + "\\2.gif";
            Image img = System.Drawing.Image.FromFile(file);

            WinGif gif = new WinGif(img);

            gif.Show();
        }

重写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. iOS - 布局重绘机制相关方法的研究

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

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

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

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

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

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

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

  7. 重绘Winform窗体

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

  8. 【转】【C#】C#重绘windows窗体标题栏和边框

    摘要 windows桌面应用程序都有标准的标题栏和边框,大部分程序也默认使用这些样式,一些对视觉效果要求较高的程序,如QQ, MSN,迅雷等聊天工具的样式则与传统的windows程序大不相同,其中迅雷 ...

  9. 深入Windows窗体原理及控件重绘技巧

    之前有学MFC的同学告诉我觉得Windows的控件重绘难以理解,就算重绘成功了还是有些地方不明白,我觉得可能很多人都有这样的问题,在这里我从Windows窗体的最基本原理来讲解,如果你有类似的疑惑希望 ...

随机推荐

  1. jQuery手机端上拉刷新下拉加载更多页面

    基于jQuery手机端上拉下拉刷新页面代码.这是一款类似QQ空间客户端或者微信下拉刷新页面特效代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div id=" ...

  2. meteor 实现 微信分享

    Template.hello.events({ 'click button': function () { // increment the counter when button is clicke ...

  3. LuaFileSystem学习心得

    LuaFileSystem(简称lfs)是一个用于lua进行文件訪问的库,和Lua版本号同步.且是跨平台的,在为lua安装lfs之前须要先安装luarocks, luarocks是一个用于安装lua库 ...

  4. UML 结构图之类图 总结

    [注] 本文不是类图的基础教程, 只是类图的图形总结. 学习UML图形 推荐阅读<UML参考手册>第2版. http://www.umlchina.com/ 推荐微软的开发软件设计模型 h ...

  5. [HDU] 2795 Billboard [线段树区间求最值]

    Billboard Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. 【转】Android内存机制分析1——了解Android堆和栈

    昨天用Gallery做了一个图片浏览选择开机画面的功能,当我加载的图片多了就出现OOM问题.以前也出现过这个问题,那时候并没有深究.这次打算好好分析一下Android的内存机制. 因为我以前是做VC+ ...

  7. Python 第一课笔记

    1.Hello World程序的两种方法     在windows下执行 1.编辑器里输入,不用编译 print("Hello World!") 直接就可以运行      2.可以 ...

  8. Fireworks快捷键大全和ps查看切图的坐标颜色

    记住后方便了许多

  9. stl map容器 学习

    #include<map> 1.map的声明: map<string,int>map_1; map_1 就是一个string对int的映射. 2.map的用法(映射): map ...

  10. 8.Java 加解密技术系列之 PBE

    Java 加解密技术系列之 PBE 序 概念 原理 代码实现 结束语 序 前 边的几篇文章,已经讲了几个对称加密的算法了,今天这篇文章再介绍最后一种对称加密算法 — — PBE,这种加密算法,对我的认 ...