2013-02-10 21 views
6

Zauważyłem, że resize flicker jest znacznie lepszy, gdy ustawię TPanel.FullRepaint na False. Ponieważ właściwość istnieje i domyślnie jest True, musi istnieć jakiś powód.Kiedy korzystać z TPanel FullRepaint?

Jak zdecydować, czy należy go ustawić, czy nie?

Pomoc prostu stwierdza:

kontroli FullRepaint jak centrala reaguje gdy jest zmieniany. Gdy FullRepaint ma wartość true, cały panel, w tym zukosowana krawędź, odświeża się, gdy zmienia się rozmiar. Gdy FullRepaint ma wartość false, odbarwia się tylko obszar wewnątrz sfazowanej granicy.

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

Ten tekst mówi, co robi, ale dlaczego nie ...

+2

Deal z resize migotania tak: http://stackoverflow.com/questions/8058745/tlabel-and-tgroupbox-captions-flicker- on-resize –

Odpowiedz

4

Efekt braku funkcji Fullrepaint może zostać wyświetlony i będziesz musiał zdecydować, czy jej potrzebujesz, czy nie.

  1. Umieść panel na formularzu, należy ustawić kotwy do wszystkich kierunkach
  2. Set PaintCaption false lub użyć pusty podpis
  3. się kolejna płyta na formularzu, tak, że jeśli zmiana rozmiaru formularza , części pierwszego panelu zostaną pokryte przez drugi panel.

Uruchom program i rozmiar formularza, czasami granice pierwszego panelu nie zostaną odświeżone.
Dzieje się tak, ponieważ w WMWindowPosChanged w przypadku (FullRepaint lub (ShowCaption i (Caption <> ''))) zostanie wywołany unieważniony, w przeciwnym razie tylko InvalidateRect (Handle, Rect, True) tylko rects zawiera tylko prawo i/lub dolna granica są unieważniane. (dzięki Sertac Akyuz za korektę)

Jak już wspomniano, unikanie unieważniacza zmniejsza migotanie iw wielu przypadkach nie trzeba podawać pełnego unieważnienia, więc użytkownik sam może zdecydować, jak postępować.

Panele jak rzadko będą stosowane, górne bez Fullrepaint

+2

* "... inaczej tylko InvalidateRect (Handle, Rect, True) prostokąta z wyłączeniem granic." * Jest to niepoprawne i twoje wyjaśnienie nie pasuje do kodu. Wręcz przeciwnie, gdy FullRepaint jest fałszywa (i nie ma podpisu), tylko rect zawierający granicę * right * i/lub * bottom * jest unieważniany - a nie rect z wykluczeniem granic. –

+1

@SertacAkyuz masz rację, zrobiłem edycję – bummi

+1

Więc 'FullRepaint: = True' jest potrzebne tylko wtedy, gdy panel jest pokryty przez inne kontrolki? –

0

W poprzednich wersjach systemu Windows (nie wiem do jakiej wersji, dokładnie) FullRepaint było konieczne, aby zapobiec graficzny artefacting na granicach paneli po zmianie rozmiaru formularza. Zgodnie z moją wiedzą, nie stanowiło to problemu, ponieważ przynajmniej Windows XP.