hilpert hat geschrieben:Wie kann nach einem WaitWindowEvent unter MacOs 4.11 erkannt werden,
ob eine MausTaste gedrückt wurde im Innern eines Fensters jedoch außerhalb von Gadgets ??
Um festzustellen, ob ein Mausklick auf ein Fenster oder ein Gadget erfolgte, kann man es so machen, wie delikanli_19_82 es beschrieben hat, indem man ein ContainerGadget verwendet, das das ganze Fenster abdeckt. Vera hat auch schon einmal in einem Beispiel im englischen Forum gezeigt, wie man ein Fenster-füllendes ImageGadget verwenden kann, um Rechtsklicks in einem Fenster zu erkennen und ein Popup-Menü zu öffnen.delikanli_19_82 hat geschrieben:also ich hab das problem dadurch gelöst, das ich dem fenster einen container-gadget als hintergrund verpasst habe.
danach konnte ich mit den üblichen mouse-down und mouse-up api calls von mac die maustasten auf dem fenster abfangen.
Wie man das von hilpert angesprochene Problem jedoch ohne Umwege über andere Gadgets lösen kann, zeigt mein folgendes Beispiel. Es installiert für einen Kontextmenü-Klick (rechter Mausklick) einen EventHandler für das Fenster und für das ButtonGadget. Beim Aufruf des EventHandlers wird jeweils das Handle des Fensters und des ButtonGadgets übergeben, sodaß im EventHandler festgestellt werden kann, ob der Kontextmenü-Klick auf das Fenster erfolgte oder auf das Gadget. Nur beim Kontextmenü-Klick auf das Fenster wird dann im EventHandler eine Variable gesetzt, die dann in der Ereignisschleife überprüft wird und zur Anzeige des Popup-Menüs führt.
Code: Alles auswählen
EnableExplicit
#kEventClassControl = 'cntl'
#kEventClassWindow = 'wind'
#kEventControlContextualMenuClick = 12
#kEventWindowContextualMenuSelect = 78
Structure EventTypeSpec
EventClass.L
EventKind.L
EndStructure
Define EventHandlerUPP.L
Define RightMouseButtonClick.I
Define WindowEvent.I
Procedure EventHandler(*NextEventHandler, Event.L, Ref.L)
Shared RightMouseButtonClick.I
If Ref = WindowID(0)
RightMouseButtonClick = #True
EndIf
If *NextEventHandler
CallNextEventHandler_(*NextEventHandler, Event)
EndIf
EndProcedure
Dim EventTypes.EventTypeSpec(1)
OpenWindow(0, 200, 200, 300, 200, "Popup-Menu Example")
ButtonGadget(0, 10, 90, 280, 20, "Right click doesn't open Popup Menu!")
CreatePopupMenu(0)
MenuItem(1, "Option 1")
MenuItem(2, "Option 2")
MenuItem(3, "Quit")
; ----- Install EventHandler for Window to detect right clicks
EventHandlerUPP = NewEventHandlerUPP_(@EventHandler())
EventTypes(0)\EventClass = #kEventClassWindow
EventTypes(0)\EventKind = #kEventWindowContextualMenuSelect
InstallEventHandler_(GetWindowEventTarget_(WindowID(0)), EventHandlerUPP, 1, @EventTypes(), WindowID(0), 0)
; ----- Install EventHandler for each Gadget to detect right clicks
EventTypes(0)\EventClass = #kEventClassControl
EventTypes(0)\EventKind = #kEventControlContextualMenuClick
InstallEventHandler_(GetControlEventTarget_(GadgetID(0)), EventHandlerUPP, 1, @EventTypes(), GadgetID(0), 0)
Repeat
Select WaitWindowEvent(20)
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
If EventGadget() = 0 And EventType() = #PB_EventType_LeftClick
Debug "Button clicked!"
EndIf
Case #PB_Event_Menu
Select EventMenu()
Case 1
Debug "Menu: Option 1"
Case 2
Debug "Menu: Option 2"
Case 3
Break
EndSelect
EndSelect
If RightMouseButtonClick
DisplayPopupMenu(0, WindowID(0))
RightMouseButtonClick = #False
EndIf
ForEver