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

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

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

Beitrag 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
Zuletzt geändert von Mijikai am 02.06.2019 19:14, insgesamt 1-mal geändert.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

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

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

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

Beitrag 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
;...
Zuletzt geändert von Mijikai am 26.05.2019 22:16, insgesamt 1-mal geändert.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

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

Beitrag 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?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

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

Beitrag 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.
Zuletzt geändert von Mijikai am 26.05.2019 22:48, insgesamt 1-mal geändert.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

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

Beitrag von Mijikai »

Jetzt funktioniert es aber nur solange das Fenster keinen zusätzlichen anderen Style hat wie #PB_Window_SizeGadget oder #PB_Window_Invisible? :?
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

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

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Antworten