Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Paintbox Hintergrundfarbe (https://www.delphipraxis.net/124516-paintbox-hintergrundfarbe.html)

Larsi 20. Nov 2008 12:19


Paintbox Hintergrundfarbe
 
Hi,
ich verwende eine Unit welche eine Spektrum Visualisierung in einer Paintobx anzeigt. Die Hintergrundfarbe hinter den Vis Balken kann man einstellen doch was muss ich da machen damit ich einen transparenten Hintergrund habe in der Paintbox? Wenn ich das mit der BackColor einfach weglasse ist sie Schwarz.

Medium 21. Nov 2008 09:57

Re: Paintbox Hintergrundfarbe
 
Schau mal im OnPaint() der Klasse nach, ob dort irgendwo ein Canvas.Rectangle() oder etwas anderes in der Art über die ganze Größe der PaintBox mit der Farbe gezeichnet wird. Wenn ja, dann das mal auskommentieren. Sollten dann die Balken von vorherigen Bildern stehen bleiben, hilft meistens Invalidate() weiter.

Larsi 24. Nov 2008 12:30

Re: Paintbox Hintergrundfarbe
 
Wenn ich die Rectangle Sachen auskommentiere dann kommt einmal der Effekt dass wie du schon gesagt hast die Balken immer da bleiben aber die Hintergrundfarbe ist immernoch weiß. Vielleicht wisst ihr ja weiter. Hier der Code der Spectrum Vis: (Habe alle meine Änderungen rausgenommen da das wahrscheinlich nicht richtig war)
Delphi-Quellcode:
unit spectrum_vis;
{ Spectrum Visualyzation by Alessandro Cappellozza
  version 0.8 05/2002
  [url]http://digilander.iol.it/Kappe/audioobject[/url]
}

interface
  uses Windows, Dialogs, Graphics, SysUtils, CommonTypes, Classes, BassDLLPlayer;

 type TSpectrum = Class(TObject)
    private
      VisBuff : TBitmap;
      BackBmp : TBitmap;

      BkgColor : TColor;
      SpecHeight : Integer;
      PenColor : TColor;
      PeakColor: TColor;
      DrawType : Integer;
      DrawRes : Integer;
      FrmClear : Boolean;
      UseBkg  : Boolean;
      PeakFall : Integer;
      LineFall : Integer;
      ColWidth : Integer;
      ShowPeak : Boolean;

       FFTPeacks : array [0..128] of Integer;
       FFTFallOff : array [0..128] of Integer;

    public
     Constructor Create (Width, Height : Integer);
     procedure Draw(HWND : THandle; FFTData : TFFTData; X, Y : Integer);
     procedure SetBackGround (Active : Boolean; BkgCanvas : TGraphic);

     property BackColor : TColor read BkgColor write BkgColor;
     property Height : Integer read SpecHeight write SpecHeight;
     property Width : Integer read ColWidth write ColWidth;
     property Pen : TColor read PenColor write PenColor;
     property Peak : TColor read PeakColor write PeakColor;
     property Mode : Integer read DrawType write DrawType;
     property Res : Integer read DrawRes write DrawRes;
     property FrameClear : Boolean read FrmClear write FrmClear;
     property PeakFallOff: Integer read PeakFall write PeakFall;
     property LineFallOff: Integer read LineFall write LineFall;
     property DrawPeak  : Boolean read ShowPeak write ShowPeak;
  end;

 var Spectrum : TSpectrum;

implementation

     Constructor TSpectrum.Create(Width, Height : Integer);
      begin
        VisBuff := TBitmap.Create;
        BackBmp := TBitmap.Create;

          VisBuff.Width := Width;
          VisBuff.Height := Height;
          BackBmp.Width := Width;
          BackBmp.Height := Height;

         BkgColor := clBlack;
          SpecHeight := 100;
          PenColor := clWhite;
          PeakColor := clYellow;
          DrawType := 0;
          DrawRes := 1;
          FrmClear := True;
          UseBkg := False;
          PeakFall := 1;
          LineFall := 3;
          ColWidth := 5;
          ShowPeak := True;
      end;

     procedure TSpectrum.SetBackGround (Active : Boolean; BkgCanvas : TGraphic);
      begin
        UseBkg := Active;
        BackBmp.Canvas.Draw(0, 0, BkgCanvas);
      end;

     procedure TSpectrum.Draw(HWND : THandle; FFTData : TFFTData; X, Y : Integer);
        var i, YPos : LongInt; YVal : Single;
       begin

       if FrmClear then begin
          VisBuff.Canvas.Pen.Color := BkgColor;
          VisBuff.Canvas.Brush.Color := BkgColor;
        VisBuff.Canvas.Rectangle(0, 0, VisBuff.Width, VisBuff.Height);
          if UseBkg then VisBuff.Canvas.CopyRect(Rect(0, 0, BackBmp.Width, BackBmp.Height), BackBmp.Canvas, Rect(0, 0, BackBmp.Width, BackBmp.Height));
       end;

        VisBuff.Canvas.Pen.Color := PenColor;
         for i := 0 to 128 do begin
           YVal := Abs(FFTData[(i * DrawRes) + 5]);
           YPos := Trunc((YVal) * 500);
           if YPos > Height then YPos := SpecHeight;

           if YPos >= FFTPeacks[i] then FFTPeacks[i] := YPos
              else FFTPeacks[i] := FFTPeacks[i] - PeakFall;

           if YPos >= FFTFallOff[i] then FFTFallOff[i] := YPos
              else FFTFallOff[i] := FFTFallOff[i] - LineFall;

              if (VisBuff.Height - FFTPeacks[i]) > VisBuff.Height then FFTPeacks[i] := 0;
              if (VisBuff.Height - FFTFallOff[i]) > VisBuff.Height then FFTFallOff[i] := 0;

              case DrawType of
                0 : begin
                       VisBuff.Canvas.MoveTo(X + i, Y + VisBuff.Height);
                       VisBuff.Canvas.LineTo(X + i, Y + VisBuff.Height - FFTFallOff[i]);
                       if ShowPeak then VisBuff.Canvas.Pixels[X + i, Y + VisBuff.Height - FFTPeacks[i]] := Pen;
                    end;

                1 : begin
                     if ShowPeak then VisBuff.Canvas.Pen.Color := PeakColor;
                     if ShowPeak then VisBuff.Canvas.MoveTo(X + i * (ColWidth + 1), Y + VisBuff.Height - FFTPeacks[i]);
                     if ShowPeak then VisBuff.Canvas.LineTo(X + i * (ColWidth + 1) + ColWidth, Y + VisBuff.Height - FFTPeacks[i]);

                     VisBuff.Canvas.Pen.Color := PenColor;
                     VisBuff.Canvas.Brush.Color := PenColor;
                    VisBuff.Canvas.Rectangle(X + i * (ColWidth + 1), Y + VisBuff.Height - FFTFallOff[i], X + i * (ColWidth + 1) + ColWidth, Y + VisBuff.Height);
                    end;
              end;
         end;

          BitBlt(HWND, 0, 0, VisBuff.Width, VisBuff.Height, VisBuff.Canvas.Handle, 0, 0, srccopy)
       end;
end.

Gausi 24. Nov 2008 12:34

Re: Paintbox Hintergrundfarbe
 
Das ist das Beispiel von der bass.dll oder? Ich denke, man kann die Transparenz dabei nur faken, indem man am Anfang einmal das Hintergrundbild passend initialisiert (procedure SetBackGround). Dann sollte das klappen. Wenn sich der Hintergrund zur Laufzeit ändern kann, muss man entsprechend auch diese Prozedur öfter aufrufen.

Larsi 24. Nov 2008 12:37

Re: Paintbox Hintergrundfarbe
 
Klingt irgendwie ganz richtig aber wie mache ich das? Muss ich das in meiner Anwendung oder in der Unit machen?

Gausi 24. Nov 2008 12:51

Re: Paintbox Hintergrundfarbe
 
Das passende Hintergrundbild bestimmen machst du in der Anwendung, denn die Unit kann ja nicht wissen, wie dein Fenster aussieht. Und dann rufst du Spectrum.SetBackground(True, DeineGrafik); auf.

Larsi 24. Nov 2008 13:05

Re: Paintbox Hintergrundfarbe
 
Ja aber ich will doch gar kein Hintergrundbild.

Gausi 24. Nov 2008 13:09

Re: Paintbox Hintergrundfarbe
 
...dewegen hab ich ja von Transparenz "faken" gesprochen. Nimm als Hintergrund das Bild, das man sehen würde, wenn man nichts in die Paintbox malt.

Larsi 24. Nov 2008 13:15

Re: Paintbox Hintergrundfarbe
 
Geht nicht da dahinter ein Farbverlauf ist der seine Farbe auch mal ändert.

DeddyH 24. Nov 2008 13:17

Re: Paintbox Hintergrundfarbe
 
Zeig mal nen Screenshot.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:11 Uhr.
Seite 1 von 3  1 23      

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