2013-04-04 99 views
5

我使用德爾福VCL樣式啓用,我想改變我的窗體TSplitter的顏色。我在介入類中覆蓋了TSplitter.Paint以繪製比默認VCL樣式暗的顏色cBtnFace顏色,但調整大小時窗體上會出現明顯的閃爍。有沒有辦法消除這種閃爍?德爾福TSplitter閃爍問題

我已經試過這些東西,試圖減少閃爍,但沒有工作:

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

  2. 更改「Splitter」的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擺脫閃爍?沒有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 = TrueParentBackground = False在BackgroundPanel將有助於減少/從任何部件上立即消除閃爍在它前面的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事情時,當應用程序沒有調整大小時。

更新2

不幸的是,而我的上面(創建一個背景父TPanel)的方式固定在TSplitter閃爍,也引起其他奇怪的UI問題,也許其中有一些@大衛赫弗南暗示在評論。目前,我剛剛離開了閃爍的問題,因爲分離器只有1px寬,只在寬度+高度調整大小時閃爍。

+0

我還在等待引入'TFlickerFreeForm'或'TFlickerFreeControl'。 – 2013-04-04 21:56:39

+0

遠程獲取並且有時候解決方案不足,但是您是否嘗試啓用'DoubleBuffered'? – 2013-04-04 21:57:57

+0

@JerryDodge'TSplitter'沒有DoubleBuffered屬性,如果這就是你的意思(我的問題的底部)。我試過對父UI對象啓用'DoubleBuffered'無濟於事。 – spurgeon 2013-04-04 22:03:30

回答

3

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

DoubleBuffered並不總能修正閃爍,並且在某些情況下會使事情變得更糟。在調整大小時,您可能只考慮使用DoubleBuffered,然後在調整大小時將其切換回。該屬性只能用於實際調整大小的那些控件。例如,在調整窗體大小時,在窗體上啓用DoubleBuffered。但是,只調整面板的內容時,只需爲該面板(及其所有子控件)啓用它。

對於由於此更改而導致應用程序性能下降的情況,您可能還會考慮在調整大小時實施標記,這會暫停可能導致程序執行的任何程序(任何重新繪製的內容,如標籤,圖像,等等。)。這其本身也可以解決您的問題(實際上可能是第二個答案)。