標籤: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#視窗閃爍問題解決