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

本实例全部文章目录


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

C#双缓冲解释:

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

启用双缓冲

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public Form1()  
  2. {  
  3.     InitializeComponent();  
  4.     // 解决窗口闪烁的问题  
  5.     SetStyle(ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);  
  6. }  

延时重绘

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

添加变量:

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /// <summary>  
  2. /// 记录鼠标上一次移动的时间  
  3. /// </summary>  
  4. private long lastMouseMoveTime = System.DateTime.Now.Ticks;  
在“UpdateCutInfoLabel”方法中添加重绘控制:

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /// <summary>  
  2. /// 更新截图信息显示框,截图编辑工具框  
  3. /// </summary>  
  4. private void UpdateCutInfoLabel(UpdateUIMode updateUIMode) // UpdateUIMode updateUIMode = UpdateUIMode.None  
  5. {  
  6.     //大于300毫秒或有组件显示或隐藏才进行重绘  
  7.     long mouseMoveTimeStep = System.DateTime.Now.Ticks - lastMouseMoveTime;  
  8.     if (mouseMoveTimeStep < 300 && updateUIMode == UpdateUIMode.None) { return; }  
  9.     lastMouseMoveTime = System.DateTime.Now.Ticks;  
  10.   
  11.     if (this.lbl_CutImage.Visible || (updateUIMode & UpdateUIMode.ShowCutImage) != UpdateUIMode.None)  
  12.     {  
  13.         this.lbl_CutImage.SetBounds(this.cutImageRect.Left, this.cutImageRect.Top, this.cutImageRect.Width, this.cutImageRect.Height, BoundsSpecified.All);  
  14.         if (!this.lbl_CutImage.Visible)  
  15.         {  
  16.             this.lbl_CutImage.Show();  
  17.         }  
  18.     }  
  19. }  
经过测试发现,拖拽时闪烁及卡顿的现象明显改善。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值