Форум: "Начинающим";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];
ВнизКак убрать мелькания при прорисовке изображений Найти похожие ветки
← →
Nox7777 (2005-08-08 23:58) [0]У меня в таймере идет такой код, который рисует некоторую фигуру, но на экране фигура постоянно мелькает. Как это убрать?
Код:
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;
← →
Marser © (2005-08-09 00:21) [1]Ввводим двойную буферизацию. Производительность, конечно, упадёт, но мелькать не будет:
Plan.DoubleBuffered:=true
← →
Nox777 (2005-08-09 00:33) [2]А куда вводим... Я после бегина поставил... но не работает...
undeclared identifier DoubleBuffered
← →
alex-drob © (2005-08-09 00:36) [3]procedure TForm1.FormCreate(Sender: TObject);
begin
DoubleBuffered:=True;
end;
← →
Nox777 (2005-08-09 00:38) [4]Вот, теперь все работает... Спасибо!
← →
KilkennyCat © (2005-08-09 00:44) [5]Создаем дополнительный битмап-буфер:
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.
← →
Marser © (2005-08-09 00:47) [6]Nox777 (09.08.05 0:33) [2]
Я стал гадать, что такое Plan. И не угадал.
← →
KilkennyCat © (2005-08-09 00:48) [7]P.S.
Мне кажется, это лучше чем встроенный даблбуффер, так как в данном случае Вы будете являться хозяином положения и менять все очень гибко, например, все вычисления и рисования примитивов выполнять в одном потоке, а перенос с буфера на основную поверхность - в другом, когда это потребуется.
← →
ApollonX100 © (2005-08-09 11:00) [8]Я теперь больше не Nox777, я теперь апаллон...
Спасибо KilkennyCat, попробую ваш метод.
Plan-от слова планшет...
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.01 c