Главная страница
    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.057 c
1-1087464505
Alek
2004-06-17 13:28
2004.07.04
Работа с битами


14-1087382544
Undert
2004-06-16 14:42
2004.07.04
MySQL - LIKE - почему не воспринимает русские буквы ?


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


14-1087268584
Ozone
2004-06-15 07:03
2004.07.04
Папки коллективного доступа


14-1087300358
IllusoryOrion
2004-06-15 15:52
2004.07.04
Настройка IE 6.0





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