2013-02-10 53 views
6

我注意到resize flicker變得好多了,當我設置TPanel.FullRepaintFalse。由於該屬性存在並且默認爲True,因此必須有某些原因。何時使用TPanel FullRepaint?

如何決定是否應該設置?

幫助剛指出:

FullRepaint控件在調整大小時面板的響應。 FullRepaint爲true時,整個面板(包括斜面邊框在尺寸更改時重繪)。 FullRepaint爲false時,只有斜面邊框內的區域重新繪製。

http://docwiki.embarcadero.com/Libraries/XE3/en/Vcl.ExtCtrls.TPanel.FullRepaint

該文本表示它做什麼,而不是爲什麼...

+2

處理調整大小的閃爍這樣的:http://stackoverflow.com/questions/8058745/tlabel-and-tgroupbox-captions-flicker- on-resize – 2013-02-10 09:06:37

回答

4

可以顯示丟失的Fullrepaint的效果,您將不得不決定是否需要它。

  1. 在窗體上放置一個面板,設置錨四面八方
  2. 設置PaintCaption虛假或使用空標題
  3. 將另一個小組的形式,因此,如果您正在調整的 形式,第一個面板的一部分將由第二個面板覆蓋。

運行程序並調整窗體大小,第一個面板的邊界不會被刷新。
發生這種情況是因爲在(FullRepaint或(ShowCaption和(Caption <>'')))的WMWindowPosChanged中,將調用invalidate,否則僅包含右側和/或右側的rects的InvalidateRect(Handle,Rect,True)或下邊框無效。 (感謝塞爾特克Akyuz糾正)

正如你所提到的避免無效減少閃爍,並在很多情況下,沒有給出完全無效的需要,所以用戶可以決定自己如何繼續。

面板作爲很少會用到,不上Fullrepaint

+2

*「...否則只有InvalidateRect(Handle,Rect,True)不包含邊框的矩形。」*這是不正確的,您的解釋與代碼不匹配。相反,當FullRepaint爲false(並且沒有標題)時,只有包含* right *和/或* bottom *邊界的矩形失效 - 不是邊界以外的矩形。 – 2013-02-10 10:37:36

+1

@SertacAkyuz你是對的,我做了一個編輯 – bummi 2013-02-10 11:14:16

+1

所以'FullRepaint:= True'只有當面板被其他控件重疊時才需要? – 2013-02-10 11:46:00

0

在以前的Windows版本(不知道最多的是哪個版本,精確地)FullRepaint被要求防止圖形artefacting在窗體大小調整時在面板邊框上。 據我所知,至少從Windows XP開始,這一直是個問題。