Visuelle Transparenz und Hit Testing
-
Ich habe es geschafft mit WS_EX_LAYERED und SetLayeredWindowAttributes ein Fenster mit komplett transparenten Stellen zu erzeugen. Das Problem ist, das an diesen Stellen jegliche Maus-Messages an das darunterliegende Fenster gesendet werden. Ich benötige jedoch die WM_NCHITEST Message da ich einen unsichtbaren Rahmen zum Vergrößern und Verkleinern um meine Anwendung herumzeichnen möchte.
Im msdn habe ich folgendes gefunden:
msdn schrieb:
Hit testing of a layered window is based on the shape and transparency of the window. This means that the areas of the window that are color-keyed or whose alpha value is zero will let the mouse messages through.
If the layered window has the WS_EX_TRANSPARENT extended window style, the shape of the layered window will be ignored and the mouse events will be passed to the other windows underneath the layered window.
Mir wäre es auch egal wenn dieser unsichtbare Rand einen Transparenz-Wert von 1 hätte, jedoch weiß ich nicht wie ich nur den Rand transparent bekomme da über SetLayeredWindow Attributes in Verbindung mit LWA_ALPHA das gesamte Fenster transparent gemacht wird.
Alle Hilfeleisteten bekommen einen Keks
-
Verwende doch einen Color Key (LWA_COLORKEY). Nur an diesen Stellen wird Transparenz (evtl. auch der Alpha) angewendet. An anderen nicht.
Oder lege noch ein Fenster darüber.
-
Martin Richter schrieb:
Verwende doch einen Color Key (LWA_COLORKEY). Nur an diesen Stellen wird Transparenz (evtl. auch der Alpha) angewendet. An anderen nicht.
Oder lege noch ein Fenster darüber.Genau so habe ich das auch gemacht mit dem Colorkey(das mit dem Alpha habe ich erst später als Umgehung des Problems probiert) Die gewünschten Stellen sind auch komplett transparent, so wie sie sein sollte. Aber leider nicht nur visuell transparent sondern auch für Mauseingaben.
-
Na dann verwende eben keinen Color-Key.
Falls es dann immer noch nicht geht verwende "eins weniger als ganz Transparent" als Alpha an diesen Stellen. Also 1 (bzw. 254 falls Windows den Alpha "falsch rum" haben will).
-
hustbaer schrieb:
Na dann verwende eben keinen Color-Key.
Falls es dann immer noch nicht geht verwende "eins weniger als ganz Transparent" als Alpha an diesen Stellen. Also 1 (bzw. 254 falls Windows den Alpha "falsch rum" haben will).Wenn ich Colorkey verwende erlange ich 100% Transparenz, aber eben auch für Mouse-Input.
Wenn ich Alpha verwende kann ich zwar den Wert 1, also fast vollkommene Transparenz verwenden, jedoch nur für das gesamte Fenster, nicht für einen bestimmten Bereich.Beide Varianten scheinen nicht das zu können was ich brauche. Aber es gibt sicher noch andere Möglichkeiten um ein Fenster transparent zu bekommen.
-
Achja, SetLayeredWindowAttributes() kann ja kein Per-Pixel Alpha
Also Per-Pixel Alpha geht schon, allerdings nur wenn man UpdateLayeredWindow() statt SetLayeredWindowAttributes() verwendet.
Dummerweise weiss ich nicht wie man das mit Standard Windows-Controls unter einen Hut bekommt.
In den ganzen Beispielen die ich so gefunden habe werden immer nur Sachen mit irgendwelchen Bitmaps gemacht, keine Buttons/Menus/Controls - nix.Einzig das da sieht vielversprechend aus (OK, VIELversprechend ist vielleicht übertrieben):
http://www.codeproject.com/Articles/20758/Alpha-Blended-Windows-FormsIch bin auch fast sicher dass man das irgendwie hinbekommen kann. Zumindest wenn nur standard Windows Controls verwendet werden. Dann könnte man nämlich - wenn sonst nichts funktioniert - mit WM_PAINT rummachen um diese in eine Memory Bitmap zu rendern, die man dann für UpdateLayeredWindow() verwenden kann.
Behaupte ich mal (kann mich natürlich auch täuschen)
-
Vielleicht kann man auch mit CS_OWNDC | CS_SAVEBTIS was machen...
EDIT: OK, Quatsch, bei CS_SAVEBTIS geht's ja um die Pixel HINTER dem eigenen Fenster...