Einzelnen Beitrag anzeigen

BenjaminH

Registriert seit: 14. Okt 2004
Ort: Freiburg im Breisgau
713 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Schnell wiederholt in PaintBox zeichnen (Bitblt)

  Alt 27. Okt 2009, 15:09
Zitat von Uwe Raabe:
Wenn ich mich recht erinnere, muss das Zeichnen in die PaintBox im OnPaint-Event erfolgen, da die PaintBox keinen Speicher für den Zeicheninhalt bereitstellt.
Das ist zwar richtig, in dem Fall aber glaube ich leider irrelevant. Zwar "erinnert" sich die PaintBox nicht mehr an ihren Inhalt, wenn sie einmal geleert wurde, das ist aber egal, weil sie 40 mal pro Sekunde neu befüllt wird.

Die Zeichenroutine sieht so aus:
Delphi-Quellcode:
procedure paintSpectrum;
var
  i: Integer;
  y: Integer;
  sc:INteger; //Skalierung;
  b0,b1:Integer;
  rect:TRect;
  avg:Single;
begin
  //Fläche schwarz machen
  Rect.Left:=0;
  Rect.Top:=0;
  Rect.Right:=Spectrum.Width+1;
  Rect.Bottom:=Spectrum.Height+1;
  with Spectrum.Canvas do
  begin
    brush.Color:=clBlack;
    FillRect(Rect);
  end;
  
  //Jedes Band zeichnen
  b1:=1;
  for i := 0 to Bands - 1 do
  begin
    //Breite des Bandes
    b0:=b1-1;
    b1:=Trunc(Power(2, i * 10.0 / (BANDS - 1)));

    //Skalierungsfaktor
    sc:=10 + b1 - b0;

    //Wert des Bandes(skaliert)
    Y := Trunc((sqrt(MainForm.BandHistory[i,MainForm.Histposition-1] / log10(SC)) * 1.7 * Spectrum.Height) - 4);

    //Band zeichnen
    Rect.Left:=trunc(i*spectrum.width/bands);
    Rect.Top:=spectrum.Height-y;
    Rect.Right:=trunc((i+1)*spectrum.width/bands);
    Rect.Bottom:=spectrum.Height;
    with Spectrum.Canvas do
    begin
      //Ausgewähltes Band in Gelb, sonst grün
      if i=MainForm.SelectedBand then
        Brush.Color:=clYellow
      else
        Brush.Color:=clGreen;
      FillRect(Rect);
    end;
  
    //Durchschnitt des Bandes
    avg:=MainForm.AverageBandEnergy(MainForm.BandHistory[i]);
     
    //Durchschnittswert des Bandes einzeichnen
    Y := Trunc((sqrt(avg / log10(SC)) * 1.7 * Spectrum.Height) - 4);
    Spectrum.Canvas.Pen.Color:=clRed;
    Spectrum.Canvas.MoveTo(Rect.Left,Spectrum.Height-Y);
    Spectrum.Canvas.LineTo(Rect.Right,Spectrum.Height-Y);

    //Schwellwert einzeichnen
    Y :=Trunc((sqrt(avg*MainForm.DetectingFactor / log10(SC)) * 1.7 * Spectrum.Height) - 4);
    Spectrum.Canvas.Pen.Color:=clYellow;
    Spectrum.Canvas.MoveTo(Rect.Left,Spectrum.Height-Y);
    Spectrum.Canvas.LineTo(Rect.Right,Spectrum.Height-Y);
  end;
  //Auf Zeichenfläche übertragen
  BitBlt(MainForm.PaintBox1.Canvas.Handle, 0,0,spectrum.width,Spectrum.height,spectrum.Canvas.Handle, 0,0,SRCCOPY);
end;
Benjamin
  Mit Zitat antworten Zitat