Главная страница
    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.009 c
14-1123495177
WondeRu
2005-08-08 13:59
2005.09.11
Только узнал, что Longhorn переименовали в Vista ...


2-1123456671
TIGOS
2005-08-08 03:17
2005.09.11
Дурацкий вопрос. По-поводу конвертирования текст -> в Real


1-1124175346
Gorinich
2005-08-16 10:55
2005.09.11
MSHTML_TLD, IHTMLDocument2


3-1122486388
Djek
2005-07-27 21:46
2005.09.11
Добавление значений в список Items в ComboBox


3-1122631133
serjufa
2005-07-29 13:58
2005.09.11
вылезает ошибка про отсутст. mdx файла





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский