首頁  >  文章  >  後端開發  >  C#開發實例-訂位螢幕截圖工具(五)針對拖曳時閃爍卡頓的最佳化

C#開發實例-訂位螢幕截圖工具(五)針對拖曳時閃爍卡頓的最佳化

黄舟
黄舟原創
2017-03-14 13:27:422237瀏覽

由於在實現的時候偷了個賴,沒有使用主窗體的區域重繪技術,而是使用一個Label組件來展現截取的圖片區域,所以在拖曳將截取區域變小或是反向截圖的時候,閃爍及卡頓的現象會比較嚴重,這裡針對這兩個問題對行一些針對性的最佳化。

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();
                }
            }
        }

經過測試發現,拖曳時閃爍及卡頓的現像明顯改善。



#

以上是C#開發實例-訂位螢幕截圖工具(五)針對拖曳時閃爍卡頓的最佳化的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn