1. 程式人生 > >C# WinForm頁面切換導致閃爍的解決方法

C# WinForm頁面切換導致閃爍的解決方法

問題描述

介面上放置大量的控制元件(尤其是自定義控制元件)會導致在窗體載入時,速度變得緩慢;當切換頁面時,也會時常產生閃爍的問題,非常影響使用者體驗。

解決方法

將此程式碼寫在要解決閃爍問題的父窗體中:

        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x02000000;
                return
cp; } }

原理

Winform窗體程式在啟動時繪製大量控制元件的時間開銷非常大, 兩個原因導致了這種閃爍(flicker):

  1. 當一個控制元件需要繪製時,Windows會向此窗體傳送兩條訊息,第一條是:WM_ERASEBKGND,這條訊息使得背景得以繪製,第二條訊息是:WM_PAINT,使得前景被繪製,首先背景色是簡單的,所以速度較快,前景色較為耗時(相對),所以就產生了這種閃爍現象,這是問題的根源,Winform為此提供了一個解決方案:雙緩衝(OptimizedDoubleBuffer)。
  2. 當一個窗體包含許多控制元件的時候,需要大量的時間來進行繪製,尤其是預設屬性的按鈕控制元件。一旦你的窗體包含了50個(或更多)的控制元件,閃爍的問題就出現了。窗體類首先繪製背景色,打個比方,每個控制元件的背景色都形容為一個“坑”,那麼當你使用透明色或者繼承父類選項時,每個洞首先被繪製成白色,黑色,然後每個控制元件前景色被繪製(填坑),表面上看非常醜,並且沒有現成的解決方案,DoubleBuffering也無法解決大量的控制元件閃爍問題。

    在SDK標頭檔案中有這樣一個Windows樣式:WS_EX_COMPOSITED,這個樣式可使Windows Forms啟用雙緩衝於所有窗體以及其子控制元件,當然也就解決了上述問題。