簡體   English   中英

Delphi TSplitter閃爍問題

[英]Delphi TSplitter flickering issue

我正在使用啟用了VCL樣式的Delphi,我想為我的表單更改TSplitter的顏色。 TSplitter.Paint插器類中覆蓋TSplitter.Paint以繪制比默認VCL樣式cBtnFace顏色更暗的顏色,但是在調整大小時窗體上會出現明顯的閃爍。 有沒有辦法消除這種閃爍?

我試過這些東西來嘗試減少閃爍,但沒有一個有效:

  1. 禁用VCL樣式( TSplitter.StyleElements := [] )。

  2. 更改VCL樣式位圖樣式設計器的“分割器”對象元素,但修改此對象元素不會更改分割器的外觀。

  3. 試圖在TControl對象上處理WM_ERASEBKGND消息,但我無法在我的插入器類中調用該過程。

     procedure WMEraseBkgnd(var Msg: TWMEraseBkgnd); message WM_ERASEBKGND; ... procedure TSplitter.WMEraseBkgnd(var Msg: TWMEraseBkgnd); begin // this is never invoked by the TSplitter Msg.Result := 1; end; 

什么其他想法擺脫TSplitter上的閃爍? 對於TSplitter沒有DoubleBuffer屬性,或者我可以告訴他們這樣的東西。

UPDATE

不幸的是,我不能共享代碼庫,但我可以告訴你,當TSplitter閃爍時,這就是設置應用程序UI的方式:

TForm (DoubleBuffered = False)
-> BackgroundPanel (DoubleBuffered = True, ParentBackground = False)
-> -> A TGradient, image and label to fill the BackgroundPanel
-> LeftPanel (ParentBackground = False`, no flickering)
-> -> LeftPanelFrame and frame content (selective double buffering)
-> TSplitter
-> RightPanel (ParentBackground = False, no flickering)
-> -> RightPanelFrame and frame content (selective double buffering)

表單頂部還有一個工具欄和一個主菜單,但其余的UI組件設置為alClient(或OnResized以填充空間)。

我假設由於BackgroundPanel位於LeftPanel, TSplitter和RightPanel(即Control,> Send to Back)之后, DoubleBuffered = TrueParentBackground = False將有助於減少/消除瞬間任何組件的閃爍它前面的UI層(即TSplitter )。 但是,情況似乎並非如此。

也許我會嘗試將TPanel放置為LeftPanel, TSplitter和RightPanel的父級,並設置其DoubleBuffered = TrueParentBackground = False 我將不得不稍后嘗試並回來。 所以,它看起來像這樣:

TForm
-> BackgroundPanel (DoubleBuffered = True, ParentBackground = False)
-> -> A TGradient, image and label to fill the BackgroundPanel
-> EncapsulatingPanel (DoubleBuffered = True, ParentBackground = False)
-> -> LeftPanel (ParentBackground = False)
-> -> -> LeftPanelFrame and frame content
-> -> TSplitter
-> -> RightPanel (ParentBackground = False)
-> -> -> RightPanelFrame and frame content

最后,我應該注意到,在調整大小(窗口右側的黑色軌跡)時,雙緩沖TForm會大大降低UI的速度,而不是在應用程序未調整大小時執行其他UI操作時。

更新2

不幸的是,雖然我上面的方法(創建一個后台父TPanel )修復了TSplitter上的TSplitter ,但它也引起了其他奇怪的UI問題,也許其中一些@David Heffernan在評論中提到過。 現在,我剛剛離開閃爍的問題,因為分離器只有1px寬,只有在寬度+高度調整時閃爍。

TSplitter控件可能沒有DoubleBuffered屬性,但是此屬性應該在您遇到閃爍的最上層控件上實現 - 在大多數情況下,應該是表單。 只要所有控件的ParentDoubleBuffered仍然默認啟用,它們都將獲得此更改。

DoubleBuffered並不總能修復閃爍,在某些情況下可能會使事情變得更糟。 您可以考慮僅在調整大小時使用DoubleBuffered ,然后在調整大小時將其關閉。 此屬性應僅用於實際調整大小的控件。 例如,在調整表單大小時,在表單上啟用DoubleBuffered 但是當僅調整面板內容的大小時,只為該面板(及其所有子控件)啟用它。

至於由於此更改導致應用程序性能下降,您還可以考慮在調整大小時實現一個標志,這將暫停任何可能使其陷入困境的程序執行(重繪任何內容,如標簽,圖像等)。 它的自身也可能是你的問題的解決方案(實際上可能是第二個答案)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM