C#软件开发实例.私人订制自己的屏幕截图工具(五)针对拖拽时闪烁卡顿现象的优化

时间:2021-08-27 15:24:40

本实例全部文章目录

(一)功能概览

(二)创建项目、注册热键、显示截图主窗口

(三)托盘图标及菜单的实现

(四)基本截图功能实现

(五)针对拖拽时闪烁卡顿现象的优化

(六)添加配置管理功能

(七)添加放大镜的功能

(八)添加键盘操作截图的功能

(九)使用自定义光标,QQ截图时的光标

(十)在截图中包含鼠标指针形状


由于在实现的时候偷了个赖,没有使用主窗体的区域重绘技术,而是使用一个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();                }            }        }
经过测试发现,拖拽时闪烁及卡顿的现象明显改善。