Когда использовать TPanel FullRepaint?

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

Как решить, ставить его или нет?

В справке просто указано:

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

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

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


person Jens Mühlenhoff    schedule 10.02.2013    source источник
comment
Обработайте мерцание при изменении размера следующим образом: stackoverflow.com/questions/8058745/   -  person David Heffernan    schedule 10.02.2013


Ответы (2)


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

  1. Поместите панель на форму, установите якоря во всех направлениях
  2. Установите для PaintCaption значение false или используйте пустую подпись
  3. Поместите на форму еще одну панель, чтобы при изменении размера формы части первой панели закрывались второй панелью.

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

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

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

person bummi    schedule 10.02.2013
comment
... иначе только InvalidateRect(Handle, Rect, True) прямоугольника, исключая границы. Это неверно, и ваше объяснение не соответствует коду. Напротив, когда FullRepaint имеет значение false (и нет заголовка), недействительным становится только прямоугольник, содержащий правую и/или нижнюю границу, а не прямоугольник, исключающий границы. - person Sertac Akyuz; 10.02.2013
comment
Итак, FullRepaint := True нужен только тогда, когда панель перекрывается каким-то другим элементом управления? - person Jens Mühlenhoff; 10.02.2013
comment
любое изменение размера может вызвать артефакты try : begin Panel1.Width := Random(200) end; - person bummi; 10.02.2013
comment
@Jens - Казалось бы, FullRepaint необходим, когда панель имеет скос / границу, а размер панели не фиксирован. Я нахожу это довольно странным, панель должна аннулировать себя только для того, чтобы правильно нарисовать свою границу/скос. Это похоже на обходной путь для какого-то дефекта в другом месте. - person Sertac Akyuz; 10.02.2013

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

person LaKraven    schedule 10.02.2013