AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

BitBlt und Transparenz

Ein Thema von EWeiss · begonnen am 4. Mai 2015 · letzter Beitrag vom 11. Mai 2015
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

BitBlt und Transparenz

  Alt 4. Mai 2015, 07:26
Ich erstelle ein Spectrogram

Delphi-Quellcode:
procedure TSpectrogram.DrawSpectrogram;
var
  i, k, m: Integer;
  MagLn: Byte;
  x: PByteArray;
  OffsetX: Integer;
  FFTData: TFFTData;
begin

  if BassDataAvailable then
    FFTData := BassChannelGetFFTData;
  begin
    OffsetX := 2;
    for i := 0 to pred(Height) do
    begin
      MagLn := round(Sqrt(FFTData[i + 1]) * 3 * Width);
      k := Height - i - 1;

      x := BuffBMP.ScanLine[k];

      if bRTLScroll then
      begin
        //copy original scanline
        Move(x[OffsetX], x[0], (Width - OffsetX));

        //draw new pixels
        for m := 0 to pred(OffsetX) do
          x[Width - OffsetX + m] := MagLn;
      end
      else
      //Left to right
      begin
        //copy original scanline
        Move(x[0], x[OffsetX], (Width - OffsetX));

        //draw new pixels
        for m := 0 to pred(OffsetX) do
          x[m] := MagLn;
      end;
    end;
  end;

  BitBlt(PaintDC, 0, 0, Width, Height, BuffBMP.Canvas.Handle, 0, 0, SRCCOPY);

  bMonitoring := True;

end;
Das Problem ist nun wenn ich BitBlt verwende und mein Window Transparent ist wird mein
Child-Window auf dem ich das Bitmap kopiere auch Transparent.

Wie kann ich die Daten ohne BitBlt direkt auf mein Child-Window kopieren?
DiBits geht auch nicht falls jemand auf die Idee kommen sollte.


gruss
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.487 Beiträge
 
Delphi 12 Athens
 
#2

AW: BitBlt und Transparenz

  Alt 4. Mai 2015, 10:55
BitBlt macht das schon richtig, besser bekommt man das auch selbst nicht hin.

Das Parent-Window darf an der Stelle, an der das Spektogramm darstellt wird, einfach nicht transparent sein.
Wie wurde den der Transparent-Effekt hergestellt?
Handelt es sich wirklich um ein Child-Window (Nachkomme von TWinControl)?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: BitBlt und Transparenz

  Alt 4. Mai 2015, 16:56
BitBlt macht das schon richtig, besser bekommt man das auch selbst nicht hin.
Das Parent-Window darf an der Stelle, an der das Spektogramm darstellt wird, einfach nicht transparent sein.
Ach Nein?
Oh seltsam ist nur das dass gleiche Window wenn ich ein Oscilloscope darauf zeichne nicht Transparent wird.
Es macht also schon einen Unterschied ob ich ein komplettes Bild Blite oder Pixelweise auf das Window zeichne.

Zitat:
Handelt es sich wirklich um ein Child-Window (Nachkomme von TWinControl)?
Nö..
API-Window (WS_CHILD)

Zitat:
Wie wurde den der Transparent-Effekt hergestellt?
DWMBlur..

Im Anhang kann man sehen was ich meine.

grus

Geändert von EWeiss (11. Jul 2019 um 15:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#4

AW: BitBlt und Transparenz

  Alt 4. Mai 2015, 17:24
Was heißt Pixelweise Zeichnen? Im Sinne von selber? Da wird sowieso standartmässig immer ein Alphawert von 255 verwendet.
BitBlt wird mit SRCCOPY benutzt, was die PerPixel-Werte überträgt. Ein Rendertarget in Windows ist IIRC standartmässig 32Bit.
Du könntest (wenn du unbedingt von Fenster zu fenster kopieren musst) auch MaskBlt mit einer komplett nicht transparenten Maske verwenden.
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: BitBlt und Transparenz

  Alt 4. Mai 2015, 17:31
Zitat:
Was heißt Pixelweise Zeichnen? Im Sinne von selber?
Seht euch doch die Bilder an die sagen doch alles..
Transparent und mit
Delphi-Quellcode:
GDIP_DrawLine(Graphics, 0, n64 + 1, rc.Right, n64 + 1, 1, SKAERO_ColorARGB
  (255, RGB(255, 255, 0)));
kein Problem das Child Window bleibt undurchsichtig.

Mit Bitblt halt nicht.

Was ist da nicht zu verstehen.

gruss

Geändert von EWeiss ( 4. Mai 2015 um 18:03 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: BitBlt und Transparenz

  Alt 4. Mai 2015, 18:07
Ich bin ja auch so was von bescheuert.
Rede selbst davon das ich die Pixel zeichnen will und verwende anstelle von Paint -> Copy

So funktioniert es jetzt.

Zitat:
Das Parent-Window darf an der Stelle, an der das Spektogramm darstellt wird, einfach nicht transparent sein.
Wurde also wiederlegt geht auch dann wenn das HauptFenster transparent ist.
War mir vorher schon klar, nur wie das war der Knackspunkt.

  BitBlt(PaintDC, 0, 0, Width, Height, BuffBMP.Canvas.Handle, 0, 0, SrcPaint);
Zitat:
BitBlt wird mit SRCCOPY benutzt, was die PerPixel-Werte überträgt.
NÖ es kopiert von einem Device Contex zum andern das komplette Bild.

Das trifft dann wohl eher für SRCPAINT zu.
Hier werden die PerPixel-Werte gezeichnet.

Zitat:
Ein Rendertarget in Windows ist IIRC standartmässig 32Bit.
Aber nicht mehr wenn ich es mit 8Bit austausche. (Was ich in dem Fall tue.)

gruss

Geändert von EWeiss (11. Jul 2019 um 15:43 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz