2013-02-10 8 views
6

Ho notato che lo resize flicker migliora molto quando imposto TPanel.FullRepaint su False. Poiché la proprietà esiste ed è True per impostazione predefinita, ci deve essere un motivo per quello.Quando utilizzare TPanel FullRepaint?

Come decidere se deve essere impostato o no?

L'aiuto afferma semplicemente:

controlli FullRepaint come il pannello risponde quando viene ridimensionata. Quando FullRepaint è true, l'intero pannello, compreso il bordo smussato, si ridimensiona quando le dimensioni cambiano. Quando FullRepaint è falso, viene ripristinata solo l'area all'interno del bordo smussato.

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

Quel testo dice ciò che fa, ma non perché ...

+2

Deal con sfarfallio ridimensionamento in questo modo: http://stackoverflow.com/questions/8058745/tlabel-and-tgroupbox-captions-flicker- on-ridimensionare –

risposta

4

L'effetto di un Fullrepaint mancante può essere mostrato e dovrete decidere se ne avete bisogno o no.

  1. Posizionare un pannello in un modulo, impostare ancore a tutte le direzioni
  2. Set PaintCaption false o utilizzare una didascalia vuota
  3. posto un altro pannello sul modulo, in modo che se si sta ridimensionando il modulo , parti del primo pannello saranno coperte dal secondo pannello.

Eseguire il programma e ridimensionare il modulo, in alcuni casi i bordi del primo pannello non verranno aggiornati.
Questo accade perché in WMWindowPosChanged in caso di (FullRepaint o (ShowCaption e (Caption <> ''))) verrà chiamato un invalidate, altrimenti solo InvalidateRect (Handle, Rect, True) di un rects contenente solo il diritto e/o il bordo inferiore sono invalidati. (grazie a Sertac Akyuz per la correzione)

Come accennato evitando invalidi si riduce lo sfarfallio e in molti casi non viene fornita la necessità di un invalidato completo, quindi l'utente può decidere autonomamente come procedere.

pannelli come verrà utilizzato raramente, superiore senza Fullrepaint

+2

* "... altrimenti solo InvalidateRect (Handle, Rect, True) di un rect escludendo i bordi." * Questo non è corretto e la spiegazione non corrisponde al codice. Al contrario, quando FullRepaint è falso (e non c'è didascalia) solo un rect contenente il bordo * right * e/o * bottom * viene invalidato - non un rect che esclude i bordi. –

+1

@SertacAkyuz hai ragione, ho apportato una modifica – bummi

+1

Quindi 'FullRepaint: = True' è necessario solo quando il pannello è sovrapposto ad altri controlli? –

0

Nelle versioni precedenti di Windows (non è sicuro fino a quale versione, esattamente) FullRepaint era necessario per evitare che l'artefazione grafica sui bordi del pannello quando un modulo è stato ridimensionato. Per quanto ne so, questo non è stato un problema da almeno Windows XP.

Problemi correlati