Brauche Hilfe mit der Graphics32 Lib!
Liste der Anhänge anzeigen (Anzahl: 2)
Hi
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!
Delphi-Quellcode:
ImageBuffer: TImage32; 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); SampleDisplay:= TSampleDisplayThread.Create(Filename, ImageBuffer.Bitmap, SampleOptions); SampleDisplay.Resume; except // error end; finally end; end; procedure TTrackProperties_Form.DrawTime_Line(Position, TimeSec : Int64; y : integer; cl : TColor); var Time, X : Integer; begin Time:= TimeSec; X:= position div bpp; // ImageBuffer.Bitmap.Clear(clTrBlack32); ImageBuffer.Bitmap.DrawMode:= dmTransparent; ImageBuffer.Bitmap.SetStipple([clRed32, clRed32, clRed32, clRed32, 0, 0, 0, 0]); ImageBuffer.Bitmap.MoveToF(x, 0); ImageBuffer.Bitmap.LineToFSP(x, ClientHeight); { ImageBuffer.Refresh; ImageBuffer.Canvas.Pen.Color:= clSilver; ImageBuffer.Canvas.Pen.Width:= 1; ImageBuffer.Canvas.MoveTo(x, 0); ImageBuffer.Canvas.LineTo(x, ClientHeight); } end; procedure TTrackProperties_Form.ImageBufferMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer; Layer: TCustomLayer); begin DrawTime_Line(X, 0, 0, clRed); end; Danke für eure Hilfe!!! Thx. |
AW: Brauche Hilfe mit der Graphics32 Lib!
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 ? alfold |
AW: Brauche Hilfe mit der Graphics32 Lib!
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.
|
AW: Brauche Hilfe mit der Graphics32 Lib!
Hi. und danke für eure Antwort.
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz