halbtransparente Fenster

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: halbtransparente Fenster

Beitrag von Socke »

Teekeks hat geschrieben:(und JA, ich weiß das man solche direkten Casts nicht macht...

Wenn ihr das doch wisst, warum verwendet ihr dann nicht wenigstens Ptr/Size/Val(U)Int. Damit habt ihr immer einen Ganzzahl-Typen von der Größe eines Pointers.

Zumindest bei Ptr(U)Int gibt es dann keine Warnung mehr sondern nur einen Hinweis. Das ist nicht als Fehler anzusehen, eher als echter Hinweis: schau hin, was du tust!
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Lubus
Beiträge: 26
Registriert: Mi 17. Feb 2010, 17:07
OS, Lazarus, FPC: x86_64-linux-gtk2
CPU-Target: AMD Ryzen 7 5700G
Wohnort: Lendsiedel

Re: halbtransparente Fenster

Beitrag von Lubus »

Das mit dem AphaBlend hatte ich schon probiert und es kam der Fehler:
unit1.pas(44,9) Error: identifier idents no member "Alphablend"
unit1.pas(45,9) Error: identifier idents no member "AlphaBlendValue"
unit1.pas(59) Fatal: There were 2 errors compiling module, stopping

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: halbtransparente Fenster

Beitrag von Euklid »

Lubus:

Um das von _X_ vorgeschlagene Alpha-Blending von Lazarus verwenden zu können, musst Du Dir eine aktuelle Lazarus-Snapshot installieren, da die offizielle Beta das Feature noch nicht unterstützt.
Die Snapshot kannst Du dir hier herunterladen:

http://www.hu.freepascal.org/lazarus/

Viele Grüße, Euklid

Lubus
Beiträge: 26
Registriert: Mi 17. Feb 2010, 17:07
OS, Lazarus, FPC: x86_64-linux-gtk2
CPU-Target: AMD Ryzen 7 5700G
Wohnort: Lendsiedel

Re: halbtransparente Fenster

Beitrag von Lubus »

Ich habe jetzt 0.9.28.3 Beta installiert. Dort kennt er Alphablend auch nicht.

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: halbtransparente Fenster

Beitrag von DiBo33 »

Nimm 0.9.29 da ist es auf jeden Fall dabei (zum. in GTK2)

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

Re: halbtransparente Fenster

Beitrag von Mathias »

Teekeks hat geschrieben:
Mi 18. Aug 2010, 22:56
Das geht nur IMHO mit der Jeweiligen API des Wingetsets.
Bei GTK2 (genauer: X) geht das so:

Code: Alles auswählen

unit alphaform; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils,xatom, X, xlib, gtk2, gdk2x, GTKProc, GtkDef, ctypes;
 
  procedure af_setForm_transparency(const f: THandle; const tp: integer);
 
implementation
 
procedure af_setForm_transparency(const f: THandle; const tp: integer);
var
  transparency: double;
  opacity: integer;
  atom_window_opacity: TAtom;
  dpy: PDisplay;
  win: TWindow;
begin
  dpy := XOpenDisplay(nil);
  win := GDK_WINDOW_XWINDOW(PGtkWidget(PtrUInt(f))^.window);
  transparency := tp / 1000 * 10;
  opacity      := trunc($FFFFFFFF * transparency);
  atom_window_opacity := XInternAtom(dpy, '_NET_WM_WINDOW_OPACITY', False);
  XChangeProperty(dpy, win, atom_window_opacity, XA_CARDINAL,
    32, PropModeReplace, @PcuChar(opacity), 1);
  XCloseDisplay(dpy);
end;
 
end.
//Aufruf z.B. so:
//(Angabe in %)
af_setForm_transparency(Form1.Handle,50);
Weiteres findest du hier.
Da wird auch eine Windows-Version beschrieben, die aber wohl nicht so Funktioniert...

Vl. Hat da jemand anderes schon was raus gefunden.
Ich bin grade auf diesen uralten Thread gestossen und musste es ausprobieren.
Und habe den Code ein wenig vereinfacht, da der Umweg über Float nicht nötig ist.
Auch das "false" bei XInternAtom ist nicht schön, es darf keine neue Atom-ID erstellt werden, wen es das Property '_NET_WM_WINDOW_OPACITY' vom System nicht gibt.

Code: Alles auswählen

  procedure SetAlphaWindow(Alpha: byte);
  var
    tmpAlpha: PtrUInt;
    XA__NET_WM_WINDOW_OPACITY, XA_CARDINAL: TAtom;
  begin
    XA__NET_WM_WINDOW_OPACITY := XInternAtom(dis, '_NET_WM_WINDOW_OPACITY', True);
    if XA__NET_WM_WINDOW_OPACITY = 0 then begin
      WriteLn('Funktion "_NET_WM_WINDOW_OPACITY" nicht unterstützt !');
      Exit;
    end;
    XA_CARDINAL := XInternAtom(dis, 'CARDINAL', True);

    tmpAlpha := Alpha shl 24;
    XChangeProperty(dis, win, XA__NET_WM_WINDOW_OPACITY, XA_CARDINAL, 32, PropModeReplace, @tmpAlpha, 1);
  end; 
Mein Beispiel funktioniert gut mit einer reiner Xlib Anwendung.

Daher habe ich eine Frage.
In der UrVersion wird dies für GTK2 verwenden und noch ein unschöner Umweg über "XOpenDisplay()" gemacht.

Ich vermute mal schwer, das man direkt in der LCL oder mit GTK2 auf PDisplay und TWindow zugreifen kann.
TWindow geht wenigstens mit GTK.
Klar, das es dann nur auf Linux funktioniert.

Einer eine Idee, wie ich an diese Handles ran komme ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4893
Registriert: Fr 8. Apr 2011, 09:01

Re: halbtransparente Fenster

Beitrag von wp_xyz »

OK - ich weiß, du willst alles mit nacktem gkt machen.

Aber nur der Vollständigkeit halber: Gerade getestet: Ein Formular mit ein paar Controls, AlphaBlend auf true gesetzt und AlphaBlendValue auf 128 - und ich bekomme ein halbtransparentes Formular, auf Windows, gtk2, gtk3, qt5 und auch auf cocoa.

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

Re: halbtransparente Fenster

Beitrag von fliegermichl »

Coole Sache. Das Leben kann so einfach sein.
+1

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 338
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: halbtransparente Fenster

Beitrag von Niesi »

wp_xyz hat geschrieben:
Fr 12. Mai 2023, 17:26
OK - ich weiß, du willst alles mit nacktem gkt machen.

Aber nur der Vollständigkeit halber: Gerade getestet: Ein Formular mit ein paar Controls, AlphaBlend auf true gesetzt und AlphaBlendValue auf 128 - und ich bekomme ein halbtransparentes Formular, auf Windows, gtk2, gtk3, qt5 und auch auf cocoa.
Danke dafür ~ das ist echt klasse ...
Dateianhänge
TransparentForm.png
TransparentForm.png (17.03 KiB) 5077 mal betrachtet
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

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

Re: halbtransparente Fenster

Beitrag von Mathias »

Es geht noch lustiger, Lazarus-IDE transparent ?!

Die geht mit diesem Trick:

Code: Alles auswählen

xprop -f _NET_WM_WINDOW_OPACITY 32c -set _NET_WM_WINDOW_OPACITY 2000000000
Anschleissend das Fenster anklicken, das transparent werden soll.

PS: Es ist nicht gefährlich, nach einem Neustart von Lazarus ist alles wieder normal.
Dateianhänge
Bildschirmfoto vom 2023-05-13 08-49-34.png
Bildschirmfoto vom 2023-05-13 08-49-34.png (206.5 KiB) 5077 mal betrachtet
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

kirchfritz
Beiträge: 172
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 3.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Re: halbtransparente Fenster

Beitrag von kirchfritz »

Weiß jemand, wie man nur die linke Hälfte des Formulars transparent macht, die rechte Hälfte sollte nicht transparent sein?
So wie hier: https://dribbble.com/shots/12833628-Mic ... t-Explorer

wp_xyz
Beiträge: 4893
Registriert: Fr 8. Apr 2011, 09:01

Re: halbtransparente Fenster

Beitrag von wp_xyz »

Meinst du sowas wie Aero-Glass unter Windows? Dazu gibt es einen wiki-Artikel: https://wiki.lazarus.freepascal.org/Aero_Glass Ich hatte das früher einmal zu Windows-7-Zeiten ausprobiert, das funktionierte es. Aber heute unter Windows 11 kriege ich das nicht mehr hin - vielleicht ist es auch eine Einstellungssache, ich habe aber momentan keine Lust, dafür in den Tiefen von Windows herumzuwühlen. Probier's einfach selbst mal aus.

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

Re: halbtransparente Fenster

Beitrag von Mathias »

Aber heute unter Windows 11 kriege ich das nicht mehr hin -
Wie der mal typisch Windoof. Unter Linux ist es recht erstaunlich, was da noch für uralte Sachen funktionieren.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten