2013-02-01 37 views
2

當聽TTreeView事件的AdvancedCustomDraw事件是這樣的:閃爍當上了雙緩衝TTreeView自定義繪製

if Stage = cdPrePaint then begin 
    // modify some Sender.Canvas properties and let it draw itself 
end else if Stage = cdPostPaint then begin 
    // draw 'something extra' using a separate TControlCanvas 
    TControlCanvas.TextOut(SomeRect, 'Hello'); 
end; 

...看來,當我使DoubleBuffered控制決定不復制「額外的東西「到屏幕外緩衝區。這意味着只要我不打擾相關窗口,一切都很好。當我這樣做時,「額外的東西」僅在窗口的隨機部分中可見。

我在這裏錯過了什麼?

+0

聽起來像簡單的解決方案是將'DoubleBuffered'切換到'False'。你爲什麼不能那樣做? –

+0

@DavidHeffernan好,這使得在調整相關控件的大小時可以清除擦除。這就是我想要阻止的。 – Orwell

+2

這很容易做到。只需在調整循環中添加擴展窗口樣式'WS_EX_COMPOSITED'。我個人做了閃爍免費的德爾福應用程序,在調整大小時免費閃爍,沒有'DoubleBuffered',我認爲這是一個屬性。更多細節在我的答案在這裏:http://stackoverflow.com/questions/8058745/tlabel-and-tgroupbox-captions-flicker-on-resize –

回答

4

由於您的評論讓我全權提出一個替代的解決方案,這是我會做:用DoubleBuffered

  1. 停止。它會導致許多控制中的許多視覺怪異。我親自避免它像瘟疫一樣。
  2. 通過將WS_EX_COMPOSITED擴展窗口樣式添加到您的控件來解決您的閃爍問題。這種窗口風格可能會帶來一些性能拖延,我建議您只在調整循環期間添加此項,這是您需要的時候。我在這裏描述如何做到這一點:TLabel and TGroupbox Captions Flicker on Resize
+0

@Solar閱讀第2項中的鏈接答案 –