Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Brauche Hilfe mit der Graphics32 Lib! (https://www.delphipraxis.net/159573-brauche-hilfe-mit-der-graphics32-lib.html)

Wishmaster 3. Apr 2011 09:33

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.

alfold 3. Apr 2011 10:18

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

wicht 3. Apr 2011 11:39

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.

Wishmaster 5. Apr 2011 04:50

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