1. 程式人生 > >C# tableLayoutPanel動態載入控制元件閃爍的解決方案

C# tableLayoutPanel動態載入控制元件閃爍的解決方案

本文轉載自k_set原創內容點選開啟連結

WinForm載入多個自定義控制元件時,會出現很嚴重的閃爍問題,很卡,一塊一塊的載入(像開啟網頁時,網路很卡的那種感覺)簡直沒法忍受。

在網上搜索了好久,網上大部分的方法是一下4種,但是都不能有效的解決問題。

  1.將DoubleBuffered 設定 true,用雙快取處理Form介面內容載入,可以提高頁面顯示質量。或者

SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);

this.UpdateStyles();


  2.把構造方法裡的內容儘量移動到Form_load事件裡處理。

  3.把控制元件繪製的Pint()寫到一起繪製。

  4.在控制元件使用後有變化時可以採用先 掛起 再顯示的方法,提高顯示質量。

this.tableLayoutPanel2.SuspendLayout();
                this.SuspendLayout();
                tableLayoutPanel2.Controls.Clear();
                
                tableLayoutPanel2.ColumnCount = value.ColumnCount;
                tableLayoutPanel2.ColumnStyles.Clear();
                for (int i = 0; i < this.tableLayoutPanel2.ColumnCount; i++) {
                    this.tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F/this.tableLayoutPanel2.ColumnCount));
                }

                this.tableLayoutPanel2.RowCount = value.ReservedCount / value.ColumnCount;
                tableLayoutPanel2.RowStyles.Clear();
                for (int i = 0; i < tableLayoutPanel2.RowCount; i++) {
                    this.tableLayoutPanel2.RowStyles.Add(new RowStyle(SizeType.Percent, 100F/tableLayoutPanel2.RowCount));
                }

                //  動態新增控制元件    
                //  在這兒新增你的程式碼
                ...


                tableLayoutPanel2.ResumeLayout(true);
                this.ResumeLayout(true);

你只有試了你就會發現,以上這幾種辦法並不能解決問題。

  解決辦法:

在呼叫自定義控制元件的窗體內新增的:

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

在自定義控制元件中新增的:

protected override CreateParams CreateParams
{
       get
      {
              var parms = base.CreateParams; 
              parms.Style &= ~0x02000000; // Turn off WS_CLIPCHILDREN 
              return parms;
       }
}