Transparentes Fenster

Antworten
Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Transparentes Fenster

Beitrag von Mathias »

Wie kann ich ein Fenster transparent machen, ohne das der Inhalt( Botton, etc) auch transparent wird.

Ich habe folgendes probiert:

Code: Alles auswählen

AplphaBlend := True;
AlphaBlendValue := 0;

Nur hier werden die Buttons auch transparent.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

jwdietrich
Beiträge: 167
Registriert: Mo 20. Okt 2008, 20:50
OS, Lazarus, FPC: macOS 10.4-13.4, Windows 2000-11, Raspbian (L 2.2.6, FPC 3.2.2)
CPU-Target: PowerPC, Intel, ARM
Wohnort: Hattingen, NRW
Kontaktdaten:

Re: Transparentes Fenster

Beitrag von jwdietrich »

Das würde mich auch sehr interessieren. Ich müsste für ein Projekt ein nicht rechteckiges Fenster erstellen, das plattformübergreifend auf Mac, Windows und Linux so dargestellt wird. Seit längerer Zeit ist diesbezüglich eine Frage auf codekicker offen. Eine Lösung könnte ein teiltransparentes Fenster darstellen, aber bis jetzt habe ich das auch nicht hinbekommen.

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Transparentes Fenster

Beitrag von Mathias »

@jwdietrich

Dein Problem könntest vielleicht so lösen. Diese Beispiel erzeugt ein Fenster in Form eines Flansches.

Code: Alles auswählen

procedure TAboutForm.FormCreate(Sender: TObject);
var
  x1, x2, y1, y2 : Integer;
const
  r : Integer= 25;
begin
  Caption := '';
  LabelTime.Caption := TimeToStr(Time);
  x1 := 90; y1 := 90; x2 := Width - 90; y2 := Height - 90;
  FRegion := CreateRoundRectRgn(5, 10, Width - 10, Height - 10, Width, Height);
  if FRegion <> 0 then begin
    Reg := CreateRoundRectRgn(x1 - r, y1 - r, x1 + r, y1 + r, r * 2, r * 2);
    CombineRgn(FRegion, FRegion, Reg, RGN_DIFF);
    Reg := CreateRoundRectRgn(x1 - r, y2 - r, x1 + r, y2 + r, r * 2, r * 2);
    CombineRgn(FRegion, FRegion, Reg, RGN_DIFF);
    Reg := CreateRoundRectRgn(x2 - r, y1 - r, x2 + r, y1 + r, r * 2, r * 2);
    CombineRgn(FRegion, FRegion, Reg, RGN_DIFF);
    Reg := CreateRoundRectRgn(x2 - r, y2 - r, x2 + r, y2 + r, r * 2, r * 2);
    CombineRgn(FRegion, FRegion, Reg, RGN_DIFF);
    SetWindowRgn(Handle, FRegion, True);
  end;
  DC := GetWindowDC(Handle);
end;


Mein Problem konnte ich auch lösen:

Code: Alles auswählen

procedure MakeFormTransparent(Form: TScrollingWinControl);
var
  AControl: TControl;
  A, Margin, X, Y, CtlX, CtlY: integer;
  ClientRgn, FullRgn, CtlRgn: HRGN;
begin
  with Form do begin
    Margin := (Width - ClientWidth) div 2;
    FullRgn := CreateRectRgn(0, 0, Width, Height);
    X := Margin;
    Y := Height - ClientHeight - Margin;
    ClientRgn := CreateRectRgn(X, Y, X + ClientWidth, Y + ClientHeight);
    CombineRgn(FullRgn, FullRgn, ClientRgn, RGN_DIFF);
    for A := 0 to ControlCount - 1 do begin
      AControl := Controls[A];
      if (AControl is TWinControl) or (AControl is TGraphicControl) then begin
        with AControl do begin
          if Visible then begin
            CtlX := X + Left;
            CtlY := Y + Top;
            CtlRgn := CreateRectRgn(CtlX, CtlY, CtlX + Width, CtlY + Height);
            CombineRgn(FullRgn, FullRgn, CtlRgn, RGN_OR);
          end;
        end;
      end;
    end;
    SetWindowRgn(Form.Handle, FullRgn, True);
  end;
end;

Aufruf:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  MakeFormTransparent(Form1);
end;

Ich habe TScrollingWinControl anstelle TForm verwendet, das ich auch transparente Frame machen kann.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Transparentes Fenster

Beitrag von Mathias »

