2009-09-21 4 views

ответ

13
procedure TForm1.WMEnterSizeMove(var Message:TWMMove); 
begin 
    Self.DisableAlign; 
end; 

procedure TForm1.WMExitSizeMove(var Message:TWMMove); 
begin 
    Self.EnableAlign; 
end; 
+0

Это прекрасно предотвращает мерцание, но, похоже, также предотвращает выравнивание. Я добавил Invalidate call после включения выравнивания: не идеально, потому что вы не можете точно определить, какой эффект будет иметь размер формы, но по крайней мере он устраняет все мерцание на сложной многопанельной форме. – frogb

+0

процедура WMEnterSizeMove (var Message: TWMMove); сообщение WM_ENTERSIZEMOVE; процедура WMExitSizeMove (var Message: TWMMove); сообщение WM_EXITSIZEMOVE; не возбуждает события, связанные с событиями. На самом деле забыл упомянуть, что это рамка, а не форма, но я догадался, что это было бы то же самое. – zz1433

4

Попробуйте использовать WM_SETREDRAW (not LockWindowUpdate).

Вы также можете взглянуть на DeferWindowPos.

+1

+1, оба очень хорошие куски советов сами по себе. Однако они, вероятно, не помогут в сложной форме VCL с использованием выравнивания, вложенных элементов управления и т. Д. 'DeferWindowPos()' стоит проверить для ручного размещения в обработчике OnResize. – mghie

4

Сложные формы часто состоят из вложенных панелей, и процесс перекраски может вызвать мерцание. Если дело обстоит именно так с вашим проектом есть два простых решений, которые могли бы помощь:

  1. Отключить свойство FullRepaint на ваших панелях.
  2. Включить имущество DoubleBuffered на вашей форме. Вы не найдете это имущество у инспектора объекта, поэтому поставьте в FormCreate.
+1

Обратите внимание, что «DoubleBuffered» торгует меньше мерцания для более медленной скорости обновления, эффект, который может быть заметен на больших экранах, где изменение размера может стать «прыгающим» с большими размерами окон. – mghie

+1

DoubleBuffered в основном делает ваше приложение бесполезным на Citrix и Terminal Server. –

+1

>>> «DoubleBuffered в основном делает ваше приложение бесполезным на Citrix и Terminal Server» Можете ли вы указать, почему? – Alex

1

У меня вокруг этого следующим образом:

  1. В случае «OnResize» в форме, есть рутина, чтобы скрыть все дочерние элементы управления, а затем запустить таймер с галочкой около 500мс ,
  2. Когда таймер срабатывает, отключите его, а затем установите все дочерние элементы управления на видимые.

Играя с этой деятельностью, вы получаете форму, которая пуста, пока вы ее определяете, но затем аккуратно заполняется, когда вы отпускаете.

Бри

+1

Я думаю, вы обнаружите, что обработка сообщений о перемещении ввода/выхода (с изменением, отмеченным в моем комментарии выше) дает лучший пользовательский интерфейс, потому что вы можете хотя бы увидеть (нестандартную) форму при изменении размера окна. – frogb

0

избежать мерцания путем выравнивания не не более 1 не- alClient компонент каждого из родителей, всегда в паре с alClient (например, TPanel), чтобы содержать все другие компоненты. Группируйте их в панели без границ.

Скажите, что вы хотите связать три вещи: alLeft, alTop и alClient для основного вида. Dont сделать это: Form alTop alLeft alClient // your main view

Но вместо того, чтобы вставлять их следующим образом: Form alTop alClient // panel to avoid flicker alLeft alClient // your main view

Та же история для встраивания нескольких alTop элементов.