1. 程式人生 > 其它 >C#中使用CreateParams的ExStyle拓展雙緩衝解決介面重新整理緩慢與閃爍問題

C#中使用CreateParams的ExStyle拓展雙緩衝解決介面重新整理緩慢與閃爍問題

技術標籤:C#C#視覺化CreateParamsExStyle介面重新整理

ExStyle

1. 分析

在一個專案中對3000個控制元件實時上傳3000個位元組的資料改變控制元件屬性, 在實測中遇到了介面重新整理速度的問題.
介面重新整理速度上限之一為winform中的控制元件本身的重新整理機制(經過測試當控制元件數超過50個由這種情況產生的卡頓將變的明顯)
但我們可以通過在父介面程式碼中過載CreateParams屬性來設定介面減少閃爍加快繪製速度以優化介面顯示

ExStyle是屬於System.Windows.Forms.Control.CreateParams類的屬性.

System.Windows.Forms是用於建立Windows應用程式的類, 使用WindowsOS的使用者圖形介面功能. 其中Control類用於定義控制元件的基類, 其中控制元件指定為帶有視覺化表示形式的元件. CreateParams獲取建立控制元件控制代碼時所需要的建立引數。

根據資料, 則ExStyle是用於定義視覺化元件的屬性的屬性, 可以通過指定ExStyle的屬性來設定控制元件的拓展風格.

2.引數

本次所使用引數為: ExStyle |= 0x02000000; 意為ExStyle |= WS_EX_COMPOSITED, 所包含的意義為將一個窗體的所有子視窗使用雙緩衝按照從低到高方式繪製出來.
所用程式碼: 將改程式碼放置在父介面即可過載父介面及其子介面的雙緩衝機制

protected override CreateParams CreateParams
{
    get         //減少介面閃爍
    {
        var cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;
        return cp;
    }
}
3. 雙緩衝

雙緩衝的原理:儘量快的輸出影象,使輸出在一個重新整理週期內完成,如果輸出內容很多比較慢,那麼採用記憶體緩衝的方法,先把要輸出的內容在記憶體準備好,然後一次性輸出到窗體上,簡單的說來就是在視窗重新整理一次的過程中,讓所有圖元同時顯示到視窗中。

對於影象程式設計來說視窗閃爍是個常見的問題,當視窗有大量的複雜的圖元資料需要重繪,或者擁有自定義控制元件中的視窗閃爍問題更是顯而易見的。出現閃爍的原因有很多種,大部分原因主要是因為觸發WM_PAINT訊息時窗體進行了重繪操作,此過程先是用窗體的背景色擦除視窗表面,再把窗體的影象繪製上去,但是如果這2個操作不在同一時間段完成的話,就會先看到背景色(大部分為白色)接著才看到影象,這樣就會出現我們所說的窗體閃爍現象。

4.ExStyle其他引數
'視窗風格
Private Const WS_CAPTION = &HC00000     '帶標題欄的視窗
Private Const WS_MAXIMIZEBOX = &H10000   '帶最大化按鈕的視窗
Private Const WS_MINIMIZEBOX = &H20000   '帶最小化按鈕的視窗
Private Const WS_SYSMENU = &H80000     '帶系統選單的視窗
Private Const WS_CLIPSIBLINGS = &H4000000  '不重繪層疊子視窗
Private Const WS_CLIPCHILDREN = &H2000000  '繪圖時排子視窗區域
Private Const WS_OVERLAPPED = &H0&     '具有標題欄和邊框的層疊視窗
Private Const WS_THICKFRAME = &H40000    '具有可調邊框
'WS_OVERLAPPEDWINDOW具有標題欄、視窗選單、可調邊框和最大化、最小化按鈕的視窗
Private Const WS_OVERLAPPEDWINDOW = (WS_OVERLAPPED Or WS_CAPTION Or WS_SYSMENU Or WS_THICKFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX)
Private Const WS_GROUP = &H20000      '指定一組控制的第一個控制
Private Const WS_POPUP = &H80000000     '彈出式視窗
Private Const WS_BORDER = &H800000     '單邊框視窗
Private Const WS_POPUPWINDOW = (WS_POPUP Or WS_BORDER Or WS_SYSMENU) '具有單邊框、標題欄選單的彈出式視窗
Private Const WS_MINIMIZE = &H20000000   '視窗最小化
Private Const WS_VISIBLE = &H10000000    '視窗可見
Private Const WS_DISABLED = &H8000000    '視窗被禁用
Private Const WS_MAXIMIZE = &H1000000    '視窗最大化
Private Const WS_DLGFRAME = &H400000    '對話方塊邊框風格
Private Const WS_VSCROLL = &H200000     '具有垂直滾動條
Private Const WS_HSCROLL = &H100000     '具有水平滾動條
Private Const WS_TABSTOP = &H10000     '具有TAB鍵控制
Private Const WS_CHILD = &H40000000
Private Const WS_CHILDWINDOW = (WS_CHILD)  '具有子視窗

