由於在實現的時候偷了個賴,沒有使用主窗體的區域重繪技術,而是使用一個Label組件來展現截取的圖片區域,所以在拖曳將截取區域變小或是反向截圖的時候,閃爍及卡頓的現象會比較嚴重,這裡針對這兩個問題對行一些針對性的最佳化。
#簡單來說就是當我們在進行畫圖操作時,系統並不是直接把內容呈現到螢幕上,而是先在記憶體中儲存,然後一次性把結果輸出來,如果沒用雙緩衝的話,你會發現在畫圖過程中螢幕會閃的很厲害,因為後台一直在刷新,而如果等使用者畫完之後再輸出就不會出現這種情況,具體的做法,其實也就是先創建一個點陣圖物件,然後把內容保存在裡面,最後把圖呈現出來。
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(); } } }
經過測試發現,拖曳時閃爍及卡頓的現像明顯改善。
以上是C#開發實例-訂位螢幕截圖工具(五)針對拖曳時閃爍卡頓的最佳化的詳細內容。更多資訊請關注PHP中文網其他相關文章!