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中文网其它相关文章!
前端(VUE)零基础到就业课程:点击学习
快捷开发Web应用及小程序:点击使用
![](http://m.sbmmt.com/img/upload/article/000/000/020/633501a29d313483.png)