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

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

Рисование движущегося прямоугольника [D7, WinXP]


Страницы:   1 2

Юра ©   (2007-07-30 14:13:00) 

Задача: Создать движение прямоугольника.
Что сделал: Реализовал движение очень просто: стирание и рисование в новых координатах, однако при таком способе рисования происходит моргание изображения.
Вопрос: Как от него избавиться?


Инс   (2007-07-30 15:18:00) [21]


> Рисуешь сначала на невидимой канве, а потом ВСЕ ИЗОБРАЖЕНИЕ
> копируешь на видимую. Плюс DoubleBuffered.

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

Я бы делал так:
1. Поставил бы DoubleBuffered форме
2. Рисовал бы в OnPaint
3. По таймеру, увеличивал бы циферку, означающую смещение прямоугольника, и вызывал Invalidate


Юра   (2007-07-30 15:07:00) [22]

Darvin, пожалуйста покажи код...


oxffff   (2007-07-30 15:04:00) [23]


> Юра   (30.07.07 14:58) [10]
> а вот так: смотришь на код и понимаешь какая частота.


Может вставить GetTickCount?
Вдруг получиться?


Darvin   (2007-07-30 15:01:00) [24]

Рисуешь сначала на невидимой канве, а потом ВСЕ ИЗОБРАЖЕНИЕ копируешь на видимую. Плюс DoubleBuffered.


Юра   (2007-07-30 14:58:00) [25]

а вот так: смотришь на код и понимаешь какая частота.


oxffff   (2007-07-30 14:55:00) [26]


> Судите о частоте.


А как?


Юра   (2007-07-30 14:45:00) [27]

в цикле while true do begin
           рисование/стирание
           sleep(50);
           end;
Судите о частоте.


Инс   (2007-07-30 14:43:00) [28]

И с какой частотой такое рисование/стирание происходит?


Юра   (2007-07-30 14:40:00) [29]

Пробовал


oxffff   (2007-07-30 14:39:00) [30]


> Вопрос: Как от него избавиться?


Использовать двойную буферизацию.

DoubleBuffered:=TRUE;


Юра   (2007-07-30 14:37:00) [31]

...
//Стирание
Canvas.Pen.Color := clBtnColor;
Canvas.Rectangle(endLeft,50,endRight,300);
dec(endLeft);
//Рисование
Canvas.Pen.Color := clBlack;
Canvas.Rectangle(endLeft,50,endRight,300);
...


Инс   (2007-07-30 14:32:00) [32]

Тогда код приведите


Юра   (2007-07-30 14:24:00) [33]

Я и стираю только прямоугольник, когда вызываю Rectangle с теми же координатами, только цветом фона?


Инс   (2007-07-30 14:18:00) [34]

Вместо стирания всего, делай только стирание прямоугольника. См. режим рисования XOR или в крайнем случае можно ClipRegion-ом поиграться


Страницы:   1 2

Наверх

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