![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Мерцание при перерисовке(GDI+) [D7, WinXP]
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;
А лучше делать ручную буферизацию: рисовать в памяти на битмапе, с которого копировать на форму.