Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.01 c
4-1121870239
Profik
2005-07-20 18:37
2005.09.11
Прога в трее


14-1123713626
IncRed
2005-08-11 02:40
2005.09.11
Системные требования .NET


4-1121359278
SpyBoy
2005-07-14 20:41
2005.09.11
Определение программы


1-1124727045
Juice
2005-08-22 20:10
2005.09.11
Выполнить ПРОИЗВОЛЬНУЮ функцию(или метод) в отдельном потоке


4-1122099193
***_Diman_***
2005-07-23 10:13
2005.09.11
как отловить DTN_CLOSEUP?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский