2013-02-10 2 views
6

Я заметил, что resize flicker становится намного лучше, когда я устанавливаю TPanel.FullRepaint в False. Поскольку свойство существует и по умолчанию имеет значение True, для этого должна быть какая-то причина.Когда использовать TPanel FullRepaint?

Как решить, должно ли оно быть установлено или нет?

помощь просто заявляет:

управления FullRepaint как панель реагирует, когда она изменяется. Когда FullRepaint истинно, вся панель, включая скошенную границу, перерисовывается при изменении размера. Когда FullRepaint является ложным, только область внутри скошенной границы.

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

Этот текст говорит, что он делает, но не почему ...

+2

Deal с изменением размера мерцанием, как это: http://stackoverflow.com/questions/8058745/tlabel-and-tgroupbox-captions-flicker- on-resize –

ответ

4

Эффект отсутствующего Fullrepaint может быть показан, и вам нужно будет решить, нужен он вам это или нет.

  1. Поместите панель на форму, установите дюбели по всем направлениям
  2. Set PaintCaption ложь или использовать пустой заголовок
  3. Место другой панели на форму, так что если вы изменения размера формы, части первой панели будут покрыты второй панелью.

Запустите программу и размер формы, когда границы первой панели не будут обновлены.
Это происходит потому, что в WMWindowPosChanged в случае (FullRepaint или (ShowCaption и (Caption <> ''))) будет вызываться invalidate, иначе только InvalidateRect (Handle, Rect, True) из прямых, содержащих только правые и/или нижняя граница недействительны. (спасибо Sertac Akyuz для коррекции)

Как вы упомянули, избегая недействительности, уменьшает мерцание, и во многих случаях потребность в полном недействительности не предоставляется, поэтому пользователь может самостоятельно решить, как действовать.

Панель, как редко будет использоваться, верхняя без Fullrepaint

+2

* "... иначе только InvalidateRect (Handle, Rect, True) прямоугольника, исключая границы." * Это неверно, и ваши объяснения не совпадают с кодом. Напротив, когда FullRepaint является ложным (и нет заголовка), только признак, содержащий границу * right * и/или * bottom *, недействителен, а не прямой, исключая границы. –

+1

@SertacAkyuz Вы правы, я сделал редактирование – bummi

+1

Так что 'FullRepaint: = True' требуется только тогда, когда панель перекрывается некоторым другим элементом управления? –

0

В предыдущих версиях Windows (не уверен, до какой версии, точно) FullRepaint требовалось, чтобы предотвратить графический artefacting на границах панели при изменении размера формы. Насколько мне известно, это не было проблемой, по крайней мере, с Windows XP.