![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Рисование движущегося прямоугольника [D7, WinXP]
Юра © (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-ом поиграться