C#閃爍問題解決方案

來源:互聯網
上載者:User
解決|閃爍|問題

  自從米格的仁兄向我推薦C#之後,偶就誤入歧途的漸漸脫離了Java陣營。最近在寫工具的時候,忽然發現了一個老生常談的閃爍問題,要知道這樣的問題在Java Swing裡只要把DoubleBuffer設定為true基本上是不會發生的,但在C#上卻怎麼也搞不定,竟然連雙緩衝都有問題,GDI+不會這麼脆弱吧。

  偶再一次被微軟的花頭給戲弄了,無奈只好踏上了漫漫搜尋之路,也不知道搜了多少文章,找了多少資料,基本上都是無功而返,更可氣的是網上有些資料還騙人,偶試了試基本上都不行的,該閃的照樣閃的歡。有些方法像髒矩陣一樣要Invalide部分更新地區,偶嫌他麻煩,幸好偶找到了一篇文章,講閃爍原理的,雖然偶過去自認為瞭解閃爍原理,比如什麼重新整理周期,顯存之類的,不過偶還是耐著性子看了一遍,收穫頗豐,看來孔夫子的溫故而知新頗有道理!

  於是偶按照原理自己改起了代碼,沒想到還真讓我給解決了。C#控制項之所以會閃爍,是因為Refresh會把整個控制項給清成背景色,然後再把映像繪製上去,就算先把所有待畫的映像繪製到緩衝上,然後再Render到控制項上,因為清屏時的顏色,相當於中間插了一空白幀,當重新整理過快時也是會有閃爍的。

  偶的做法是:

  1.每幀控制項建立一個Graphics,記得一定是CreateGraphics而不是通過Paint函數的那個參數e獲得。

  2.把待繪製的映像繪製到緩衝上,緩衝大小為控制項大小。

  3.重新整理的時候調用Invalidate(new Rectangle(0, 0, 1, 1));

  4.在Paint函數繪製緩衝,搞定!

  哈哈,相信大家看了都會瞭解,Invalidate(new Rectangle(0, 0, 1, 1));相當於調用Paint函數,但卻不重繪控制項,這樣中間那個空白幀就沒有了,閃爍當然就消失啦!

  原理很重要啊很重要!



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.