Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Мерцает от перемещения Виндовых окон. [Delphi, OpenGL, Windows]


@!!ex ©   (2006-07-04 18:20:00) 

Суть проста. OPenGL приложение.
Все красиво, супер и т.д.
Но стоит начать работать с каким нибудь виндовым окном(менять размер. позицию на экране), не сворачивая мой проект, как он начинает мерцать. Неприятно. Как можно попробовать решить эту порблему?


@!!ex   (2006-07-05 21:39:00) [1]

>>опыт же всегда полезен...
Абсолютно согласен!

Попробую!


Cash   (2006-07-05 09:39:00) [2]

@!!ex ©:
Рпади прикола, сделай копию проекта и в ней весь код из WM_PAINT
(или WM_ERASEBKGND) перетащи в OnIdle с вставкой только одной
команды, Done:=false;

Поэксперементируй, над копией, этого же никто не запрещает,
опыт же всегда полезен...


@!!ex   (2006-07-04 23:06:00) [3]

Получилось! Только теперь мерцает кэпшен. Ну и фиг с ним. Почти не заметно. Спасибо, товарищи!


@!!ex   (2006-07-04 23:05:00) [4]

Через Idle придеться много кода переписывать. Ща попробую через EraseBkgnd.... Сразу надо было пробовать... как не догадался?


DarkEagle   (2006-07-04 22:02:00) [5]

Vladimir Kladov
Спасибо! Реальная тема!


Vladimir Kladov   (2006-07-04 21:06:00) [6]

Мне кажется надо всего лишь перехватить WM_ERASEBKGND, сказать, что отработано, и ничего не делать. И пусть перерисовывается - но мелькать не будет.


Cash   (2006-07-04 20:34:00) [7]

OnIdle, событие объекта Application, срабатывает афигенно часто, если его
об этом попросить! :)
Перед заменой Application.OnIdle рекомендуется сделать бекап адреса
старого события, и вызывать его в своем.
Просят OnIdle быть побыстрее с помощью параметра Done, включаемого в
заголовок события. Коротче, Done:=false; и все.


DarkEagle   (2006-07-04 20:15:00) [8]

А что за событие такое, которое вы здесь описываете? OnIdle?
Ну на API это понятно как реализуеться, а на дельфе как?


Cash   (2006-07-04 20:00:00) [9]

А я что то говорил о ProcessMessages???
Глюконафтика у тебя и идет от юзания WM_PAINT сообщения, от него надо
отказываться!
И надо глядеть обоими глазами в сторону OnIdle события, пофигу, что
все остальное тоже на событиях виси, ничего от этого не поменяется!

В OnIdle событии, чтоб оно обновлялось почаще, первой строкой ставь
Done:=false, это скажет, что мы еще не закончили. Но при этом ничего
сверхестественного с остальной средой не случится, ты только отрисовку
туда засунь, ведь в ней весь рамс!


@!!ex   (2006-07-04 19:49:00) [10]

Через message WM_PAINT. Только очередная перерисовка происходит только после того, как SwapBuffer предыдущий отработает.
ОнИдл не катит, потому что многое висит на событиях. Сеть в частности.
ProcessMessages -  слишком тормозит все.
Сейчас отрисовываеться все и вызываеться InvalidateRect


Cash   (2006-07-04 19:36:00) [11]

Перерисовка по таймеру происходит?
Или через WM_PAINT (OnPaint событие)?

Если по таймеру, то не по стандартному ли? (т. е. таймер не из System закладки?)
Если да, то его в топку, потом брать какойньть хороший таймер, а еще
лучше - с OnIdle событием Application-а работать.


@!!ex   (2006-07-04 18:44:00) [12]

>>Наиболее удобный выход - ловить события активации и деактивации формы и
хранить флаг, активна ли сейчас форма. Перерисовывать только активную форму.
А еще лучше - своричивать при деактивации.

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

>>Но, надо сказать, такое возможно только на слабом компе или с длительной процедурой прорисовкой окна.

Комп не топовый, но и не отстой.

>>У тебя двойная буферизация включена ?

Да.

>>Ты на API пишешь, или с формой ?
Кстати, да. Открыл Сишный WinAPI проект... Такого нет....
Как можно исправить под дельфей? Очень не хочеться отказывать от формы, хоть компонентов и не использую, переписывание сулит большие проблемы.... А проект завтра желательно показать генеральному и с главным программером детали желательно на работающем проекте обсуждать... :\


Rial   (2006-07-04 18:30:00) [13]

Так оно это, перерисовывается так.
Наиболее удобный выход - ловить события активации и деактивации формы и
хранить флаг, активна ли сейчас форма. Перерисовывать только активную форму.
А еще лучше - своричивать при деактивации.

Но, надо сказать, такое возможно только на слабом компе или с длительной
процедурой прорисовкой окна.
У тебя двойная буферизация включена ?
Ты на API пишешь, или с формой ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо