本文摘自PHP中文网,作者黄舟,侵删。
由于在实现的时候偷了个赖,没有使用主窗体的区域重绘技术,而是使用一个Label组件来展现截取的图片区域,所以在拖拽将截取区域变小或者是反向截图的时候,闪烁及卡顿的现象会比较严重,这里针对这两个问题对行一些针对性的优化。C#双缓冲解释:
简单说就是当我们在进行画图操作时,系统并不是直接把内容呈现到屏幕上,而是先在内存中保存,然后一次性把结果输出来,如果没用双缓冲的话,你会发现在画图过程中屏幕会闪的很厉害,因为后台一直在刷新,而如果等用户画完之后再输出就不会出现这种情况,具体的做法,其实也就是先创建一个位图对象,然后把内容保存在里面,最后把图呈现出来。
启用双缓冲
1 2 3 4 5 6 | public Form1()
{
InitializeComponent();
SetStyle(ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true );
}
|
延时重绘
当鼠标拖拽的时候,重绘会非常的频繁,这里使用时间来判断,减少重绘的次数。
添加变量:
1 2 3 4 | /// <summary>
/// 记录鼠标上一次移动的时间
/// </summary>
private long lastMouseMoveTime = System.DateTime.Now.Ticks;
|
在“UpdateCutInfoLabel”方法中添加重绘控制:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /// <summary>
/// 更新截图信息显示框,截图编辑工具框
/// </summary>
private void UpdateCutInfoLabel(UpdateUIMode updateUIMode)
{
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();
}
}
}
|
经过测试发现,拖拽时闪烁及卡顿的现象明显改善。
以上就是C#开发实例-订制屏幕截图工具(五)针对拖拽时闪烁卡顿的优化的详细内容!
相关阅读 >>
C# 创建mdi窗体(图文)
C# 应用npoi获取excel中的图片,保存至本地的算法的图文代码实例详解
C#获取listview鼠标下的item案例
C#控制台应用程序中如何输出彩色字体的详细介绍
C#获取本机ip搜集整理7种方法的示例代码分享
asp.net实现分页(非控件,输出html代码)
详细介绍C#中out和ref的区别(图文)
浅析C#中的“==”和equals的示例代码
C#中manualresetevent使用方法详解
C#高级编程(三)-对象和类型详解
更多相关阅读请进入《C#》频道 >>
清华大学出版社
作者:[美]克里斯琴·内格尔(Christian Nagel)著。出版时间:2019年3月。
转载请注明出处:木庄网络博客 » C#开发实例-订制屏幕截图工具(五)针对拖拽时闪烁卡顿的优化