Eine kurze Frage:
Welche Funktion erfüllt die folgende Zeile in der Init-Routine..?
Code: Alles auswählen
If PB_Object_EnumerateNext(PB_Window_Objects, @window)
Da ich mehrere Fenster nutze und auch die Info erhalten möchte wo das Event aufgetreten ist,
habe ich den Code etwas umgeschrieben. Er läuft auch soweit. Jedoch habe ich diesen undokumentierten
Befehlen etwas Bauchweh..
Code: Alles auswählen
DeclareModule MouseOver
Declare Init(window.l, timer=999)
Declare Release(timer=999)
EndDeclareModule
;=============================================================================
Module MouseOver
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
Import ""
CompilerElse
ImportC ""
CompilerEndIf
PB_Object_EnumerateStart( PB_Objects )
PB_Object_EnumerateNext( PB_Objects, *ID.Integer )
PB_Object_EnumerateAbort( PB_Objects )
PB_Object_GetObject( PB_Object , DynamicOrArrayID)
PB_Window_Objects.i
PB_Gadget_Objects.i
EndImport
;=============================================================================
Global window_for_timer = -1
Global lastgadget = -1
;=============================================================================
Procedure EventHandler()
Static lasthandle, x, y, last_x, last_y
Protected gadget, handle
x = WindowMouseX(EventWindow())
y = WindowMouseY(EventWindow())
If x <> last_x Or y <> last_y
last_x = x
last_y = y
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Windows
Protected desktop_x, desktop_y
desktop_x = DesktopMouseX()
desktop_y = DesktopMouseY()
handle = WindowFromPoint_(desktop_y << 32 | desktop_x)
CompilerCase #PB_OS_MacOS
Protected win_id, win_cv, pt.NSPoint
win_id = WindowID(EventWindow())
win_cv = CocoaMessage(0, win_id, "contentView")
CocoaMessage(@pt, win_id, "mouseLocationOutsideOfEventStream")
handle = CocoaMessage(0, win_cv, "hitTest:@", @pt)
CompilerCase #PB_OS_Linux
Protected desktop_x, desktop_y, *GdkWindow.GdkWindowObject
*GdkWindow.GdkWindowObject = gdk_window_at_pointer_(@desktop_x,@desktop_y)
If *GdkWindow
gdk_window_get_user_data_(*GdkWindow, @handle)
Else
handle = 0
EndIf
CompilerEndSelect
If handle <> lasthandle
If lastgadget >= 0
If GadgetType(lastgadget) <> #PB_GadgetType_Canvas
PostEvent(#PB_Event_Gadget, window_for_timer, lastgadget, #PB_EventType_MouseLeave)
EndIf
lastgadget = -1
EndIf
; Find gadgetid over handle
PB_Object_EnumerateStart(PB_Gadget_Objects)
While PB_Object_EnumerateNext(PB_Gadget_Objects, @gadget)
If handle = GadgetID(gadget)
lastgadget = gadget
If GadgetType(lastgadget) <> #PB_GadgetType_Canvas
PostEvent(#PB_Event_Gadget, window_for_timer, gadget, #PB_EventType_MouseEnter)
EndIf
PB_Object_EnumerateAbort(PB_Gadget_Objects)
Break
EndIf
Wend
lasthandle = handle
EndIf
EndIf
EndProcedure
Procedure Init(window.l, timer=999)
;Protected window
Release(timer)
PB_Object_EnumerateStart(PB_Window_Objects)
;If PB_Object_EnumerateNext(PB_Window_Objects, @window)
AddWindowTimer(window, timer, 100)
BindEvent(#PB_Event_Timer , @EventHandler())
PB_Object_EnumerateAbort(PB_Window_Objects)
window_for_timer = window
;EndIf
EndProcedure
Procedure Release(timer=999)
If window_for_timer >= 0
UnbindEvent(#PB_Event_Timer , @EventHandler())
RemoveWindowTimer(window_for_timer, timer)
window_for_timer = -1
lastgadget = -1
EndIf
EndProcedure
EndModule
Ich rufe nun in dem aktuellem Fenster jeweils die Init auf und kann somit über die Eventstruktur das Ereignis genau zuordnen.
=> Handle ich mir damit ggf. Probleme ein?