重写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();
        }

时间: 2024-10-25 19:23:35

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

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

public class WindowOne:Form { public WindowOne() { InitializeCompnent(); } public void InitializeCompnent() { this.Width = 200; this.Height = 200; } //冲毁window 方法 private void ReDraw(Graphics g) { Random ran = new Random(); //Color ranColor = Color.F

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

我们继续之前的 Hypnosister 应用,当用户开始触摸的时候,圆形的颜色会改变. 首先,在 JXHypnosisView 头文件中声明一个属性,用来表示圆形的颜色. #import "JXHypnosisView.h" @interface JXHypnosisView () /** 颜色 */ @property (nonatomic,strong) UIColor * circleColor; @end @implementation JXHypnosisView - (in

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

同样是,重绘边框事件,win7系统显示正常,而xp系统却不显示,这是什么原因造成的呢? 于是,小编开始百度,不停的查找原因,通过一番查找,小编也意外的收获了一些内容: 例如:窗口的拖动,放大,缩小,等,都会重新触发paint重绘事件.那么,什么原因会影响重绘的不显示呢? 最后发现,页面上重写的CreateParams方法(原本是为了解决窗体闪烁的问题),影响了重绘边框的显示.

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

摘要 windows桌面应用程序都有标准的标题栏和边框,大部分程序也默认使用这些样式,一些对视觉效果要求较高的程序,如QQ, MSN,迅雷等聊天工具的样式则与传统的windows程序大不相同,其中迅雷还将他们的BOLT界面引擎开放,使得大家也可以创建类似迅雷一样的界面.那么这些软件的界面是怎样实现的呢,使用C#是否也可以实现类似界面? 重绘方式 常见的自定义标题栏和边框的方式有两种,一种是隐藏标题栏和边框(称为非客户区),然后在客户区(可以放置控件的空间)使用一些常用的控件和图片来表示边框,这种

窗体皮肤实现 - 重绘窗体非客户区(三)

窗体边框基本的绘制和控制完成,在第二篇中主要遗留的问题. 标题区域图标和按钮没绘制 缩放时客户区显示有问题 解决完下面的问题,皮肤处理基本完整.大致的效果GIF GIF中TShape的颜色表现有些问题,实际是正常的. 绘制标题区域内容 获取标题有效区域 绘制窗体图标 绘制按钮 绘制标题 标题区域主要考虑窗体是否在最大化状态,最大化后实际的标题绘制区域会有变化.可以通过 IsZoomed 或 GetWindowLong(Handle, GWL_STYLE) and WS_MAXIMIZE = WS

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

之前有学MFC的同学告诉我觉得Windows的控件重绘难以理解,就算重绘成功了还是有些地方不明白,我觉得可能很多人都有这样的问题,在这里我从Windows窗体的最基本原理来讲解,如果你有类似的疑惑希望这篇文章可以帮你解惑. 1.Windows窗体原理 首先,如果看过Win32 SDK编程的都知道Windows的三大核心系统:负责窗口对象产生和消息分发的USER模块,负责图像显示绘制的GDI模块,负责内存.进程.IO管理的KERNEL模块.试想象一下如何在一个像素阵列上产生窗口对象,其实就是使用G

窗体皮肤实现 - 重绘窗体非客户区(二)

第一个实现了基本处理.窗体边框的宽度有些肥大,需要进行瘦身. 实现:     1.改变外框线宽度 (WM_NCCALCSIZE)     2.改变外框样式 (WM_WINDOWPOSCHANGING) 通过 WM_NCCALCSIZE 消息可以实现目的. procedure WMNCCalcSize(var message: TWMNCCalcSize); message WM_NCCALCSIZE; procedure TTest.WMNCCalcSize(var message: TWMNC

winform重绘窗体成圆角(网上借鉴)

winform做圆角窗体: 1 //重绘窗体为圆角 2 private void frmMain_Paint(object sender, PaintEventArgs e) 3 { 4 #region 5 6 List<Point> list = new List<Point>(); 7 int width = this.Width; 8 int height = this.Height; 9 10 #region 四个圆角 11 12 //左上 13 list.Add(new

【REACT NATIVE 系列教程之六】重写SHOULDCOMPONENTUPDATE指定组件是否进行重绘

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2252.html 前几天,Himi 写练手项目时,遇到子更新父state中的某一个属性值,且对父进行重绘时,父包含的所有子组件都进行重绘 – -- 非常尴尬. 查阅了RN文档,终于在生命周期篇看到了想要的答案. 仔细看过RN关于生命周期篇的童鞋应该知道,就是它:shouldComponentUpdate 官方解释此函