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 ?