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

    本实例全部文章目录


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

    C#双缓冲解释:

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

    启用双缓冲

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

    延时重绘

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

    添加变量:

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

    [csharp] view plaincopy在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. }  
    经过测试发现,拖拽时闪烁及卡顿的现象明显改善。
  • 相关阅读:
    回调函数
    zoj 2104
    zoj 1760
    ppt 图的基本算法 dfs
    zoj 2110 Tempter of the Bone
    优先队列 priority_queue 55 nyist
    STL的队列和栈简单使用
    poj 2246 递归 zoj 1094
    nyist 8 set的应用
    bailian 2694
  • 原文地址:https://www.cnblogs.com/AlexanderZhao/p/12878974.html
Copyright © 2011-2022 走看看