Seite 1 von 1
Transparentes Fenster: Maus reagiert auf Hintergrund
Verfasst: 16.11.2012 13:07
von Sebastian
Mein Ziel ist es, einen individuellen, halb transparenten Fensterrand zu erstellen. Das Fenster selbst Zeichnet auf den WindowedScreen. Um den individuellen Fensterrand mit der leichten Transparenz zu erstellen, hielt ich es für sinnvoll, mit PNG-Dateien zu arbeiten, die ich in das ImageGadget lege. Das funktioniert im Prinzip auch, nur muss das von Windows vorgegebene Fenster vollständig transparent gezeichnet werden. Dazu habe ich den folgenden Code gefunden, der auch soweit funktioniert:
Code: Alles auswählen
SetWindowColor(#Win_Main,RGB(255,0,255)) ; FensterHintergrundfarbe Setzen
SetWindowLongPtr_(WindowID(#Win_Main),#GWL_EXSTYLE,#WS_EX_LAYERED)
SetLayeredWindowAttributes_(WindowID(#Win_Main),RGB(255,0,255),0,#LWA_COLORKEY)
Leider reagiert die Maus nun auf den Hintergrund und erkennt den WindowedScreen nicht mehr als Vordergrund, so dass die Events (z.B. Mouse Klick) nicht mehr abgefangen werden.
Was mache ich falsch bzw. wie sollte ich sonst vorgehen?
Ich hatte schon eine Version gebastelt, wo ein Screenshot geschossen wird und in die Images gezeichnet wird - allerdings ist diese Variante nicht optimal, da Windows7 bekanntlich den Hintergrund ändert und so die Images nicht mehr korrekt dargestellt werden. Hierzu müsste ich regelmäßig erfassen, ob das Hintergrundbild verändert wurde - das empfinde ich als sehr unschöne Lösung. Mit dem transparenten Fenster sollte es einfacher gehen.
Re: Transparentes Fenster: Maus reagiert auf Hintergrund
Verfasst: 16.11.2012 13:25
von bobobo
Re: Transparentes Fenster: Maus reagiert auf Hintergrund
Verfasst: 16.11.2012 13:51
von Sebastian
Nanu? Das Problem ist nur mit einer externen Bib zu lösen? Das kann doch gar nicht sein? Ich habe im MSDN nachgelesen. ChromaKey Windows leiten tatsächlich die Eventabfrage weiter. Das ist ja ärgerlich. Ich dachte auch immer, dass der WindowedScreen ein eigenes Gadget ist, aber er scheint direkt in das Window gezeichnet zu werden und als Teil des Fensters von Windows betrachtet zu werden - denn ButtonGadgets empfangen ja Events bzw lösen diese aus...
Re: Transparentes Fenster: Maus reagiert auf Hintergrund
Verfasst: 16.11.2012 20:14
von Bisonte
du hast es so eingestellt, dass eine Farbe komplett durchsichtig wird....
da ist dein fehler...
das Flag #LWA_COLORKEY ist der Schlüssel.
Code: Alles auswählen
SetLayeredWindowAttributes_(WindowID, Color, Alpha, #LWA_ALPHA|#LWA_COLORKEY)
Color ist ein RGB Wert und Alpha von 0-255, der steuert die Transparenz. Wobei das komplette Fenster (Inklusive Gadgets) transparent wird...
Re: Transparentes Fenster: Maus reagiert auf Hintergrund
Verfasst: 16.11.2012 20:21
von bobobo
@Seppl
Hättest Du mal gesucht und dann mal geholt .. dann hättest Du auch gesehen dass es sich
dabei letztlich um eine Include(pbi) handelt
UND DIE IST DURCHAUS LESBAR (wenn man lesen kann)
Re: Transparentes Fenster: Maus reagiert auf Hintergrund
Verfasst: 17.11.2012 13:11
von Sebastian
Ja. Es stimmt. Es ist eine Include. Ich war nur der Meinung, dass ich das Handwerkszeug bereits habe. Und das stimmt auch. Heute Nacht ist es mir endlich eingefallen. Es gibt ja die Möglichkeit im Drawingmode auf das Fenster selbst zu zeichnen

Also: Pinker Rand, Schwarze Mitte - Fertig ist das Kunstwerk mit dem transparenten Rand (auf den ich meine PNG zeichnen kann) und der soliden Mitte, in der das Programm meine Events abfängt. Jippie!
Re: Transparentes Fenster: Maus reagiert auf Hintergrund
Verfasst: 17.11.2012 19:27
von Sebastian
Ich habe mir den Code zu Gemüte geführt.
Was ich nicht verstehe und vor allem nicht abbilden kann: Wenn der Skinning-Mode aktiviert ist, dann wird Chromakeying aktiviert und das Fenster wird transparent, ABER die Events werden weiterhin vom FX-Fenster ausgelesen. In den Kommentaren der pbi-Datei steht aber: On these (transparent) Pixels, all Events will pathed through the beneath window.
Genau das passiert im Beispiel aber nicht. Die Events werden weiterhin empfangen. Wie funktioniert das? Wenn ich die pbi-Datei inkludiere und auf den Befehl WinFX_Transparency() zugreife, dann "sieht die Maus" wieder durch die transparenten Bereiche - eben das, was ich vermeiden möchte. Was mache ich da falsch oder beachte ich nicht.
Das zweite Problem ist, dass die Transparenz absolut ist, d.h. 0 oder 1 - nur der Wert von z.B. RGB(255,0,255) wird vollständig transparent. Wenn ich also eine PNG-Datei mit dem ImageGadget verwende, so werden meine "weichen" Kanten und Schatten mit einem hässlichen magenta-farbenem Rand dargestellt, da der Alphawert offensichtlich mit dem Fensterhintergrund gemischt wird und lediglich die zu 100% übereinstimmenden Werte (also 255,0,255) eliminiert werden. Wie ist es mir also mögliche eine echte Alpha-Darstellung hinzubekommen?
Re: Transparentes Fenster: Maus reagiert auf Hintergrund
Verfasst: 18.11.2012 12:01
von Bisonte
mit mehreren fenstern und was ich oben schon erwähnte
Re: Transparentes Fenster: Maus reagiert auf Hintergrund
Verfasst: 18.11.2012 13:39
von Sebastian
Naja. Ein Workaround mit mehreren Fenstern finde ich nicht so charmant. Einen Alphatransparenz-Verlauf auf 20px mit 20 Fenstern mit unterschiedlichen Alphaeinstellungen umzusetzen erscheint mir sinnlos. Windows ist ja immerhin in der Lage, PNG-Dateien korrekt darzustellen. Lege ich eine auf den Desktop, so wird sie ja auch mit den Alphawerten dargestellt. Irgendwie muss es also gehen.
Re: Transparentes Fenster: Maus reagiert auf Hintergrund
Verfasst: 23.11.2012 18:45
von Sebastian
Wie sieht es aus, bobobo. Hast Du eine Erklärung für das Phänomen? Warum klappt es im Beispiel, dass das Fenster die Events abfängt, obwohl es im "SkinningMode" ist?