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;