[Windows] MouseEvent
Publié : ven. 25/mars/2011 20:29
Salut
Je vous propose un petit fichier à inclure dans vos projets, il permet d'intercepter les événements de la souris sur des gadgets.
Voici la liste des événements pris en charge :
Un exemple :

Je vous propose un petit fichier à inclure dans vos projets, il permet d'intercepter les événements de la souris sur des gadgets.
Voici la liste des événements pris en charge :
- - #MouseEvent_EventType_Click
- #MouseEvent_EventType_DoubleClick
- #MouseEvent_EventType_Push
- #MouseEvent_EventType_Release
- #MouseEvent_EventType_Hover
- #MouseEvent_EventType_Leave
- #MouseEvent_EventType_Drag
- #MouseEvent_EventType_DragStart
- #MouseEvent_EventType_DragStop
- #MouseEvent_EventType_Move
- #MouseEvent_EventType_WheelUp
- #MouseEvent_EventType_WheelDown
Code : Tout sélectionner
Enumeration
#MouseEvent_EventType_Click
#MouseEvent_EventType_DoubleClick
#MouseEvent_EventType_Push
#MouseEvent_EventType_Release
#MouseEvent_EventType_Hover
#MouseEvent_EventType_Leave
#MouseEvent_EventType_Drag
#MouseEvent_EventType_DragStart
#MouseEvent_EventType_DragStop
#MouseEvent_EventType_Move
#MouseEvent_EventType_WheelUp
#MouseEvent_EventType_WheelDown
EndEnumeration
Structure MouseEvent_MouseButton
Button.b
Key.i
isPushed.b
isDragged.b
Timestamp.i
EndStructure
Structure MouseEvent_Gadget
Gadget.i
GadgetID.i
MouseHover.b
List MouseButton.MouseEvent_MouseButton()
EndStructure
Structure MouseEvent_EventStack
Gadget.i
EventType.b
Button.b
EndStructure
Threaded NewList MouseEvent_Gadget.MouseEvent_Gadget()
Threaded NewList MouseEvent_EventStack.MouseEvent_EventStack()
Threaded MouseEvent_MouseX, MouseEvent_MouseY
Threaded MouseEventGadget, MouseEventType, MouseEventButton
Procedure isMouseButton(Button)
If GetAsyncKeyState_(Button) & 32768
ProcedureReturn #True
EndIf
EndProcedure
Procedure SendMouseEvent(Gadget, EventType, Button)
LastElement(MouseEvent_EventStack())
AddElement(MouseEvent_EventStack())
MouseEvent_EventStack()\Gadget = Gadget
MouseEvent_EventStack()\EventType = EventType
MouseEvent_EventStack()\Button = Button
EndProcedure
Procedure MouseEvent(WindowEvent)
If DesktopMouseX() <> MouseEvent_MouseX Or DesktopMouseY() <> MouseEvent_MouseY
MouseEvent_MouseX = DesktopMouseX() : MouseEvent_MouseY = DesktopMouseY()
isMouseMoved = #True
EndIf
Window = WindowFromPoint_(MouseEvent_MouseY<<32|MouseEvent_MouseX)
ForEach MouseEvent_Gadget()
;{ MouseHover
If MouseEvent_Gadget()\GadgetID = Window
If MouseEvent_Gadget()\MouseHover = #False
SendMouseEvent(MouseEvent_Gadget()\Gadget, #MouseEvent_EventType_Hover, 0)
MouseEvent_Gadget()\MouseHover = #True
ForEach MouseEvent_Gadget()\MouseButton()
If MouseEvent_Gadget()\MouseButton()\isPushed = #False
MouseEvent_Gadget()\MouseButton()\isPushed = -1
EndIf
Next
EndIf
Else
If MouseEvent_Gadget()\MouseHover = #True
SendMouseEvent(MouseEvent_Gadget()\Gadget, #MouseEvent_EventType_Leave, 0)
MouseEvent_Gadget()\MouseHover = #False
EndIf
EndIf
;}
;{ MouseButton
ForEach MouseEvent_Gadget()\MouseButton()
If isMouseButton(MouseEvent_Gadget()\MouseButton()\Key) = #True
If MouseEvent_Gadget()\MouseHover = #True
If MouseEvent_Gadget()\MouseButton()\isPushed = #False
SendMouseEvent(MouseEvent_Gadget()\Gadget, #MouseEvent_EventType_Push, MouseEvent_Gadget()\MouseButton()\Button)
MouseEvent_Gadget()\MouseButton()\isPushed = #True
EndIf
EndIf
Else
If MouseEvent_Gadget()\MouseButton()\isPushed = #True
If MouseEvent_Gadget()\MouseButton()\isDragged = #False
If MouseEvent_Gadget()\MouseHover = #True
If ElapsedMilliseconds()-MouseEvent_Gadget()\MouseButton()\Timestamp <= 500
SendMouseEvent(MouseEvent_Gadget()\Gadget, #MouseEvent_EventType_DoubleClick, MouseEvent_Gadget()\MouseButton()\Button)
MouseEvent_Gadget()\MouseButton()\Timestamp = 0
Else
SendMouseEvent(MouseEvent_Gadget()\Gadget, #MouseEvent_EventType_Click, MouseEvent_Gadget()\MouseButton()\Button)
MouseEvent_Gadget()\MouseButton()\Timestamp = ElapsedMilliseconds()
EndIf
EndIf
Else
SendMouseEvent(MouseEvent_Gadget()\Gadget, #MouseEvent_EventType_DragStop, MouseEvent_Gadget()\MouseButton()\Button)
MouseEvent_Gadget()\MouseButton()\isDragged = #False
EndIf
SendMouseEvent(MouseEvent_Gadget()\Gadget, #MouseEvent_EventType_Release, MouseEvent_Gadget()\MouseButton()\Button)
EndIf
MouseEvent_Gadget()\MouseButton()\isPushed = #False
EndIf
Next
;}
;{ MouseWheel
If WindowEvent = #WM_MOUSEWHEEL
If MouseEvent_Gadget()\MouseHover = #True
If EventwParam() > 0
SendMouseEvent(MouseEvent_Gadget()\Gadget, #MouseEvent_EventType_WheelUp, 0)
Else
SendMouseEvent(MouseEvent_Gadget()\Gadget, #MouseEvent_EventType_WheelDown, 0)
EndIf
EndIf
EndIf
;}
;{ MouseMovement
If isMouseMoved = #True
ForEach MouseEvent_Gadget()\MouseButton()
If MouseEvent_Gadget()\MouseButton()\isPushed = #True
If MouseEvent_Gadget()\MouseButton()\isDragged = #False
SendMouseEvent(MouseEvent_Gadget()\Gadget, #MouseEvent_EventType_DragStart, MouseEvent_Gadget()\MouseButton()\Button)
MouseEvent_Gadget()\MouseButton()\isDragged = #True
EndIf
SendMouseEvent(MouseEvent_Gadget()\Gadget, #MouseEvent_EventType_Drag, MouseEvent_Gadget()\MouseButton()\Button)
EndIf
Next
If MouseEvent_Gadget()\MouseHover = #True
SendMouseEvent(MouseEvent_Gadget()\Gadget, #MouseEvent_EventType_Move, 0)
EndIf
EndIf
;}
Next
;Return Event
If ListSize(MouseEvent_EventStack())
FirstElement(MouseEvent_EventStack())
MouseEventGadget = MouseEvent_EventStack()\Gadget
MouseEventType = MouseEvent_EventStack()\EventType
MouseEventButton = MouseEvent_EventStack()\Button
DeleteElement(MouseEvent_EventStack())
ProcedureReturn #True
EndIf
EndProcedure
Procedure MouseEventGadget()
ProcedureReturn MouseEventGadget
EndProcedure
Procedure MouseEventType()
ProcedureReturn MouseEventType
EndProcedure
Procedure MouseEventButton()
ProcedureReturn MouseEventButton
EndProcedure
Procedure isMouseEventGadget(Gadget)
ForEach MouseEvent_Gadget()
If MouseEvent_Gadget()\Gadget = Gadget
ProcedureReturn #True
EndIf
Next
EndProcedure
Macro MouseEvent_AddMouseButton(_Button, _Key)
AddElement(MouseEvent_Gadget()\MouseButton())
MouseEvent_Gadget()\MouseButton()\Button = _Button
MouseEvent_Gadget()\MouseButton()\Key = _Key
EndMacro
Procedure AddMouseEventGadget(Gadget)
If isMouseEventGadget(Gadget) = #False
AddElement(MouseEvent_Gadget())
MouseEvent_Gadget()\Gadget = Gadget
MouseEvent_Gadget()\GadgetID = GadgetID(Gadget)
MouseEvent_AddMouseButton(#PB_MouseButton_Left, #VK_LBUTTON)
MouseEvent_AddMouseButton(#PB_MouseButton_Middle, #VK_MBUTTON)
MouseEvent_AddMouseButton(#PB_MouseButton_Right, #VK_RBUTTON)
EndIf
EndProcedure
Procedure RemoveMouseEventGadget(Gadget)
ForEach MouseEvent_Gadget()
If MouseEvent_Gadget()\Gadget = Gadget
DeleteElement(MouseEvent_Gadget())
Break
EndIf
Next
EndProcedure
Code : Tout sélectionner
IncludeFile "MouseEvent.pbi"
Window = OpenWindow(#PB_Any, 0, 0, 200, 200, "Window", #PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
If Window
ContainerGadget = ContainerGadget(#PB_Any, 50, 50, 100, 100, #PB_Container_Flat)
SetGadgetColor(ContainerGadget, #PB_Gadget_BackColor, #White)
AddMouseEventGadget(ContainerGadget)
CloseGadgetList()
Repeat
Event = WaitWindowEvent(1)
If MouseEvent(Event)
Select MouseEventGadget()
Case ContainerGadget
Select MouseEventType()
Case #MouseEvent_EventType_Click
Debug "Click : B"+Str(MouseEventButton())
Case #MouseEvent_EventType_DoubleClick
Debug "DoubleClick : B"+Str(MouseEventButton())
Case #MouseEvent_EventType_Push
Debug "Push : B"+Str(MouseEventButton())
Case #MouseEvent_EventType_Release
Debug "Release : B"+Str(MouseEventButton())
Case #MouseEvent_EventType_Hover
Debug "Hover"
Case #MouseEvent_EventType_Leave
Debug "Leave"
Case #MouseEvent_EventType_Drag
Debug "Drag : B"+Str(MouseEventButton())
Case #MouseEvent_EventType_DragStart
Debug "DragStart : B"+Str(MouseEventButton())
Case #MouseEvent_EventType_DragStop
Debug "DragStop : B"+Str(MouseEventButton())
Case #MouseEvent_EventType_Move
Debug "Move"
Case #MouseEvent_EventType_WheelUp
Debug "WheelUp"
Case #MouseEvent_EventType_WheelDown
Debug "WheelDown"
EndSelect
EndSelect
EndIf
Until Event = #PB_Event_CloseWindow
EndIf