Rahmenloses Fenster mit eigenem Skin ohne Region (WinAPI)
Verfasst: 29.04.2010 23:41
Hallo zusammen,
bei der Suche nach einer Lösung zu einem geskinnten PB-Fenster habe ich nur Beispiele gefunden, die mit der Region-Funktion der WinAPI Fensterbereiche durchsichtig gemacht haben.
Hier meine Lösung, die dem PB-Fenster ein eigenes Hintergrundbild verpasst und mittels Colorkey bestimmte Bereiche transparent schaltet. Im Beispiel alles, was die RGB-Farbe $FF00FF aufweist. Dort wirkt dann auch die Maus auf den drunterliegenden Bereich. Also so, wie man sich das i.d.R. wünscht.
Hier der code dazu:
Und hier das BIld, welches nachgeladen wird:

Das ganze sieht dann so aus:

Viele Spaß damit.
PS: Wie man auch den Button skinnen kann, habe ich leider nicht rausbekommen.
ImageButton hab ich noch nicht getestet.
Verbesserungen sind herzlich willkommen.
PS2: Durch Verarbeiten der #WM_LBUTTONDOWN Message kann das Fenster an beliebiger Stelle angefasst und verschoben werden.
bei der Suche nach einer Lösung zu einem geskinnten PB-Fenster habe ich nur Beispiele gefunden, die mit der Region-Funktion der WinAPI Fensterbereiche durchsichtig gemacht haben.
Hier meine Lösung, die dem PB-Fenster ein eigenes Hintergrundbild verpasst und mittels Colorkey bestimmte Bereiche transparent schaltet. Im Beispiel alles, was die RGB-Farbe $FF00FF aufweist. Dort wirkt dann auch die Maus auf den drunterliegenden Bereich. Also so, wie man sich das i.d.R. wünscht.
Hier der code dazu:
Code: Alles auswählen
EnableExplicit
Global iEvent.i, iEventGadget.i
Global iQuit.i, iImage.i, iPatternBrush.i
Global iMainWindow.i, iButton.i
iMainWindow = OpenWindow(#PB_Any, 100, 100, 105, 195, "", #PB_Window_BorderLess)
If iMainWindow
iButton = ButtonGadget(#PB_Any, 38, 70, 35, 20, "Quit")
; Den Patternbrush für den Fensterhintergrund aus dem Image erzeugen
iImage = LoadImage(#PB_Any, "D:\Image.bmp")
iPatternBrush = CreatePatternBrush_(ImageID(iImage))
; Den Patternbrush als Fensterhintergrund zuordnen.
SetClassLongPtr_(WindowID(iMainWindow), #GCL_HBRBACKGROUND, iPatternBrush)
; Das Image brauchen wir jetzt nicht mehr
FreeImage(iImage)
; Jetzt das Fenster an allen Stellen mit Farbe $FF00FF durchsichtig machen (#LWA_COLORKEY)
SetWindowLongPtr_(WindowID(iMainWindow), #GWL_EXSTYLE, #WS_EX_LAYERED)
SetLayeredWindowAttributes_(WindowID(iMainWindow), $FF00FF, 1, #LWA_COLORKEY)
Repeat
iEvent = WaitWindowEvent()
iEventGadget = EventGadget()
Select iEvent
Case #PB_Event_Gadget
Select iEventGadget
Case iButton : iQuit = 1
EndSelect
Case #WM_LBUTTONDOWN
Debug "In das Window geklickt!"
SendMessage_(WindowID(iMainWindow), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
EndSelect
Until iQuit = 1
If iPatternBrush
DeleteObject_(iPatternBrush)
EndIf
CloseWindow(iMainWindow)
EndIf

Das ganze sieht dann so aus:

Viele Spaß damit.
PS: Wie man auch den Button skinnen kann, habe ich leider nicht rausbekommen.
ImageButton hab ich noch nicht getestet.
Verbesserungen sind herzlich willkommen.
PS2: Durch Verarbeiten der #WM_LBUTTONDOWN Message kann das Fenster an beliebiger Stelle angefasst und verschoben werden.