![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как убрать мелькания при прорисовке изображений
Nox7777 © (2005-08-08 23:58:00)У меня в таймере идет такой код, который рисует некоторую фигуру, но на экране фигура постоянно мелькает. Как это убрать?
Код:
begin
Plan.Canvas.Pen.Color:=clBlack;
Plan.Canvas.Rectangle(0,0,560,360);
Plan.Canvas.Pen.Color:=clBlue;
Plan.Canvas.Ellipse(Map[1,0]-2,Map[1,1]-2,Map[1,0]+2,Map[1,1]+2);
Plan.Canvas.Ellipse(Map[1,0]-1,Map[1,1]-1,Map[1,0]+1,Map[1,1]+1);
for i:=2 to kolpoint do
begin
Plan.Canvas.Pen.Color:=clGreen;
Plan.Canvas.MoveTo(Map[i-1,0],Map[i-1,1]);
Plan.Canvas.LineTo(Map[i,0],Map[i,1]);
Plan.Canvas.Pen.Color:=clBlue;
Plan.Canvas.Ellipse(Map[i,0]-2,Map[i,1]-2,Map[i,0]+2,Map[i,1]+2);
Plan.Canvas.Ellipse(Map[i,0]-1,Map[i,1]-1,Map[i,0]+1,Map[i,1]+1);
end;
ApollonX100 (2005-08-09 11:00:00) [1]Я теперь больше не Nox777, я теперь апаллон...
Спасибо KilkennyCat, попробую ваш метод.
Plan-от слова планшет...
KilkennyCat (2005-08-09 00:48:00) [2]P.S.
Мне кажется, это лучше чем встроенный даблбуффер, так как в данном случае Вы будете являться хозяином положения и менять все очень гибко, например, все вычисления и рисования примитивов выполнять в одном потоке, а перенос с буфера на основную поверхность - в другом, когда это потребуется.
Marser (2005-08-09 00:47:00) [3]Nox777 (09.08.05 0:33) [2]
Я стал гадать, что такое Plan. И не угадал.
KilkennyCat (2005-08-09 00:44:00) [4]Создаем дополнительный битмап-буфер:
Var
BMP : TBitMap;
...
TForm1.onCreate...
begin
...
BMP := TBitMap.Create;
BMP.Width := Plan.Width;
BMP.Height := Plan.Height:
...
end;
не забудем сразу же и о его убиении:
TForm1.onClose...
begin
...
BMP.Free;
...
end;
Теперь используем его:
begin//далее используем суперскоростное отображение нашего буферного битмапа на Plan, используя функцию WinAPI:
With BMP.Canvas do begin //это чтобы много раз не писать BMP.Canvas
Pen.Color:=clBlack;
Rectangle(0,0,560,360);
Pen.Color:=clBlue;
Ellipse(Map[1,0]-2,Map[1,1]-2,Map[1,0]+2,Map[1,1]+2);
Ellipse(Map[1,0]-1,Map[1,1]-1,Map[1,0]+1,Map[1,1]+1);
for i:=2 to kolpoint do begin
Pen.Color:=clGreen;
MoveTo(Map[i-1,0],Map[i-1,1]);
LineTo(Map[i,0],Map[i,1]);
Pen.Color:=clBlue;
Ellipse(Map[i,0]-2,Map[i,1]-2,Map[i,0]+2,Map[i,1]+2);
Ellipse(Map[i,0]-1,Map[i,1]-1,Map[i,0]+1,Map[i,1]+1);
end;
end;
BitBlt(Plan.Canvas.Handle,0,0,Plan.Width,Plan.Height,BMP.Canvas.Handle,0,0,0);
End;
Можно таким же образом создать еще и очищающий буферный битмап, который будет просто накладываться на буфер для рисования той же функцией BitBlt c целью очистки.
Подобные решения работают в DirectX.
Nox777 (2005-08-09 00:38:00) [5]Вот, теперь все работает... Спасибо!
alex-drob (2005-08-09 00:36:00) [6]procedure TForm1.FormCreate(Sender: TObject);
begin
DoubleBuffered:=True;
end;
Nox777 (2005-08-09 00:33:00) [7]А куда вводим... Я после бегина поставил... но не работает...
undeclared identifier DoubleBuffered
Marser (2005-08-09 00:21:00) [8]Ввводим двойную буферизацию. Производительность, конечно, упадёт, но мелькать не будет:
Plan.DoubleBuffered:=true