Seite 1 von 1

GadgetMouseX() und GadgetMouseY()

Verfasst: 14.08.2012 04:45
von Bisonte
Ich fragte mich, wieso nur das CanvasGadget eine Mauspositionabfrage hat...

Hier eine Koordinatenabfrage, einfach gestrickt aber effektiv auch für andere Gadgets.

GadgetMouseX(Gadget) und GadgetMouseY(Gadget) verhält sich wie WindowMouseX() und WindowMouseY(),
gibt also eine -1 zurück, wenn die Maus NICHT im Gadget ist.

Code: Alles auswählen

; »»» 
; »»» GadgetMouseX(), GadgetMouseY()
; »»» Einfache Abfrage der MausPosition innerhalb eines Gadgets
; »»» Was das CanvasGadget kann, können andere auch ;)
; »»» 

Procedure GadgetMouseX(Gadget, Window)
  
  Protected gx, gy, gw, gh
  Protected mx, my, Result = -1
  
  If IsWindow(Window) And IsGadget(Gadget)
    gx = GadgetX(Gadget)      : gy = GadgetY(Gadget)
    gw = GadgetWidth(Gadget)  : gh = GadgetHeight(Gadget)
    mx = WindowMouseX(Window) : my = WindowMouseY(Window)
    
    If mx >= gx And mx < gx + gw And my >= gy And my < gy + gh
      Result = mx - gx
    EndIf
    
  EndIf
  
  ProcedureReturn Result  
  
EndProcedure
Procedure GadgetMouseY(Gadget, Window)
  
  Protected gx, gy, gw, gh
  Protected mx, my, Result = -1
  
  If IsWindow(Window) And IsGadget(Gadget)
    gx = GadgetX(Gadget)      : gy = GadgetY(Gadget)
    gw = GadgetWidth(Gadget)  : gh = GadgetHeight(Gadget)
    mx = WindowMouseX(Window) : my = WindowMouseY(Window)
    
    If mx >= gx And mx < gx + gw And my >= gy And my < gy + gh
      Result = my - gy
    EndIf
    
  EndIf
  
  ProcedureReturn Result  
  
EndProcedure

; »»» Demo

OpenWindow(0,0,0,300,300,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)

CanvasGadget(1, 50, 50, 200, 200)

Repeat
  Event = WaitWindowEvent(25)
  
  Select Event
    Case #PB_Event_CloseWindow
      Quit = 1      
  EndSelect
  
  MX = GadgetMouseX(1,0)
  MY = GadgetMouseY(1,0)
  If OMX <> MX Or OMY <> MY
    OMX = MX : OMY = MY
    SetWindowTitle(0,Str(mx)+" : "+Str(my))
  EndIf
  
Until Quit > 0
Edit : Crossplatform und "Abtastbereich" um 1 verringert.

Re: GadgetMouseX() und GadgetMouseY()

Verfasst: 14.08.2012 14:06
von STARGÅTE
If m\y>=g\top And m\y <= g\bottom And m\x >= g\left And m\x <= g\right
Meiner Meinung nach, muss hier aber Bottom und Right ausgenommen werden (also nur < ).
Denn wenn ein Gadget 200px breit ist, sollten nur Werte von 0 bis 199 möglich sein.

Eine Platformübergreifende Lösung wäre natürlich mit WindowMouseX()-GadgetX() und GadgetWidth() zu arbeiten.

Re: GadgetMouseX() und GadgetMouseY()

Verfasst: 14.08.2012 22:52
von Bisonte
STARGÅTE hat geschrieben:
If m\y>=g\top And m\y <= g\bottom And m\x >= g\left And m\x <= g\right
Meiner Meinung nach, muss hier aber Bottom und Right ausgenommen werden (also nur < ).
Denn wenn ein Gadget 200px breit ist, sollten nur Werte von 0 bis 199 möglich sein.
Stimmt.... Ich korrigiere gleich....
STARGÅTE hat geschrieben: Eine Platformübergreifende Lösung wäre natürlich mit WindowMouseX()-GadgetX() und GadgetWidth() zu arbeiten.
dann müsste auch noch das Window als Parameter übergeben werden...