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. |
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.
|
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. |
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.
|
Re: Paintbox Hintergrundfarbe
Klingt irgendwie ganz richtig aber wie mache ich das? Muss ich das in meiner Anwendung oder in der Unit machen?
|
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.
|
Re: Paintbox Hintergrundfarbe
Ja aber ich will doch gar kein Hintergrundbild.
|
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.
|
Re: Paintbox Hintergrundfarbe
Geht nicht da dahinter ein Farbverlauf ist der seine Farbe auch mal ändert.
|
Re: Paintbox Hintergrundfarbe
Zeig mal nen Screenshot.
|
Re: Paintbox Hintergrundfarbe
Liste der Anhänge anzeigen (Anzahl: 1)
Hier bitte. Die Farben des Farbverlaufs sind aber nicht statisch außer ändern sich manchmal.
|
Re: Paintbox Hintergrundfarbe
Du kannst Dir doch einen schmalen Streifen vom Bereich neben der Paintbox in eine temporäre Bitmap kopieren (in der Höhe der Paintbox) und diese per StretchBlt auf die Paintbox zeichnen.
|
Re: Paintbox Hintergrundfarbe
Und wie macht man das?
|
Re: Paintbox Hintergrundfarbe
Z.B. mit TCanvas.CopyRect bzw. BitBlt.
|
Re: Paintbox Hintergrundfarbe
Nee, das Zeichnen? EInfach mit Rectangle?
|
Re: Paintbox Hintergrundfarbe
Du willst doch dynamisch ein gefaktes "Hintergrundbild" erstellen, oder? Also erstellst Du Dir eine Speicherbitmap in Höhe und Breite der Paintbox, kopierst Dir da den benachbarten Bereich hinein und zeichnest diese Bitmap dann auf den Canvas der Paintbox wie bisher.
|
Re: Paintbox Hintergrundfarbe
Wie erstelle ich dieses Bitmap? :stupid:
|
Re: Paintbox Hintergrundfarbe
Du weißt nach 1600 Beiträgen nicht, wie man eine Bitmap erstellt? TBitmap.Create wäre doch mal ein guter Ansatz, oder nicht?
|
Re: Paintbox Hintergrundfarbe
Das ist mir auch klar aber ich weiß nicht wie ich den Bereich neben der Paintobx dareinbekomme :)
|
Re: Paintbox Hintergrundfarbe
Der Farbverlauf wird ja wohl auf den Canvas der Form gezeichnet, oder?
|
Re: Paintbox Hintergrundfarbe
Nee, das macht eine Komponente (JvGradient). Die hat kein Canvas.
|
Re: Paintbox Hintergrundfarbe
Ich habe die JEDIS hier nicht installiert, aber irgendwodrauf muss die Komponente ja zeichnen. Schau mal im Source nach, wodrauf (Form.Canvas evtl.?).
|
Re: Paintbox Hintergrundfarbe
Auf der Form Canvas zeichnet die nicht, sondenr auf sich selbst.
|
Re: Paintbox Hintergrundfarbe
Dann müsste sie doch theoretisch auch einen Canvas haben, nur vielleicht nicht public.
|
Re: Paintbox Hintergrundfarbe
Das Problem bei dem Zeichnen des Vis ist übrigens dass es erst auf ein temporäres Bitmap zeichnet, und dies dann auf den Canvas blittet. Du könntest es so umbauen, dass das Vis das temp. Bitmap weg lässt und sofort auf den Ziel-Canvas zeichnet, wobei dann ganz sicher ein Invalidate nötig wird, und ich bin mir nicht ganz sicher, ob dann ein "TForm.Doublebuffered := true" ausreicht um Flackern auszuschließen.
Der sauberere Weg ist sicherlich der zuletzt vorgeschlagene Weg mittels Vorgabe des Hintergrundes. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:09 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