GadgetMouseX() und GadgetMouseY()

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Bisonte
Beiträge: 2470
Registriert: 01.04.2007 20:18

GadgetMouseX() und GadgetMouseY()

Beitrag 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.
Zuletzt geändert von Bisonte am 06.02.2017 14:11, insgesamt 3-mal geändert.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: GadgetMouseX() und GadgetMouseY()

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Bisonte
Beiträge: 2470
Registriert: 01.04.2007 20:18

Re: GadgetMouseX() und GadgetMouseY()

Beitrag 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...
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Antworten