Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.11;
Скачать: CL | DM;

Вниз

Как убрать мелькания при прорисовке изображений   Найти похожие ветки 

 
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
 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;
//далее используем суперскоростное отображение нашего буферного битмапа на Plan, используя функцию WinAPI:
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.037 c
2-1123459200
Lexa
2005-08-08 04:00
2005.09.11
Работа с cache


3-1122800706
NickMan
2005-07-31 13:05
2005.09.11
Возможен ли такой запрос?


14-1124194962
aod_worm
2005-08-16 16:22
2005.09.11
Проблемы с СОМ-устройством. He-e-e-e-e-lp! Горю!


3-1122537548
Yexel
2005-07-28 11:59
2005.09.11
Help! Миграция SQLServer7 и Win2000->SQLServer2000 и Win2003


4-1122289098
Maverick
2005-07-25 14:58
2005.09.11
Перехват действия программы