WinAPI ersetzen möglich?
Verfasst: 28.06.2016 19:39
Ich versuche immer, direkte WinAPI-Aufrufe zu vermeiden, weil dadurch die Kompatiblität zu Linux verloren geht. Ich meine damit diejenigen Befehle, die direkt aus den Windows-Bibliotheken stammen und mit einem '_' enden.
Manchmal bekomme ich es nicht ohne hin.
Gibt es für diese 3 nachfolgenden Codefragmente bessere Lösungen, so dass sie unter Linux funktionieren?
Wenn es ohne API nicht geht, wie sehen dann die Linux-Gegenstücke aus?
(Die vorangehenden Initialisierungen usw. habe ich mal weggelassen, weil das zu viel sein wird. Also OpenWindow() etc. passiert vorher und der Eventteil befindet sich in wirklichkeit in einer größeren Schleife)
- Die Fensterform wird durch eine Bilddatei bestimmt. Eine Farbe bestimmt, welche Bereiche transparent sind
- Die Bilddatei ändert sich zur Laufzeit, so dass auch das Fenster die Form ändert
- Die Bilddatei befindet sich in einem ImageGadget, welches hinter allem anderen liegt.
- Man muss durch die transparenten Bereiche hindurchklicken können
- Der nicht-transparente Bereich muss Klick-Events akzeptieren
- Der Hand-Cursor muss unter Linux nicht zwingend funktionieren, hier reicht auch der normale Pfeil. Notfalls wird das mit CompilerIf umschifft. Wichtiger sind die anderen 2
- Egal, wo man auf das Fenster klickt und zieht, es muss sich verschieben lassen.
- Das Fenster ist borderless und immer im Vordergrund
- MacOS ist egal. Wird eh nicht unterstützt
Manchmal bekomme ich es nicht ohne hin.
Gibt es für diese 3 nachfolgenden Codefragmente bessere Lösungen, so dass sie unter Linux funktionieren?
Wenn es ohne API nicht geht, wie sehen dann die Linux-Gegenstücke aus?
(Die vorangehenden Initialisierungen usw. habe ich mal weggelassen, weil das zu viel sein wird. Also OpenWindow() etc. passiert vorher und der Eventteil befindet sich in wirklichkeit in einer größeren Schleife)
Code: Alles auswählen
;define a color as transparent to get a shaped window
SetWindowLong_(WindowID(0), #GWL_EXSTYLE, #WS_EX_LAYERED | #WS_EX_TOPMOST)
SetLayeredWindowAttributes_(WindowID(0), transparentColor, 0, #LWA_COLORKEY) ;transparentColor = $ff00ff or $00ff00
;Mousecursor = Zeigefingerhand
SetClassLong_(WindowID(0), #GCL_HCURSOR, LoadCursor_(0, #IDC_HAND))
;entire window is draggable (by simulating the click-event to the title bar)
event = WaitWindowEvent(mainLoopInterval)
If event = #WM_LBUTTONDOWN
SendMessage_(WindowID(0), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
EndIf
- Die Bilddatei ändert sich zur Laufzeit, so dass auch das Fenster die Form ändert
- Die Bilddatei befindet sich in einem ImageGadget, welches hinter allem anderen liegt.
- Man muss durch die transparenten Bereiche hindurchklicken können
- Der nicht-transparente Bereich muss Klick-Events akzeptieren
- Der Hand-Cursor muss unter Linux nicht zwingend funktionieren, hier reicht auch der normale Pfeil. Notfalls wird das mit CompilerIf umschifft. Wichtiger sind die anderen 2
- Egal, wo man auf das Fenster klickt und zieht, es muss sich verschieben lassen.
- Das Fenster ist borderless und immer im Vordergrund
- MacOS ist egal. Wird eh nicht unterstützt
