Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.036 c
4-1085217844
trix
2004-05-22 13:24
2004.07.04
Как програмно нажать клавиши


14-1087390151
Knight
2004-06-16 16:49
2004.07.04
Кто играл на лобзике?


4-1085650758
Aleksandr.
2004-05-27 13:39
2004.07.04
Не могу нормально изменить размеры окна


8-1082012439
xman
2004-04-15 11:00
2004.07.04
canvas


3-1086642535
Inkotex
2004-06-08 01:08
2004.07.04
Добавление строки в DBGrid





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