|
Вопрос # 1 401/ вопрос открыт / |
|
Здравствуйте, эксперты! У меня такой вопрос. Есть программа, раз в N секунд берущая данные из массива (игра "Жизнь"), рисующая кружки на невидимом графическом компоненте и затем копирующая на видимый. Все это страшно мерцает. Как от этого избавиться?
 |
Вопрос задал: Вадим (статус: Посетитель)
Вопрос отправлен: 10 марта 2008, 11:57
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Вадим!
Очень типичная проблема. Дело в том, что вы хотите рисовать, когда вам хочеться, а надо, когда Windows (она же ОС - операционная среда) готова. Именно по этому происходить двойное обновление, которое и приводит к мерцаниям.
Поэтому, нарисованную картинку следует переносить на экран в событии OnPaint соответсвующего компонента. Для того, что бы спровоцировать операционную среду на обновление, можно вызывать метод repaint или refresh соответствующего компонента. Но тут есть одно маленькое но. Запрос на обновление изображения может быть проигнорирован ОС, если в очереди событий уже есть такой или ОС.
Можно также использовать так называемую двойную буферизацию, которая уже встроена в ОС. Для этого в OnCreate достаточно написать DoubleBuffered := True; Можно для начала попробывать это, а вот если результат не удоволетворит - тогда уже заниматься первым.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 10 марта 2008, 16:12
|
Ответ #2. Отвечает эксперт: Feniks
Здравствуйте, Вадим!
Попробуйте рисовать на НЕ не видемом компоненте, а в памяти, использую битмап. А потом копировать его на канву видимомго компонента спомощью функции BitBlt. Т.е. сначало создаете TBitmap.Create. Рисуете на нем, делаете все необходимые манипуляции, а в нужный момент (используя советы Вадим К) копируете все функцией BitBlt.
BitBlt(DestBmp, X1, Y1, X2, Y2, SourceBmp, 0, 0, SRCCOPY);
Описание всех параметров и флагов функции описаны в Хелпе.
Еще варианты смотрите в Приложении.
Приложение: Переключить в обычный режим- 1.
-
-
-
-
- InvalidateRect( Handle, NIL, FALSE ) ;
-
-
-
-
-
- ControlStyle := ControlStyle + [ csOpaque ] ;
-
-
-
- 2.
-
- constructor TMyControl.Create;
- begin
- inherited;
- ControlStyle := ControlStyle + [csOpaque];
- end;
 |
Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 11 марта 2008, 11:36
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|