'擴充套件風格
Private Const WS_EX_WINDOWEDGE = &H100&     '視窗具有凸起的3D邊框
Private Const WS_EX_CLIENTEDGE = &H200&     '視窗具有陰影邊界
Private Const WS_EX_TOOLWINDOW = &H80&     '小標題工具視窗
Private Const WS_EX_TOPMOST = &H8&       '視窗總在頂層
Private Const WS_EX_OVERLAPPEDWINDOW = (WS_EX_WINDOWEDGE Or WS_EX_CLIENTEDGE) 'WS_EX-CLIENTEDGE和WS_EX_WINDOWEDGE的組合
Private Const WS_EX_PALETTEWINDOW = (WS_EX_WINDOWEDGE Or WS_EX_TOOLWINDOW Or WS_EX_TOPMOST) 'WS_EX_WINDOWEDGE和WS_EX_TOOLWINDOW和WS_EX_TOPMOST的組合
Private Const WS_EX_DLGMODALFRAME = &H1&    '帶雙邊的視窗
Private Const WS_EX_NOPARENTNOTIFY = &H4&    '視窗在建立和銷燬時不向父視窗傳送WM_PARENTNOTIFY訊息
Private Const WS_EX_TRANSPARENT = &H20&     '視窗透眀
Private Const WS_EX_MDICHILD = &H40&      'MDI子視窗
Private Const WS_EX_CONTEXTHELP = &H400&    '標題欄包含問號聯機幫助按鈕
Private Const WS_EX_RIGHT = &H1000&       '視窗具有右對齊屬性
Private Const WS_EX_RTLREADING = &H2000&    '視窗文字自右向左顯示
Private Const WS_EX_LEFTSCROLLBAR = &H4000&   '標題欄在客戶區的左邊
Private Const WS_EX_CONTROLPARENT = &H10000   '允許使用者使用Tab鍵在視窗的子視窗間搜尋
Private Const WS_EX_STATICEDGE = &H20000    '為不接受使用者輸入的項建立一個三維邊界風格
Private Const WS_EX_APPWINDOW = &H40000     '在工作列上顯示頂層視窗的標題按鈕
Private Const WS_EX_LAYERED = &H80000      '視窗具有透眀屬性(Win2000)以上
Private Const WS_EX_NOINHERITLAYOUT = &H100000 '窗口布局不傳遞給子視窗(Win2000)以上
Private Const WS_EX_LAYOUTRTL = &H400000    '水平起點在右邊的視窗
Private Const WS_EX_NOACTIVATE = &H8000000   '視窗不會變成前臺視窗(Win2000)以上
Private Const WS_EX_LEFT = &H0&         '視窗具有左對齊屬性
Private Const WS_EX_LTRREADING = &H0&      '視窗文字自左向右顯示
Private Const WS_EX_RIGHTSCROLLBAR = &H0&    '垂直滾動條在視窗的右邊界
Private Const WS_EX_ACCEPTFILES = &H10&     '接受檔案拖曳
Private Const WS_EX_COMPOSITED = &H2000000   '窗體所有子視窗使用雙緩衝從低到高繪製