>> Как исправить мерцание компонентов при растяжении окна программы?
>>
> Хоть кто-то из 520 подписчиков знает как:
> Как уменьшить мерцание формы при её масштабирование?
>
Не отвечаем, наверное, прежде всего потому, что под Delphi может
оказаться очень много причин мерцания, прежде всего из-за ее
основного преимущества - большого выбора компонентов.
Кто знает, что лежит у Вас на форме и что мерцает.
Даже при использовании стандартных компонентов есть немало
возможных источников проблем. Вот и не хочется
увязнуть в переборе вариантов.
Допустим, простейший случай. TPanel и на нем куча мерцающих TLabel.
Большинство компонентов, являющихся окнами Windows, создаются
так, что не затирают дочерних окон (стили WS_CLIPCHILDREN
и WS_CLIPSIBLINGS), в том числе и TCustomPanel.
Все бы хорошо, но TLabel не использует окон Windows, поскольку
наследована не от TWinControl. Это значит, что когда TPanel
перерисуется, она затрет метки и они будут отрисованы
заново - вот и мерцание.
В Delphi не реализован полномасштабный алгоритм отслеживания
перекрытий визуальных компонентов, и это, наверное,
правильно - разумнее пользоваться реализацией Windows.
А в описанном случае есть три решения:
1. использовать TStaticText; поскольку это окно Windows, лежа на
панели он мерцать не будет, но зато будут значительно
сильнее расходоваться ресурсы
2. поместить метки на отдельную панель, возможно, без рамки,
причем размеры этой панели не должны меняться
3. найти компонент, заменяющий TPanel и реализующий
отслеживание перекрытий лежащих
на нем компонентов
В общем случае, чтобы определить причину мерцания, придется
смотреть исходники компонентов. А для своих компонентов
пользоваться общими рекомендациями, не раз
приводившимися в этом листе:
1. подавлять обработку по умолчанию WM_ERASEBKGND,
если нет свободных участков окна, подлежащих
заполнению цветом фона
2. реже использовать InvalidateRect(hWnd,NULL,TRUE); если возможно,
отмечать для перерисовки нужно не все окно, а только
прямоугольник или даже регион с изменениями
3. если выполняется большое количество операций отрисовки,
можно рисовать в контексте в памяти, и только затем
выводить сформированное битовое изображение
на экран (в Delphi можно, например, воспользоваться
TBitmap.Canvas)
4. предотвращать затирание дочерних окон, используя стили
WS_CLIPCHILDREN и WS_CLIPSIBLINGS
5. не использовать без необходимости стили класса окна
CS_HREDRAW и CS_VREDRAW, приводящие к
перерисовке при изменении размера (для
Delphi обычно требуется сбросить их в CreateParams)
6. законченные оптимизаторы могут попробовать использовать
тройку функций BeginDeferWindowPos/DeferWindowPos/EndDeferWindowPos;
но в средах с широким использованием визуальных элементов,
не являющихся окнами, вроде Delphi, применение этих
функций по большому счету бессмысленно
Номер выпуска : 4786
Возраст листа : 668 (дней)
Количество подписчиков : 526
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/404405
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru