• 重写OnPaint事件对窗体重绘(显示gif动画) 实例2


        /// <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;
                this.Width = _img.Width+100;
                this.Height = _img.Height + 100;
    
                //开始动画
                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,new Rectangle(0,0,_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();
            }

  • 相关阅读:
    黑马程序员——网络编程
    黑马程序员——File类
    黑马程序员——java IO流
    黑马程序员——java集合框架(Map和工具类)
    黑马程序员——java集合框架之List,Set
    黑马程序员——对线程的一些总结
    黑马程序员——创建线程的两种方式
    java对象的初始化过程
    黑马程序员——java环境变量path和classpath
    JavaScriptoo:以更好的方式选择JS库
  • 原文地址:https://www.cnblogs.com/tianma3798/p/3960637.html
Copyright © 2020-2023  润新知