GetMouseOverGadget

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.
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

GetMouseOverGadget

Beitrag 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
Zuletzt geändert von a14xerus am 14.07.2007 19:05, insgesamt 1-mal geändert.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag 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
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Antworten