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

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

Мерцание при перерисовке(GDI+) [D7, WinXP]


Страницы:   1 2 3

unknowing ©   (2007-04-24 20:11:00) 

Рисую окружность с рисками через каждые 10 гр, двигаю стрелку по таймеру... И всё это сильно мерцает:(
Как от этого эффекта избавляются профессионалы??
Привожу кусок кода(строго не судить:):

procedure TMainForm.Draw(Count: Smallint);
var
 graphics   : TGPGraphics;
 Pen        : TGPPen;
 SolidBrush : TGPSolidBrush;

 R,
 X, Y,
 Xc,Yc,
 cs, SN,
 cs2, SN2 : Single;
 CountR   : Integer;

const
 dash : array[0..2] of single = (2, 20, 20);
begin

 graphics := TGPGraphics.Create(PaintBox.Canvas.Handle);
 graphics.Clear(clBlack);
 Pen := TGPPen.Create(MakeColor(0, 255, 0),2);  // салатовый
 
 graphics.SetSmoothingMode(SmoothingModeAntiAlias);  

 R :=PaintBox.Height - 80;      //диаметр окружности
 X:= (PaintBox.Width / 2)-R/2;  //координата х левого верхнего угла прямоугольника
 Y:= (PaintBox.Height / 2)-R/2 ;//координата у левого верхнего угла

 graphics.DrawEllipse(Pen, X, Y, R, R);  // окружность

 Xc := X+(R/2);  //координаты центра окружности
 Yc := Y+(R/2);

//---------------------риски румбов----------------------------
 CountR:=0;
  while CountR<360 do
    begin
           Pen.SetWidth(1);
           cs := Xc+(R/2)*cos(CountR*pi/180);  
           sn := Yc+(R/2)*sin(CountR*pi/180);  

           cs2 := Xc+(7+R/2)*cos(CountR*pi/180);  
           sn2 := Yc+(7+R/2)*sin(CountR*pi/180);  

           if frac(CountR/30) = 0 then
            begin  //параметры для толстых рисок
             Pen.SetWidth(3); //
             sn2 := Yc+(10+R/2)*sin(CountR*pi/180);  
            end;
           graphics.DrawLine(pen, cs, sn,cs2,sn2); //рисуем риску

           Inc(CountR,10);
    end;

//---------------------------------------------------------------

//---------------------движение стрелки-----------------------
           Pen.SetWidth(2);
           cs := Xc+(R/2)*cos(Count*pi/180);  
           sn := Yc+(R/2)*sin(Count*pi/180);  

           cs2 := Xc+(R/2 - 15)*cos((10+Count)*pi/180);  
           sn2 := Yc+(R/2 - 15)*sin((10+Count)*pi/180);

           graphics.DrawLine(pen, cs,sn, cs2,sn2);      //стрелка (левая)

           cs2 := Xc+(R/2- 15)*cos((-10+Count)*pi/180);  
           sn2 := Yc+(R/2- 15)*sin((-10+Count)*pi/180);  

           graphics.DrawLine(pen, cs,sn, cs2,sn2);      //стрелка (правая)
//---------------------------------------------------------------

//-----------------------базовые линии окружности-------------
 Pen.SetWidth(0.5);
 Pen.SetDashPattern(@dash, 4);
 graphics.DrawLine(Pen,Xc,Yc-R/2-15,Xc,Yc+R/2+15); //горизонтальная базовая линия окружности
 graphics.DrawLine(Pen,Xc-R/2-15,Yc,Xc+R/2+15,Yc);

//---------------------------------------------------------------
 Pen.Free;
 graphics.Free;
end; //Draw

procedure TMainForm.FormCreate(Sender: TObject);
begin
Count:=0;
end;

procedure TMainForm.Timer1Timer(Sender: TObject);
begin
INC(Count,10);
Draw(Count);
//Timer1.Interval=500;
end;


unknowing   (2007-04-24 20:37:00) [41]


> Fenik ©   (24.04.07 20:28) [1]

DoubleBuffered := true; - не помогает, к сожалению:(

> А лучше делать ручную буферизацию: рисовать в памяти на
> битмапе, с которого копировать на форму.

это как, если не секрет:) ?


Fenik   (2007-04-24 20:28:00) [42]

Простейший вариант: у панели или формы, на которой лежит пэинтбокс, сделать: DoubleBuffered := true;

А лучше делать ручную буферизацию: рисовать в памяти на битмапе, с которого копировать на форму.


Страницы:   1 2 3

Наверх

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