[英]Delphi TSplitter flickering issue
我正在使用啟用了VCL樣式的Delphi,我想為我的表單更改TSplitter的顏色。 我TSplitter.Paint
插器類中覆蓋TSplitter.Paint
以繪制比默認VCL樣式cBtnFace
顏色更暗的顏色,但是在調整大小時窗體上會出現明顯的閃爍。 有沒有辦法消除這種閃爍?
我試過這些東西來嘗試減少閃爍,但沒有一個有效:
禁用VCL樣式( TSplitter.StyleElements := []
)。
更改VCL樣式位圖樣式設計器的“分割器”對象元素,但修改此對象元素不會更改分割器的外觀。
試圖在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 = True
和ParentBackground = False
將有助於減少/消除瞬間任何組件的閃爍它前面的UI層(即TSplitter
)。 但是,情況似乎並非如此。
也許我會嘗試將TPanel
放置為LeftPanel, TSplitter
和RightPanel的父級,並設置其DoubleBuffered = True
和ParentBackground = 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.