Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

"Тормоза"

Хоть кто-то из 520 подписчиков знает как:

Как уменьшить мерцание формы при её масштабирование?

*******
{_-|-_}

Номер выпуска : 4783
Возраст листа : 667 (дней)
Количество подписчиков : 529
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/404139
Получить правила : 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

Ответить   Tue, 19 Jul 2005 21:35:07 +0300 (#404139)

 

Ответы:

Здравствуйте !


Для начало неплохо бы сообщить в какой среде работаем/
на чем пишем.

А так...

Общие рекомендации. Установить стили окна WS_CLIPCHILDREN,
WS_CLIPSIBLINGS. Если на форме что то рисуется, то выводить
графику через внеэкранный буфер (сначала рисовать в памяти,
потом делать BitBlt на форму).
Ну и при регистрации классов окон надо осмотрительно использовать
стили CS_HREDRAW и CS_VREDRAW.

--
С уважением, Вахтуров Виктор.

Номер выпуска : 4785
Возраст листа : 668 (дней)
Количество подписчиков : 529
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/404208
Получить правила : 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

Ответить   Wed, 20 Jul 2005 00:32:03 +0400 (#404208)

 

Не отвечаем, наверное, прежде всего потому, что под 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

Ответить   Wed, 20 Jul 2005 11:55:21 +0400 (#404405)

 

Пример кода привести сможете?

*******
{_-|-_}

Номер выпуска : 4791
Возраст листа : 669 (дней)
Количество подписчиков : 524
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/405371
Получить правила : 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

Ответить   Thu, 21 Jul 2005 18:34:21 +0300 (#405371)

 

Если ты пишешь под Делфи, то альтернативным (вернее, не альтернативным, а <<обернутым
в класс>>) способом быстрой прорисовки в Delphi является использование свойства
TBitmap-объекта ScanLine. Т.е. нужно создать TImage и воспользоваться его свойством
Picture.Bitmap.ScanLine, причем для объекта TImage нет необходимости следить
за перерисовкой.

Номер выпуска : 4787
Возраст листа : 668 (дней)
Количество подписчиков : 526
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/404476
Получить правила : 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

Ответить   Wed, 20 Jul 2005 13:25:59 +0400 (#404476)

 

Добрый день -=BETA,

Tuesday, July 19, 2005, 9:35:07 PM, вы писали:

Есть мысль отключить на это время обработку WM_PAINT.

Ответить   Thu, 21 Jul 2005 11:48:07 +0300 (#405387)

 

"Тормозов" больше нет, спасибо.

Тема закрыта.

*******
{_-|-_}

Номер выпуска : 4806
Возраст листа : 673 (дней)
Количество подписчиков : 526
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/407196
Получить правила : 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

Ответить   Mon, 25 Jul 2005 21:29:51 +0300 (#407196)