C#視窗閃爍問題解決

來源:互聯網
上載者:User

標籤:dex   timer   ack   sys   tin   asp   winform   controls   alt   

 https://www.cnblogs.com/AndyDai/p/5203798.html

開發WinForm 程式時經常會遇到閃屏的問題,這會給使用者造成很差的使用體驗,所以必須妥善解決好這個問題。

首先,我們先要找出閃屏的原因,就我目前遇到的問題而言,其原因真是五花八門。

主要的原因有:使用了很多的組件導致載入緩慢,使用了效能差的組件(PictureBox、Button等)。

所以,不論開發人員的水平如何,微軟給我們也挖了坑的。

 

對於控制項太多造成的閃屏,其原因有兩個:

1. 繪製控制項時,Windows 會給控制項發送兩個訊息。第一個是WM_ERASEBKGND訊息,它會觸發OnPaintBackground方法,繪製控制項背景。

第二個是WM_PAINT訊息,它會觸發 OnPaint()方法,繪製控制項介面。當繪製很慢的時候,會先看到背景,然後才看到介面,這樣造成閃爍。

解決方案:在構造方法中設定 ControlStyles 的OptimizedDoubleBuffer 和AllPaintingInWmPaint為True,完全啟用雙緩衝。

啟用雙緩衝的首選方法是將該控制項的 DoubleBuffered 屬性設定為 true,這會產生同樣的結果,原因不細說了。

this .SetStyle(ControlStyles.AllPaintingInWmPaint,  true ); this .SetStyle(ControlStyles.OptimizedDoubleBuffer,  true );

2. 有很多控制項的表單需要很長時間來繪製。特別是在它使用效能很差的PictureBox、Button等時。一旦你加上50多個的控制項,閃屏就開始變得明顯了。

表單會先繪製其自身背景,並在控制項所在地方留下"洞"。這些"洞"通常是白色的,當你使用Opacity 或Transparency是黑色的。

然後每個控制項被繪製後,就填充在"洞"中。這種視覺效果是很醜陋的,而且在WinForm 中沒有現成的解決方案。

雙緩衝也不能解決它,因為它只適用於一個單一的控制項,而不是一組複合控制項。

解決方案:設定CreateParams的ExStyle為ExStyle  為 0x02000000 (WS_EX_COMPOSITED)。

設定了這個值之後XP(其他系統好像也可以,沒有考證)會把表單和它的子表單都開啟雙緩衝

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

這裡有一些需要注意的地方:這種方式並不會加快繪製的過程。當發生繪製時,表單只是停留在不可見的狀態,當繪製完成後就會在螢幕上彈出。

這時表單的Opacity or TransparencyKey 是不會起作用的,表單的輪廓是可見的,在繪製地區會出現一個醜陋的黑色矩形框。

要解決這個問題,最好使用計時器來增加不透明度值到99%,以使其在繪製後可見,這樣使用者就不會看到黑色矩形了。 

public partial class FormDemo : Form    {        private Timer Timer = null;        public FormDemo()        {            InitializeComponent();            Timer = new Timer() { Interval = 100 };            Timer.Tick += new EventHandler(Timer_Tick);            base.Opacity = 0;            Timer.Start();        }         private void Timer_Tick(object sender, EventArgs e)        {            if (this.Opacity >= 1)            {                Timer.Stop();            }            else            {                base.Opacity += 0.2;            }        }    }
先寫這麼多,慢慢補充吧

C#視窗閃爍問題解決

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.