Ich habe da ein wenig mit der xlib rumgebastelt.
Und habe folgendes hingekriegt.
Das Fenster ist voll transparent, aber das Zeugs, welches man reinzeichnet, ist in voller Farbe, was natürlich angepasst werden kann.
Als Demo, habe ich einen Pseudo-Button gezeichnet.

Ist sowas mit der LCL auch möglich, oder muss sie da passen.

Im Anhang noch der Linux-Code, wen es jemand ausprobieren will.
Dateianhänge
bild.png
bild.png (109.51 KiB) 3401 mal betrachtet
70_-_Alpha_Blending.zip
(2.13 KiB) 60-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1435
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Transparentes Fenster

Beitrag von fliegermichl »

Du kannst im Objektinspektor des Formulares Alphablend auf true stellen und je kleiner der Wert in AlphablendValue ist, um so durchsichtiger wird das Formular.

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Transparentes Fenster

Beitrag von Mathias »

fliegermichl hat geschrieben:
Sa 5. Aug 2023, 09:27
Du kannst im Objektinspektor des Formulares Alphablend auf true stellen und je kleiner der Wert in AlphablendValue ist, um so durchsichtiger wird das Formular.
Dies ist mir bekannt, nur wird da alles transparent, inklusive aufgesetzte Komponenten und alles was man ins Canvas zeichnet.
Oder kriegst du es irgendwie hin, Fenster transparent, aber der Button darauf in Vollfarbe.
In meinem Beispiel ist nur der Canvas transparent, aber die blauen Kreise und der Button sin in Vollfarbe.
Die beiden schwarzen Kästen, sins Sub-Windows, welche man als eigene Widget brauchen kann.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Transparentes Fenster

Beitrag von Soner »

Du musst eine Farbe als Transparenzfarbe definieren. Alles was du mit dieser Farbe zeichnest wird durchsichtig.
Ich habe mir immer gefragt warum haben die LCR-Programmierer Alphablending als Eigenschaft hinzugefügt aber Colorkey nicht.
Hier wird gezeigt wie es gemacht wird.

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Transparentes Fenster

Beitrag von Mathias »

Soner hat geschrieben:
Sa 5. Aug 2023, 23:32
Du musst eine Farbe als Transparenzfarbe definieren. Alles was du mit dieser Farbe zeichnest wird durchsichtig.
Ich habe mir immer gefragt warum haben die LCR-Programmierer Alphablending als Eigenschaft hinzugefügt aber Colorkey nicht.
Hier wird gezeigt wie es gemacht wird.
Dies sind mir nach einer Variante für Windows aus.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Transparentes Fenster

Beitrag von Soner »

Mathias hat geschrieben:
Sa 5. Aug 2023, 23:39
Soner hat geschrieben:
Sa 5. Aug 2023, 23:32
Du musst eine Farbe als Transparenzfarbe definieren. Alles was du mit dieser Farbe zeichnest wird durchsichtig.
Ich habe mir immer gefragt warum haben die LCR-Programmierer Alphablending als Eigenschaft hinzugefügt aber Colorkey nicht.
Hier wird gezeigt wie es gemacht wird.
Dies sind mir nach einer Variante für Windows aus.
Wolltest du nicht Lösung für Windows?

Ich dachte erst du fragst Lösung für Linux-Desktop, dann habe ich die Forenkategorie nachgeschaut da stand irgendwas von Windows. Sorry, ich lese manchmal nicht genau.

Aber ich glaube unter Linux-Desktop ist es auch ähnlich nur die Windowmanager müssen es unterstützen, das nennt man Compositor. Die meisten Windowmanager haben früher Xcompositor verwendet. Danach haben einige es in ihre Windowsmanger eingebaut.
Dann hat irgendein Student vor 20 Jahren, bei IBM glaube ich, mit einem Projekt angefangen das beides zusammenfasst und andere "moderne" Sachen bietet, das Projekt nennt sich Wayland, wenn er noch weiter studiert wird das Projekt in den nächsten 20 Jahren zu 85% fertig.

Wenn es kein Compositior eingeschaltet war, dann wurde einfach Desktophintergrundbild im Programm als Hintergrund gezeichnet, das ergibt die Illusion von Transparenz.

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Transparentes Fenster

Beitrag von Mathias »

Noch was lustiges im Anhang zum ausprobieren, leider flimmert es ein wenig.
Dateianhänge
bild.png
bild.png (54.98 KiB) 3206 mal betrachtet
75_-_Window_Transparent_Pixmap.zip
(3.44 KiB) 62-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten