Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Рисование без мерцания? [D7, WinXP]


Артем К. ©   (2004-06-17 03:58:00) 

Здравствуйте, Уважаемые Мастера!

Делаю компонент, что-то типа эмулятора спидометра.
Он у меня должен отображать значения через каждые 50 мс.

Помещаю его и таймер на форму. Делаю обработку в таймере.

Все нормально работает, но вот спидометр мерцает (очень сильно раздражает).

Подскажите как избавиться от этого недуга :(.

Заранее, спасибо!


wicked   (2004-06-17 11:47:00) [1]


> DoubleBuffered := true

я бы рекомендовал сначала добавить к ControlStyle значение csOpaque - всё же менее тяжелый вариант, чем DoubleBuffered...


lyeh   (2004-06-17 04:51:00) [2]


> Ну в принципе я и сам разобрался - надо поставить в констуктор
> DoubleBuffered := true

И что, работает?


Артем К.   (2004-06-17 04:17:00) [3]

Ну в принципе я и сам разобрался - надо поставить в констуктор DoubleBuffered := true


Артем К.   (2004-06-17 04:06:00) [4]


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;
//----------------------------------------------------------


default   (2004-06-17 04:00:00) [5]

код в студию


Наверх

Титульная страница Поиск, карта сайта Написать письмо