我使用德爾福VCL樣式啓用,我想改變我的窗體TSplitter的顏色。我在介入類中覆蓋了TSplitter.Paint
以繪製比默認VCL樣式暗的顏色cBtnFace
顏色,但調整大小時窗體上會出現明顯的閃爍。有沒有辦法消除這種閃爍?德爾福TSplitter閃爍問題
我已經試過這些東西,試圖減少閃爍,但沒有工作:
禁用VCL樣式(
TSplitter.StyleElements := []
)。更改「Splitter」的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
擺脫閃爍?沒有DoubleBuffer屬性TSplitter
或類似的東西,我可以告訴。
UPDATE
不幸的是,我不能共享代碼庫,但我可以告訴你,這是應用程序用戶界面的安裝方式時TSplitter
閃爍:
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背後(即控制 - >發送到後),該DoubleBuffered = True
和ParentBackground = False
在BackgroundPanel將有助於減少/從任何部件上立即消除閃爍在它前面的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事情時,當應用程序沒有調整大小時。
更新2
不幸的是,而我的上面(創建一個背景父TPanel
)的方式固定在TSplitter
閃爍,也引起其他奇怪的UI問題,也許其中有一些@大衛赫弗南暗示在評論。目前,我剛剛離開了閃爍的問題,因爲分離器只有1px寬,只在寬度+高度調整大小時閃爍。
我還在等待引入'TFlickerFreeForm'或'TFlickerFreeControl'。 – 2013-04-04 21:56:39
遠程獲取並且有時候解決方案不足,但是您是否嘗試啓用'DoubleBuffered'? – 2013-04-04 21:57:57
@JerryDodge'TSplitter'沒有DoubleBuffered屬性,如果這就是你的意思(我的問題的底部)。我試過對父UI對象啓用'DoubleBuffered'無濟於事。 – spurgeon 2013-04-04 22:03:30