При изменении размера формы с большим количеством элементов управления форма выглядит плохо из-за мерцания. Каковы некоторые советы по изменению размера формы?Как я могу сделать свою форму более плавно?
ответ
procedure TForm1.WMEnterSizeMove(var Message:TWMMove);
begin
Self.DisableAlign;
end;
procedure TForm1.WMExitSizeMove(var Message:TWMMove);
begin
Self.EnableAlign;
end;
Попробуйте использовать WM_SETREDRAW (not LockWindowUpdate).
Вы также можете взглянуть на DeferWindowPos.
+1, оба очень хорошие куски советов сами по себе. Однако они, вероятно, не помогут в сложной форме VCL с использованием выравнивания, вложенных элементов управления и т. Д. 'DeferWindowPos()' стоит проверить для ручного размещения в обработчике OnResize. – mghie
Сложные формы часто состоят из вложенных панелей, и процесс перекраски может вызвать мерцание. Если дело обстоит именно так с вашим проектом есть два простых решений, которые могли бы помощь:
- Отключить свойство
FullRepaint
на ваших панелях. - Включить имущество
DoubleBuffered
на вашей форме. Вы не найдете это имущество у инспектора объекта, поэтому поставьте в FormCreate.
Обратите внимание, что «DoubleBuffered» торгует меньше мерцания для более медленной скорости обновления, эффект, который может быть заметен на больших экранах, где изменение размера может стать «прыгающим» с большими размерами окон. – mghie
DoubleBuffered в основном делает ваше приложение бесполезным на Citrix и Terminal Server. –
>>> «DoubleBuffered в основном делает ваше приложение бесполезным на Citrix и Terminal Server» Можете ли вы указать, почему? – Alex
У меня вокруг этого следующим образом:
- В случае «OnResize» в форме, есть рутина, чтобы скрыть все дочерние элементы управления, а затем запустить таймер с галочкой около 500мс ,
- Когда таймер срабатывает, отключите его, а затем установите все дочерние элементы управления на видимые.
Играя с этой деятельностью, вы получаете форму, которая пуста, пока вы ее определяете, но затем аккуратно заполняется, когда вы отпускаете.
Бри
Я думаю, вы обнаружите, что обработка сообщений о перемещении ввода/выхода (с изменением, отмеченным в моем комментарии выше) дает лучший пользовательский интерфейс, потому что вы можете хотя бы увидеть (нестандартную) форму при изменении размера окна. – frogb
избежать мерцания путем выравнивания не не более 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
элементов.
Это прекрасно предотвращает мерцание, но, похоже, также предотвращает выравнивание. Я добавил Invalidate call после включения выравнивания: не идеально, потому что вы не можете точно определить, какой эффект будет иметь размер формы, но по крайней мере он устраняет все мерцание на сложной многопанельной форме. – frogb
процедура WMEnterSizeMove (var Message: TWMMove); сообщение WM_ENTERSIZEMOVE; процедура WMExitSizeMove (var Message: TWMMove); сообщение WM_EXITSIZEMOVE; не возбуждает события, связанные с событиями. На самом деле забыл упомянуть, что это рамка, а не форма, но я догадался, что это было бы то же самое. – zz1433