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

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

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


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
 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.


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


Наверх

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