Seite 1 von 1

GetMouseOverGadget

Verfasst: 14.07.2007 16:09
von a14xerus
Code ist nicht von mir

Code: Alles auswählen

; PB 4.xx
; By DerProgger
EnableExplicit

Global Event.l

Procedure GetMouseOverGadget(Window.l)
  Protected MousePos.POINT, Handle.l

  GetCursorPos_(@MousePos)
  Handle = WindowFromPoint_(MousePos\x,MousePos\y)
  If Handle <> WindowID(Window)
    ProcedureReturn GetDlgCtrlID_(Handle)
  Else
    ProcedureReturn -1
  EndIf
EndProcedure

If OpenWindow(0, 0, 0, 222, 200, "ButtonGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  ButtonGadget(0, 10, 10, 200, 20, "Standard Button")
  ButtonGadget(1, 10, 40, 200, 20, "Left Button", #PB_Button_Left)
  ButtonGadget(2, 10, 70, 200, 20, "Right Button", #PB_Button_Right)
  ButtonGadget(3, 10,100, 200, 60, "Multiline Button  (längerer Text wird automatisch umgebrochen)", #PB_Button_MultiLine)
  ButtonGadget(4, 10,170, 200, 20, "Toggle Button", #PB_Button_Toggle)

  Repeat
    Event = WaitWindowEvent()
   
    If Event = #WM_MOUSEMOVE
      Debug GetMouseOverGadget(0)
    EndIf
  Until Event = #PB_Event_CloseWindow
EndIf

Verfasst: 14.07.2007 17:28
von PureLust
Der Code hat leider einen kleinen Schönheitsfehler.
Wenn Du GetGadgetUnderMouse() nicht von einem #WM_MOUSEMOVE-Event abhängig machst sondern irgendwann aus Deinem Programm her aufrufst, kann es sein dass sich die Maus nicht über Deinem Fenster befindet.
In diesem Fall bekommst Du als Ergebnis unbrauchbare Werte geliefert (Gadget-IDs anderer Fenster).

In der Prozedur fehlt also noch die Prüfung, ob sich die Maus auch im gewünschten Fenster befindet.
Anbei mal der in dieser Hinsicht erweiterte Code, der als Ergebnis "-2" zurückliefert, wenn sich die Maus ausserhalb des angegebenen Fensters befindet:

Code: Alles auswählen

; PB 4.xx 
; By DerProgger 
EnableExplicit 

Global Event.l 

Procedure GetMouseOverGadget(Window.l) 
  Protected MousePos.POINT , Handle.l
  Protected WindowRect.RECT 

  GetCursorPos_(@MousePos) 
  Handle = WindowFromPoint_(MousePos\x, MousePos\y) 
  GetWindowRect_(WindowID(Window), WindowRect) 
  If Not PtInRect_(WindowRect, MousePos\x, MousePos\y) 
    ProcedureReturn -2 
  ElseIf Handle <> WindowID(Window) 
    ProcedureReturn GetDlgCtrlID_(Handle) 
  Else 
    ProcedureReturn -1 
  EndIf 
EndProcedure 

If OpenWindow(0, 0, 0, 222, 200, "ButtonGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0)) 
  ButtonGadget(0, 10, 10, 200, 20, "Standard Button") 
  ButtonGadget(1, 10, 40, 200, 20, "Left Button", #PB_Button_Left) 
  ButtonGadget(2, 10, 70, 200, 20, "Right Button", #PB_Button_Right) 
  ButtonGadget(3, 10,100, 200, 60, "Multiline Button  (längerer Text wird automatisch umgebrochen)", #PB_Button_MultiLine) 
  ButtonGadget(4, 10,170, 200, 20, "Toggle Button", #PB_Button_Toggle) 

  Repeat 
    Event = WaitWindowEvent(500) 
    Debug GetMouseOverGadget(0) 
  Until Event = #PB_Event_CloseWindow 
EndIf