Форум: "Основная";
Текущий архив: 2004.07.04;
Скачать: [xml.tar.bz2];
ВнизРисование без мерцания? Найти похожие ветки
← →
Артем К. (2004-06-17 03:58) [0]Здравствуйте, Уважаемые Мастера!
Делаю компонент, что-то типа эмулятора спидометра.
Он у меня должен отображать значения через каждые 50 мс.
Помещаю его и таймер на форму. Делаю обработку в таймере.
Все нормально работает, но вот спидометр мерцает (очень сильно раздражает).
Подскажите как избавиться от этого недуга :(.
Заранее, спасибо!
← →
default © (2004-06-17 04:00) [1]код в студию
← →
Артем К. (2004-06-17 04:06) [2]
procedure TADAMSensor.SetValue(Value: double);
begin
if (FValue <> Value) then begin
FValue := Value;
if (FValue > FMaxValue) then
FValue := FMaxValue;
Invalidate;
end;
end;
procedure TADAMSensor.Paint;
const
Step = 2 * Pi / 360;
var
i, j: integer;
Region, TextRegion: TRect;
Points: array [0..270] of TPoint;
Values: array [0..10] of double;
Icon: TBitmap;
begin
DecimalSeparator := ".";
Region := ClientRect;
with Canvas do
with Region do begin
Brush.Color := clBlack;
Bottom := 200;
FillRect(Region);
Icon := TBitmap.Create;
Icon.Handle := LoadBitmap(HInstance, "SENSOR");
Draw(28, 28, Icon);
SetBKMode(Handle, 0);
Font.Color := clWhite;
Values[0] := MinValue;
for i := 1 to 10 do
Values[i] := Values[i - 1] + (MaxValue - MinValue) / 10;
for i := 0 to 270 do
with Points[i] do begin
X := Round(97 + cos(pi / 2 + i * Step) * 68);
Y := Round(97 + sin(pi / 2 + i * Step) * 68);
if (i mod 27 = 0) then begin
Icon.Handle := LoadBitmap(HInstance, "POINT");
Draw(X, Y, Icon);
end;
end;
for j := 0 to 10 do
with Points[j * 27] do begin
if (j * 27 = 0) then
TextOut(X - TextWidth(FloatToStr(MinValue)) div 2, Y + 2, FloatToStr(MinValue));
if (j * 27 = 27) then
TextOut(X - TextWidth(FloatToStr(Values[j])) + 3, Y + 2, FloatToStr(Values[j]));
if (j * 27 = 54)then
TextOut(X - TextWidth(FloatToStr(Values[j])) + 1, Y + 2, FloatToStr(Values[j]));
if (j * 27 = 81) then
TextOut(X - TextWidth(FloatToStr(Values[j])) - 2, Y - 5, FloatToStr(Values[j]));
if (j * 27 = 108) then
TextOut(X - TextWidth(FloatToStr(Values[j])) - 2, Y - 6, FloatToStr(Values[j]));
if (j * 27 = 135) then
TextOut(X - TextWidth(FloatToStr(Values[j])) - 2, Y - 10, FloatToStr(Values[j]));
if (j * 27 = 162) then
TextOut(X - TextWidth(FloatToStr(Values[j])) div 2, Y - 13, FloatToStr(Values[j]));
if (j * 27 = 189) then
TextOut(X - TextWidth(FloatToStr(Values[j])) div 2 + 2, Y - 13, FloatToStr(Values[j]));
if (j * 27 = 216) then
TextOut(X, Y - 13, FloatToStr(Values[j]));
if (j * 27 = 243) then
TextOut(X + 3, Y - 10, FloatToStr(Values[j]));
if (j * 27 = 270) then
TextOut(X + 3, Y - 7, FloatToStr(Values[j]));
end;
Pen.Color := clWhite;
MoveTo(97, 97);
LineTo(Points[Round(Value * 27 / ((MaxValue - MinValue) / 10))].X, Points[Round(Value * 27 / ((MaxValue - MinValue) / 10))].Y);
Icon.Handle := LoadBitmap(HInstance, "CENTER");
Icon.Transparent := true;
Draw(94, 94, Icon);
Icon.Free;
Pen.Color := clBtnShadow;
MoveTo(Left, 200);
LineTo(Right, 200);
Pen.Color := clBtnHighlight;
MoveTo(Left, 201);
LineTo(Right, 201);
Pen.Color := clBtnShadow;
MoveTo(Left, 220);
LineTo(Right, 220);
Pen.Color := clBtnHighlight;
MoveTo(Left, 221);
LineTo(Right, 221);
Font.Color := clWindowText;
TextRegion := Rect(Left + 3, Top + 204, Right - 4, 228);
DrawText(Handle, @Caption[1], -1, TextRegion, DT_CENTER or DT_SINGLELINE);
TextRegion := Rect(Left + 3, Top + 224, Right - 4, 248);
DrawText(Handle, pchar(FloatToStr(Value) + " " + Units), -1, TextRegion, DT_RIGHT or DT_SINGLELINE);
{TextOut(Left + 3, 204, Description);
TextOut(Left + 3, 224, pchar(FloatToStr(Value) + " " + Units));
end;
end;
//----------------------------------------------------------
← →
Артем К. (2004-06-17 04:17) [3]Ну в принципе я и сам разобрался - надо поставить в констуктор DoubleBuffered := true
← →
lyeh © (2004-06-17 04:51) [4]
> Ну в принципе я и сам разобрался - надо поставить в констуктор
> DoubleBuffered := true
И что, работает?
← →
wicked © (2004-06-17 11:47) [5]
> DoubleBuffered := true
я бы рекомендовал сначала добавить к ControlStyle значение csOpaque - всё же менее тяжелый вариант, чем DoubleBuffered...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.07.04;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.057 c