Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.04;
Скачать: CL | DM;

Вниз

Рисование без мерцания?   Найти похожие ветки 

 
Артем К.   (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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.021 c
1-1087885076
wild_arg
2004-06-22 10:17
2004.07.04
Поиск решения в многомерном пространстве


1-1087886239
san
2004-06-22 10:37
2004.07.04
Grid с большой шапкой шапкой


8-1082402611
DimaK
2004-04-19 23:23
2004.07.04
Заливка


1-1087222997
P@vel
2004-06-14 18:23
2004.07.04
Record


6-1083741447
pirate
2004-05-05 11:17
2004.07.04
Сетевые соединения