• 技术文章 >后端开发 >C#.Net教程

    C#开发实例-订制屏幕截图工具(五)针对拖拽时闪烁卡顿的优化

    黄舟黄舟2017-03-14 13:27:42原创1378
    由于在实现的时候偷了个赖,没有使用主窗体的区域重绘技术,而是使用一个Label组件来展现截取的图片区域,所以在拖拽将截取区域变小或者是反向截图的时候,闪烁及卡顿的现象会比较严重,这里针对这两个问题对行一些针对性的优化。

    C#双缓冲解释:

    简单说就是当我们在进行画图操作时,系统并不是直接把内容呈现到屏幕上,而是先在内存中保存,然后一次性把结果输出来,如果没用双缓冲的话,你会发现在画图过程中屏幕会闪的很厉害,因为后台一直在刷新,而如果等用户画完之后再输出就不会出现这种情况,具体的做法,其实也就是先创建一个位图对象,然后把内容保存在里面,最后把图呈现出来。

    启用双缓冲

            public Form1()
            {
                InitializeComponent();
                // 解决窗口闪烁的问题
                SetStyle(ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
            }

    延时重绘

    当鼠标拖拽的时候,重绘会非常的频繁,这里使用时间来判断,减少重绘的次数。

    添加变量

            /// <summary>
            /// 记录鼠标上一次移动的时间
            /// </summary>
            private long lastMouseMoveTime = System.DateTime.Now.Ticks;

    在“UpdateCutInfoLabel”方法中添加重绘控制:

            /// <summary>
            /// 更新截图信息显示框,截图编辑工具框
            /// </summary>
            private void UpdateCutInfoLabel(UpdateUIMode updateUIMode) // UpdateUIMode updateUIMode = UpdateUIMode.None
            {
                //大于300毫秒或有组件显示或隐藏才进行重绘
                long mouseMoveTimeStep = System.DateTime.Now.Ticks - lastMouseMoveTime;
                if (mouseMoveTimeStep < 300 && updateUIMode == UpdateUIMode.None) { return; }
                lastMouseMoveTime = System.DateTime.Now.Ticks;
    
                if (this.lbl_CutImage.Visible || (updateUIMode & UpdateUIMode.ShowCutImage) != UpdateUIMode.None)
                {
                    this.lbl_CutImage.SetBounds(this.cutImageRect.Left, this.cutImageRect.Top, this.cutImageRect.Width, this.cutImageRect.Height, BoundsSpecified.All);
                    if (!this.lbl_CutImage.Visible)
                    {
                        this.lbl_CutImage.Show();
                    }
                }
            }

    经过测试发现,拖拽时闪烁及卡顿的现象明显改善。



    php入门到就业线上直播课:查看学习

    以上就是C#开发实例-订制屏幕截图工具(五)针对拖拽时闪烁卡顿的优化的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    快捷开发Web应用及小程序:点击使用

    支持亿级表,高并发,自动生成可视化后台。

    上一篇:C#开发实例-订制屏幕截图工具(四)基本截图功能实现代码 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• 解决asp.net中“从客户端中检测到有潜在危险的Request.Form值”的错误• asp.net 图片验证码的HtmlHelper• ASP.NET使用Ajax如何返回Json对象的方法具体介绍• 详解ASP.NET配置文件Web.config• C/C++深度分析
    1/1

    PHP中文网