Seite 1 von 1

[gelöst] WinApi ClipCursor_() Maus ins Fenster einsperren!?

Verfasst: 26.05.2019 21:46
von Mijikai
Ich kann die Maus nur in ein Fenster mit Rand einsperren.
Sobald das Fenster den Flag #PB_Window_BorderLess bekommt geht dies nicht mehr :(

Was tun? :cry:

So sieht meine ClipCursor() Funktion aus:

Code: Alles auswählen

Procedure.i engineClipCursor(*engine.ENGINE_STRUCT)
  With *engine
    If \window\cursor_clip
      If GetClientRect_(\window\hwnd,@\window\size)
        \window\left\x = \window\size\left
        \window\left\y = \window\size\top
        \window\right\x = \window\size\right
        \window\right\y = \window\size\bottom
        MapWindowPoints_(\window\hwnd,#Null,@\window\left,1)
        MapWindowPoints_(\window\hwnd,#Null,@\window\right,1)
        \window\bounds\left = \window\left\x
        \window\bounds\top = \window\left\y
        \window\bounds\right = \window\right\x
        \window\bounds\bottom = \window\right\y
        ProcedureReturn ClipCursor_(\window\bounds)
      EndIf
      ProcedureReturn #Null
    Else
      ProcedureReturn ClipCursor_(#Null)
    EndIf
  EndWith
EndProcedure

Re: WinApi ClipCursor_() Maus ins Fenster einsperren!?

Verfasst: 26.05.2019 21:50
von RSBasic
Gibt es einen bestimmten Grund, warum du die RECT-Daten selber ermittelst?
Oder reicht dieser Code schon aus?

Code: Alles auswählen

EnableExplicit

Define RECT.RECT

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_BorderLess | #PB_Window_ScreenCentered)
  TextGadget(1, 10, 10, 480, 20, "Alt + F4 zum Beenden des Programms.", 0)
  GetWindowRect_(WindowID(0), RECT)
  ClipCursor_(RECT)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf

Re: WinApi ClipCursor_() Maus ins Fenster einsperren!?

Verfasst: 26.05.2019 22:12
von Mijikai
RSBasic hat geschrieben:Gibt es einen bestimmten Grund, warum du die RECT-Daten selber ermittelst?
Oder reicht dieser Code schon aus?
...
:allright:

Kann ich mit GetWindowLongPtr_() testen ob #WS_POPUP gesetzt ist?
Da die Engine selbst auf Fenster Veränderungen reagieren soll sollte ich das irgendwie abfragen können (hab nur das Window Handle).

Habs so probiert leider ohne Erfolg:

Code: Alles auswählen

style = GetWindowLongPtr_(\window\hwnd,#GWL_STYLE)
      If (style & #WS_POPUP)
        Debug 123
      Else
;...

Re: WinApi ClipCursor_() Maus ins Fenster einsperren!?

Verfasst: 26.05.2019 22:15
von RSBasic
Möchtest du ermitteln, ob ein Rahmen vorhanden ist?

Code: Alles auswählen

EnableExplicit

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_BorderLess | #PB_Window_ScreenCentered); oder mit #PB_Window_SystemMenu 
  If GetWindowLongPtr_(WindowID(0),#GWL_STYLE) & #WS_BORDER
    Debug "Rahmen ist vorhanden"
  Else
    Debug "Kein Rahmen"
  EndIf
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf
Oder doch #WS_POPUP? Bzw. was möchtest du gerne ermitteln?

Re: WinApi ClipCursor_() Maus ins Fenster einsperren!?

Verfasst: 26.05.2019 22:25
von Mijikai
RSBasic hat geschrieben:Gibt es einen bestimmten Grund, warum du die RECT-Daten selber ermittelst?
Ist für meine 2D Engine welche selbst auf Fensteränderungen reagieren.
Ich muss den Rahmen berücksichtigen wenn ich den Cursor einsperren will da dieser nur im Bereich (Client) der gerendert wird fahren darf.

Re: WinApi ClipCursor_() Maus ins Fenster einsperren!?

Verfasst: 26.05.2019 22:48
von Mijikai
Jetzt funktioniert es aber nur solange das Fenster keinen zusätzlichen anderen Style hat wie #PB_Window_SizeGadget oder #PB_Window_Invisible? :?

Re: WinApi ClipCursor_() Maus ins Fenster einsperren!?

Verfasst: 26.05.2019 22:53
von RSBasic
Wenn du #PB_Window_SizeGadget verwendest, wird automatisch #PB_Window_SystemMenu benutzt. (Windows-Standard-Verhalten) Deshalb wird #WS_BORDER ebenfalls true.
#PB_Window_Invisible funktioniert aber weiterhin:

Code: Alles auswählen

EnableExplicit

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_Invisible | #PB_Window_BorderLess | #PB_Window_ScreenCentered); oder mit #PB_Window_SystemMenu
  If GetWindowLongPtr_(WindowID(0),#GWL_STYLE) & #WS_BORDER
    Debug "Rahmen ist vorhanden"
  Else
    Debug "Kein Rahmen"
  EndIf
 
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf