通過特殊處理 Resize 事件解決 WinForm 加載時閃爍問題的一個方法

WinForm 上放置的控件多了或者有大背景圖,窗體加載時就會閃爍,對於一般的閃爍,設置 DoubleBuffer=True或許有一點改善,要立竿見影的解決可以重載 CreateParams 使用 WS_CLIPCHILDREN 參數初始化窗體,相關的文章網上多不勝數,這裏也就不再贅述。

WS_CLIPCHILDREN 方法雖好,但是就其原理,不是哪裏都能拿來用的。比如需要子窗體刷新的場景下,如繪圖或者實時視頻顯示的時候上了這一劑猛藥,就玩不下去了,需要改換其他的辦法。

最近在MDI子窗體上加載 SplitContainer 控件,然後在控件的 Panel裏面加載多個自定義的VideoPlayer控件就遇到了Form Load 時窗體閃爍嚴重的問題。

通過 Debug.Print 在窗體加載過程中的所有事件中輸出日誌,很快發現是MDI子窗體加載,最大化,激活等等觸發了很多次 Resize,每次 Resize 都會導致窗體重繪,於是對症下藥,針對這種情況,增加一個計數器,先將作爲容器的 SplitContainer 控件 Hide 起來,等到Resize 夠了再把它 Show 出來。前後對比,閃爍問題改善明顯。

 1     Public Sub New()
 2         ' 此調用是設計器所必需的。
 3         InitializeComponent()
 4         ' 在 InitializeComponent() 調用之後添加任何初始化。
 5         SplitContainer1.Hide()
 6     End Sub
 7 
 8     Private _iResized As Int32
 9     Protected Overrides Sub OnResize(e As EventArgs)
10         MyBase.OnResize(e)
11 
12         _iResized += 1
13         Debug.Print("============================ OnResize {0} ({1}) ============================", 14             _iResized, Me.Size)
15  
16  
17         
18         If _iResized = 5 AndAlso SplitContainer1.Visible = False Then
19             '5 是統計得出的窗體加載過程中最後一次 Resize
20             Application.DoEvents()
21             SplitContainer1.Show()
22         End If
23     End Sub

這個辦法一點都不高大上,希望能幫到不能使用 WS_CLIPCHILDREN 解決閃爍問題的人。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章