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.
um festzustellen, ob ein mdown bzw. mup auf einem gadget oder dem fenster selbst stattfindet, habe ich eine linkedlist definiert, in der ich alle gadget-ids aufliste. die liste wird bei jedem mdown durchlaufen und über eine over_gadget() funktion, musst schon selbst programmieren, kann ich feststellen, ob der besagte event auf einem bestimmten gadget ausgelöst wurde. mittels eines boolischen flags kann ich innerhalb der Foreach-schleife ermitteln, ob irgendein passendes gadget gefunden wurde.
wenn nicht, also der flag=#false ist, so wurde der besagte ereignis auf dem fenster selbst ausgelöst.
da mein projekt etwas zu umfangreich ist, kann ich dir datu kein code geben. aber ich habe zum thema mouse-events unter mac die folgende codegrundlage verwendet:
Code: Alles auswählen
#kEventClassMouse = 'mous'
#kEventClassControl = 'cntl'
#kEventMouseDown = 1
#kEventMouseUp = 2
#kEventMouseMoved = 5
#kEventMouseDragged = 6
#kEventControlTrackingAreaEntered = 23
#kEventControlTrackingAreaExited = 24
ImportC "/System/Library/Frameworks/Carbon.framework/Carbon"
GetEventClass.i(inEvent.l)
HIViewNewTrackingArea(inView.l, inShape.l, inID.q, *outRef)
EndImport
Structure EventTypeSpec
eventClass.l
eventKind.l
EndStructure
OpenWindow(0, 100,100, 300, 200, "Test Window")
ContainerGadget(0, 100, 100, 50, 50, #PB_Container_Single)
ProcedureCDLL CallBackEventsHandler(*nextHandler, theEvent, *CallBackProc)
Static OnTheControl.b
Select GetEventClass(theEvent)
Case #kEventClassMouse
If OnTheControl
Select GetEventKind_(theEvent)
Case #kEventMouseDown
Debug "MouseDown"
Case #kEventMouseMoved, #kEventMouseDragged
Debug "MouseMove"
Case #kEventMouseUp
Debug "MouseUp"
EndSelect
EndIf
Case #kEventClassControl ;{
Select GetEventKind_(theEvent)
Case #kEventControlTrackingAreaEntered
OnTheControl = #True
Case #kEventControlTrackingAreaExited
OnTheControl = #False
EndSelect
EndSelect
If *nexthandler : CallNextEventHandler_(*nextHandler, theEvent) : EndIf
EndProcedure
; Window handler
EventHandlerUPP = NewEventHandlerUPP_(@CallBackEventsHandler())
Events_Count = 4
Dim eventTypes.EventTypeSpec(Events_Count - 1)
eventTypes(0)\eventClass = #kEventClassMouse
eventtypes(0)\eventKind = #kEventMouseDown
eventTypes(1)\eventClass = #kEventClassMouse
eventtypes(1)\eventKind = #kEventMouseMoved
eventTypes(2)\eventClass = #kEventClassMouse
eventtypes(2)\eventKind = #kEventMouseDragged
eventTypes(3)\eventClass = #kEventClassMouse
eventtypes(3)\eventKind = #kEventMouseUp
InstallEventHandler_(GetWindowEventTarget_(WindowID(0)), EventHandlerUPP, Events_Count, @eventtypes(), @CallBackEventsHandler(), @handlerref)
; Gadget hanlder
EventHandlerUPP = NewEventHandlerUPP_(@CallBackEventsHandler())
Events_Count = 2
Dim eventTypes.EventTypeSpec(Events_Count - 1)
eventTypes(0)\eventClass = #kEventClassControl
eventtypes(0)\eventKind = #kEventControlTrackingAreaEntered
eventTypes(1)\eventClass = #kEventClassControl
eventtypes(1)\eventKind = #kEventControlTrackingAreaExited
HIViewNewTrackingArea(GadgetID(0), #Null, 0, #Null)
InstallEventHandler_(GetControlEventTarget_(GadgetID(0)), EventHandlerUPP, Events_Count, @eventtypes(), @CallBackEventsHandler(), @handlerref)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
EndSelect
ForEver
der original-threat ist im englsichen forum unter
http://www.purebasic.fr/english/viewtop ... ilit=mouse zu erreichen.
ich hoffe, ich konnte helfen
mfg
kurt