Ich benutze TImage32 + Bass.dll um die (Audio-Sample-Date) zu zeichnen.
Nun möchte ich 3 vertikale Linien zeichnen die ich dann mit der Maus Verschieben kann.
Wen ich ImageBuffer.Canvas.MoveTo(x, y); benutze, wird diese gelöscht sobald ein anderes Fenster drüber gezogen wird. Und wen ich ImageBuffer.Bitmap.MoveToF(x, 0); benutze wird das
Canvas nicht Erneuert!
function TTrackProperties_Form.ProgressCallback(FileName: String; Progress: Double; var AbortSampling: Boolean; EventType: TSampleDisplayEvent; User: Pointer): Boolean; stdcall; var
State: String; begin if EventType = sdeSampling then State := 'Sampling '; if EventType = sdeDrawing then State:= 'Drawing '; if EventType = sdeStretching then State := 'Stretching ';
Caption := State + FloatToStr(Progress) + '%';
Result := True; end;
function HexToInt(HexStr: String): Integer; begin
Result := StrToInt('$' + HexStr); end;
Procedure TTrackProperties_Form.DrawSample(Filename : String); var SampleOptions: TSamplePictureOptions;
SampleDisplay: TSampleDisplayThread; begin
try try
ZeroMemory(@SampleOptions, SizeOf(TSamplePictureOptions));
SampleOptions.SampleLeft := HexToInt('FF00FF00');
SampleOptions.SampleRight:= HexToInt('FFFF0000');
SampleOptions.SampleBackground:= clBlack32;
SampleOptions.AntiAliasingLevel := 2;
SampleOptions.ProgressCallback := ProgressCallback; //* Reasonable value is between 250 - 1000 ms
SampleOptions.CallbackInterval := 20; // if ImageAudio.Bitmap.Empty then
ImageBuffer.Bitmap.Width := ImageBuffer.Width;
ImageBuffer.Bitmap.Height := ImageBuffer.Height;
ImageBuffer.Bitmap.Clear(clBlack32);
procedure TTrackProperties_Form.DrawTime_Line(Position, TimeSec : Int64; y : integer; cl : TColor); var
Time, X : Integer; begin
Time:= TimeSec;
X:= position div bpp;
Kann es sein das Du die Procedure nicht im Timer mit eingebunden hast bzw Du kein refresh aufrufst?
So wie es im Original Demo (zwar ohne Graphics32) ist ?
Ich würde eine neue Klasse bauen, die von TCustomControl ableitet. Dort einfach Paint() überschreiben und immer das ganze 'Bild' neu malen. Falls du ein Beispiel suchst, schau mal in die Quelltexte von streamWriter, in der Datei CutView.pas ist etwas, was dem, du hier vorhast, sehr nahe kommt.
Das mit dem Timer das hatte ich vorher schon und es hat auch gefunzt. Aber auch nur wen ich nur eine Linie Gezeichnet hatte. Sobald ich ne zweite und dritte Linie dazu-gemacht hatte hat es so stark geblinkt das das man keine Linie erkennen konnte!
Das Problem lag daran das ich ImageBuffer.Refresh; innerhalb der Procedure DrawTime_Line ausgeführt hatte.
Ich habe ImageBuffer.Refresh jetzt innerhalb der OnTime Procedure und somit wird ImageBuffer.Refresh nur einmal aufgerufen.