Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

DNK
I. DNK
Баллы: 5

Подробнее »



Вопрос # 1 401

/ вопрос открыт /

Здравствуйте, эксперты! У меня такой вопрос. Есть программа, раз в N секунд берущая данные из массива (игра "Жизнь"), рисующая кружки на невидимом графическом компоненте и затем копирующая на видимый. Все это страшно мерцает. Как от этого избавиться?

Приложение:
  1. Delphi 6, Win XP SP2


Вадим Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Вадим (статус: Посетитель)
Вопрос отправлен: 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. 1.
  2.  
  3.  
  4.  
  5.  
  6. InvalidateRect( Handle, NIL, FALSE ) ;
  7.  
  8.  
  9.  
  10.  
  11.  
  12. ControlStyle := ControlStyle + [ csOpaque ] ;
  13.  
  14.  
  15.  
  16. 2.
  17.  
  18. constructor TMyControl.Create;
  19. begin
  20. inherited;
  21. ControlStyle := ControlStyle + [csOpaque];
  22. end;


Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 11 марта 2008, 11:36


Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 19 августа 2017, 21:49
Выполнено за 0.03 сек.
Рейтинг@Mail.ru