So, ich möchte gerne den "PureBoard-Anfänger-Orden" verliehen bekommen. Ich habe nähmlich gerade herausgefunden, wie man ein Fenster erzeugt, das durchklickbar ist und das sich verhält, wie eine aufgeklebte Grafik.
Das Zauberwort heißt "Layered Window":
Code: Alles auswählen
#WS_EX_LAYERED = $80000
If OpenWindow(0,0,0,320,240,#PB_Window_SystemMenu | #PB_Window_ScreenCentered,"LayeredWindow")
SetWindowLong_(WindowID(0),#GWL_EXSTYLE,#WS_EX_LAYERED | #WS_EX_TRANSPARENT)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Layered Windows sind IMHO dafür da, um Fenster mit einer gewissen Transparenz angezeigen zu können. Laut SDK ignoriert Windows Eingaben für ein Layered Window und reicht sie an das darunter liegende Fenster weiter, sobald es den erweiterten Fenster-Style #WS_EX_TRANSPARENT erhält. Ausprobiert - es klappt. Wie ich das herausgefunden habe? Nun, mit
Winspector, die bessere Hälfte von Spy++. Mit diesem Programm versteht man auch, warum man 3 Handles ermitteln muss, um auf den Desktop zu kommen und ganz nebenbei kann man schauen, wie zum Beispiel Samurize es schaft, ein Fenster zu erstellen, das durchklickbar ist (einfach mal die Fenstereigenschaften ausgelesen und im SDK nachgeschlagen

). Aber dass das dann so einfach wird, hätte ich jetzt nicht gedacht. Vorteil ist nun, dass man in seinem eigenen Fenster arbeiten kann und nicht den Umweg über den Desktop nehmen muss, allerdings die gleichen Ergebnisse erzielt (die Border ausblenden und den Fensterhintergrund auf transparent setzen, fettisch

).
Allerdings habe ich noch ein kleines Problem. Und zwar muss nach SetWindowLong_() das Fenster neu gezeichnet werden, damit es auch den neuen Style sofort erhält. Ansonsten wird es erst dann neugezeichnet, wenn ich versuche, es mit der Maus zu verschieben. Kann man schön an diesem Beispiel sehen:
Code: Alles auswählen
If OpenWindow(0,0,0,320,240,#PB_Window_SystemMenu | #PB_Window_ScreenCentered,"Test")
SetWindowLong_(WindowID(0),#GWL_EXSTYLE,GetWindowLong_(WindowID(0),#GWL_EXSTYLE)|#WS_EX_TOOLWINDOW)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Nun wollte ich es mit der RedrawWindow_()-Funktion neuzeichnen. Allerdings passiert nüscht, obwohl der Aufruf korrekt ist (laut SDK). Könntet ihr mir da eventuell weiter helfen
Danköö
P.S.: Funktionert nur unter Winows 2000/XP und 2003 glaube ich auch noch
