Can you comment on my code, that is how it should be because it is not necessary.
Code: Select all
DeclareModule Mouse
Enumeration #PB_Event_FirstCustomValue
#PB_Event_MouseMove
EndEnumeration
EndDeclareModule
Module Mouse
Global EnterGadgetID
Procedure IDGadget( GadgetID )
If IsGadget( GetProp_( GadgetID , "PB_ID")) And GadgetID = GadgetID(GetProp_( GadgetID , "PB_ID"))
ProcedureReturn GetProp_( GadgetID , "PB_ID" )
EndIf
ProcedureReturn - 1
EndProcedure
Procedure IDWindow( WindowID )
If IsWindow( GetProp_( WindowID , "PB_WindowID") - 1) And WindowID = WindowID(GetProp_( WindowID , "PB_WindowID") - 1)
ProcedureReturn GetProp_( WindowID , "PB_WindowID" ) - 1
EndIf
ProcedureReturn - 1
EndProcedure
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
Procedure WindowPointCallBack( GadgetID, lParam )
Protected Gadget, GetWindow
Protected WindowRect.RECT , NextRect.RECT, Pt.POINT
If GadgetID : Gadget = IDGadget( GadgetID )
If GetWindowLongPtr_( GadgetID, #GWL_STYLE ) & #WS_CLIPSIBLINGS = #False
If IsGadget( Gadget )
Select GadgetType( Gadget )
Case #PB_GadgetType_ComboBox
Protected Height = GadgetHeight( Gadget )
EndSelect
EndIf
SetWindowLongPtr_( GadgetID, #GWL_STYLE, GetWindowLongPtr_( GadgetID, #GWL_STYLE ) | #WS_CLIPSIBLINGS | #WS_CLIPCHILDREN )
If Height
ResizeGadget( Gadget, #PB_Ignore, #PB_Ignore, #PB_Ignore, Height )
EndIf
SetWindowPos_( GadgetID, #GW_HWNDFIRST, 0,0,0,0, #SWP_NOMOVE|#SWP_NOSIZE )
EndIf
GetCursorPos_(Pt)
GetWindowRect_( GadgetID, @WindowRect )
If PtInRect_( @WindowRect, Pt\x | (Pt\y<<32) )
If IsGadget( Gadget )
GetWindowRect_( GetWindow_( GadgetID, #GW_HWNDPREV), @NextRect )
If PtInRect_( @NextRect, Pt\x | (Pt\y<<32) )
GetWindow = GetWindow_( GadgetID, #GW_HWNDPREV)
Else
GetWindow = GadgetID
EndIf
If GetWindow = GadgetID
If IsWindowVisible_( GadgetID )
EnterGadgetID = GadgetID
EndIf
Else
EndIf
Else
If IsGadget(IDGadget(GetWindow_( GadgetID, #GW_HWNDNEXT)))
If IsWindowVisible_( GadgetID )
EnterGadgetID = GetWindow_( GadgetID, #GW_HWNDNEXT)
EndIf
EndIf
EndIf
Else
GetWindowRect_( EnterGadgetID, @WindowRect )
If PtInRect_( @WindowRect, Pt\x | (Pt\y<<32) ) = 0
EnterGadgetID = 0
EndIf
EndIf
EndIf
ProcedureReturn GadgetID
EndProcedure
CompilerEndIf
Procedure EnterGadgetID( WindowID )
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
EnumChildWindows_( WindowID, @WindowPointCallBack(), 0 )
ProcedureReturn EnterGadgetID
CompilerEndIf
EndProcedure
Procedure MOUSE_LL(nCode, wParam, *ms.MOUSEHOOKSTRUCT)
Static Click, Queue, GadgetWindow =- 1, LeaveWindow =- 1, LeaveGadget =- 1, Window =- 1, Gadget =- 1
Protected EnterWindowID = GetAncestor_( WindowFromPoint_( *ms\pt\x | (*ms\pt\y<<32)) , #GA_ROOT )
Protected EnterGadgetID = EnterGadgetID( EnterWindowID )
Protected EnterWindow = IDWindow( EnterWindowID )
Protected EnterGadget = IDGadget( EnterGadgetID )
Select wParam
Case #WM_LBUTTONDOWN,
#WM_RBUTTONDOWN,
#WM_MBUTTONDOWN
Select wParam
Case #WM_LBUTTONDOWN : Click = 1 : Queue+1
Case #WM_RBUTTONDOWN : Click = 2 : Queue+1
Case #WM_MBUTTONDOWN : Click = 16
EndSelect
If Queue >= 2
Click = 3
EndIf
If EnterGadget >= 0
Gadget = EnterGadget
GadgetWindow = EnterWindow
Else
Window = EnterWindow
EndIf
EndSelect
If Gadget =- 1 And Window =- 1
; mouse enter\leave window
If LeaveWindow <> EnterWindow
If LeaveWindow >= 0 : PostEvent( #PB_Event_Gadget, LeaveWindow, #PB_Ignore, #PB_EventType_MouseLeave, 0 ) : EndIf
If EnterWindow >= 0 : PostEvent( #PB_Event_Gadget, EnterWindow, #PB_Ignore, #PB_EventType_MouseEnter, 0 ) : EndIf
LeaveWindow = EnterWindow
EndIf
; mouse enter\leave gadget
If LeaveGadget <> EnterGadget
If LeaveGadget >= 0 : PostEvent( #PB_Event_Gadget, EnterWindow, LeaveGadget, #PB_EventType_MouseLeave, 0 ) : EndIf
If EnterGadget >= 0 : PostEvent( #PB_Event_Gadget, EnterWindow, EnterGadget, #PB_EventType_MouseEnter, 0 ) : EndIf
LeaveGadget = EnterGadget
EndIf
; mouse move\down\up gadget
If EnterGadget >= 0
Select wParam
Case #WM_MOUSEMOVE : PostEvent( #PB_Event_Gadget, EnterWindow, EnterGadget, #PB_EventType_MouseMove, 0 )
Case #WM_LBUTTONDOWN : PostEvent( #PB_Event_Gadget, EnterWindow, EnterGadget, #PB_EventType_LeftButtonDown, 0 )
Case #WM_LBUTTONUP : PostEvent( #PB_Event_Gadget, EnterWindow, EnterGadget, #PB_EventType_LeftButtonUp, 0 )
Case #WM_RBUTTONDOWN : PostEvent( #PB_Event_Gadget, EnterWindow, EnterGadget, #PB_EventType_RightButtonDown, 0 )
Case #WM_RBUTTONUP : PostEvent( #PB_Event_Gadget, EnterWindow, EnterGadget, #PB_EventType_RightButtonUp, 0 )
EndSelect
Else
; mouse move\down\up window
If EnterWindow >= 0
Select wParam
Case #WM_MOUSEMOVE : PostEvent( #PB_Event_Gadget, EnterWindow, #PB_Ignore, #PB_EventType_MouseMove, 0 )
Case #WM_LBUTTONDOWN : PostEvent( #PB_Event_Gadget, EnterWindow, #PB_Ignore, #PB_EventType_LeftButtonDown, 0 )
Case #WM_LBUTTONUP : PostEvent( #PB_Event_Gadget, EnterWindow, #PB_Ignore, #PB_EventType_LeftButtonUp, 0 )
Case #WM_RBUTTONDOWN : PostEvent( #PB_Event_Gadget, EnterWindow, #PB_Ignore, #PB_EventType_RightButtonDown, 0 )
Case #WM_RBUTTONUP : PostEvent( #PB_Event_Gadget, EnterWindow, #PB_Ignore, #PB_EventType_RightButtonUp, 0 )
EndSelect
EndIf
EndIf
ElseIf Gadget >= 0
Select wParam
Case #WM_MOUSEMOVE : PostEvent( #PB_Event_Gadget, GadgetWindow, Gadget, #PB_EventType_MouseMove, Click )
Case #WM_LBUTTONDOWN : PostEvent( #PB_Event_Gadget, GadgetWindow, Gadget, #PB_EventType_LeftButtonDown, 0 )
Case #WM_LBUTTONUP : PostEvent( #PB_Event_Gadget, GadgetWindow, Gadget, #PB_EventType_LeftButtonUp, 0 )
Case #WM_RBUTTONDOWN : PostEvent( #PB_Event_Gadget, GadgetWindow, Gadget, #PB_EventType_RightButtonDown, 0 )
Case #WM_RBUTTONUP : PostEvent( #PB_Event_Gadget, GadgetWindow, Gadget, #PB_EventType_RightButtonUp, 0 )
EndSelect
ElseIf Window >= 0
Select wParam
Case #WM_MOUSEMOVE : PostEvent( #PB_Event_Gadget, Window, #PB_Ignore, #PB_EventType_MouseMove, Click )
Case #WM_LBUTTONDOWN : PostEvent( #PB_Event_Gadget, Window, #PB_Ignore, #PB_EventType_LeftButtonDown, 0 )
Case #WM_LBUTTONUP : PostEvent( #PB_Event_Gadget, Window, #PB_Ignore, #PB_EventType_LeftButtonUp, 0 )
Case #WM_RBUTTONDOWN : PostEvent( #PB_Event_Gadget, Window, #PB_Ignore, #PB_EventType_RightButtonDown, 0 )
Case #WM_RBUTTONUP : PostEvent( #PB_Event_Gadget, Window, #PB_Ignore, #PB_EventType_RightButtonUp, 0 )
EndSelect
EndIf
Select wParam
Case #WM_LBUTTONUP,
#WM_RBUTTONUP,
#WM_MBUTTONUP
Click = 0
Queue = 0
GadgetWindow =- 1
Gadget =- 1
Window =- 1
If LeaveWindow <> EnterWindow
If LeaveWindow >= 0 : PostEvent( #PB_Event_Gadget, LeaveWindow, #PB_Ignore, #PB_EventType_MouseLeave, 0 ) : EndIf
If EnterWindow >= 0 : PostEvent( #PB_Event_Gadget, EnterWindow, #PB_Ignore, #PB_EventType_MouseEnter, 0 ) : EndIf
LeaveWindow = EnterWindow
EndIf
If LeaveGadget <> EnterGadget
If LeaveGadget >= 0 : PostEvent( #PB_Event_Gadget, EnterWindow, LeaveGadget, #PB_EventType_MouseLeave, 0 ) : EndIf
If EnterGadget >= 0 : PostEvent( #PB_Event_Gadget, EnterWindow, EnterGadget, #PB_EventType_MouseEnter, 0 ) : EndIf
LeaveGadget = EnterGadget
EndIf
EndSelect
ProcedureReturn CallNextHookEx_(@MOUSE_LL(), nCode, wParam, *ms)
EndProcedure
Procedure Mouse(nCode, wParam, *ms.MOUSEHOOKSTRUCT)
Protected EnterWindowID = WindowFromPoint_( *ms\pt\x | (*ms\pt\y<<32))
If EnterWindowID = GetAncestor_( EnterWindowID, #GA_ROOT )
Else
ProcedureReturn 1
EndIf
EndProcedure
Procedure WinCallback(hWnd, uMsg, WParam, LParam)
Static g_hook, g_hhook
If uMsg = #WM_ACTIVATEAPP
If g_hook = 0 : g_hook = SetWindowsHookEx_(#WH_MOUSE_LL, @MOUSE_LL(), 0, 0) : EndIf
If g_hhook = 0 : g_hhook = SetWindowsHookEx_(#WH_MOUSE, @MOUSE(), GetModuleHandle_(0), GetWindowThreadProcessId_(hWnd, #Null)) : EndIf
ElseIf uMsg = #WM_DESTROY
If(g_hook)
UnhookWindowsHookEx_(g_hook)
g_hook = #Null
EndIf
If(g_hhook)
UnhookWindowsHookEx_(g_hhook)
g_hhook = #Null
EndIf
EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
SetWindowCallback(@WinCallback()) ; activate the callback
EndModule
#PB_Event_MouseMove = Mouse::#PB_Event_MouseMove
Procedure Event_Gadget()
Protected MouseX, MouseY, Steps = 5
Static Check, OffsetX, OffsetY
Debug "EventGadget "+EventGadget() +" EventType "+EventType() +" EventData "+ EventData()
Select EventType()
Case #PB_EventType_LeftButtonUp : Check = #False
Case #PB_EventType_LeftButtonDown : Check = #True
If IsGadget(EventGadget())
OffsetX = WindowMouseX(EventWindow()) - (GadgetX(EventGadget(), #PB_Gadget_ContainerCoordinate))
OffsetY = WindowMouseY(EventWindow()) - (GadgetY(EventGadget(), #PB_Gadget_ContainerCoordinate))
EndIf
Case #PB_EventType_MouseMove
If Check And IsGadget( EventGadget() )
MouseX = (WindowMouseX(EventWindow())-OffsetX)
MouseY = (WindowMouseY(EventWindow())-OffsetY)
ResizeGadget( EventGadget(), ((MouseX / Steps) * Steps), ((MouseY / Steps) * Steps), #PB_Ignore, #PB_Ignore)
EndIf
EndSelect
EndProcedure
Procedure Event_Window()
If EventGadget() = #PB_Ignore
Debug "EventWindow "+EventWindow() +" EventType "+EventType() +" EventData "+ EventData()
EndIf
EndProcedure
If OpenWindow(2, 0, 0, 200, 100, "0", #PB_Window_MinimizeGadget | #PB_Window_SizeGadget)
ButtonGadget(1,10,10,100,30,"Button")
BindGadgetEvent(1, @Event_Gadget())
If OpenWindow(10, 0, 0, 995, 455, "Position de la souris sur la fenêtre", #PB_Window_SizeGadget | #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_Invisible | #PB_Window_NoActivate)
ButtonGadget(#PB_GadgetType_Button, 5, 35, 160,70, "ButtonGadget_"+Str(#PB_GadgetType_Button) ) ; ok
StringGadget(#PB_GadgetType_String, 5, 80, 160,70, "StringGadget_"+Str(#PB_GadgetType_String)) ; ok
TextGadget(#PB_GadgetType_Text, 5, 155, 160,70, "TextGadget_"+Str(#PB_GadgetType_Text)) ; ok
CheckBoxGadget(#PB_GadgetType_CheckBox, 5, 230, 160,70, "CheckBoxGadget_"+Str(#PB_GadgetType_CheckBox) ) ; ok
OptionGadget(#PB_GadgetType_Option, 5, 305, 160,70, "OptionGadget_"+Str(#PB_GadgetType_Option) ) ; ok
ListViewGadget(#PB_GadgetType_ListView, 5, 380, 160,70 ) ; ok
FrameGadget(#PB_GadgetType_Frame, 170, 5, 160,70, "FrameGadget_"+Str(#PB_GadgetType_Frame) )
ComboBoxGadget(#PB_GadgetType_ComboBox, 170, 80, 160,70 ) ; ok
ImageGadget(#PB_GadgetType_Image, 170, 155, 160,70,0,#PB_Image_Border ) ; ok
HyperLinkGadget(#PB_GadgetType_HyperLink, 170, 230, 160,70,"HyperLinkGadget_"+Str(10),0,#PB_HyperLink_Underline ) ; ok
ContainerGadget(#PB_GadgetType_Container, 170, 305, 160,70,#PB_Container_Flat ) : ButtonGadget(301, 0, 0, 50,20, "ButtonGadget" ) :CloseGadgetList() ; ContainerGadget ; ok
ListIconGadget(#PB_GadgetType_ListIcon, 170, 380, 160,70,"ListIconGadget_"+Str(12),60 ) ; ok
IPAddressGadget(#PB_GadgetType_IPAddress, 335, 5, 160,70 ) : SetGadgetState(#PB_GadgetType_IPAddress, MakeIPAddress(1, 2, 3, 4)) ; ok
ProgressBarGadget(#PB_GadgetType_ProgressBar, 335, 80, 160,70,0,0 )
ScrollBarGadget(#PB_GadgetType_ScrollBar, 335, 155, 160,70,0,100,10 )
ScrollAreaGadget(#PB_GadgetType_ScrollArea, 335, 230, 160,70,180,90,1,#PB_ScrollArea_Flat ) : ButtonGadget(201, 0, 0, 50,20, "ButtonGadget" ) : CloseGadgetList()
;SetGadgetColor(#PB_GadgetType_ScrollArea, #PB_Gadget_BackColor, $8551E5 )
TrackBarGadget(#PB_GadgetType_TrackBar, 335, 305, 160,70,0,0 )
WebGadget(#PB_GadgetType_Web, 335, 380, 160,70,"http://www.purebasic.com" )
;
ButtonImageGadget(#PB_GadgetType_ButtonImage, 500, 5, 160,70,0 )
CalendarGadget(#PB_GadgetType_Calendar, 500, 80, 160,70 )
DateGadget(#PB_GadgetType_Date, 500, 155, 160,70 )
EditorGadget(#PB_GadgetType_Editor, 500, 230, 160,70 )
ExplorerListGadget(#PB_GadgetType_ExplorerList, 500, 305, 160,70,"" )
ExplorerTreeGadget(#PB_GadgetType_ExplorerTree, 500, 380, 160,70,"" )
ExplorerComboGadget(#PB_GadgetType_ExplorerCombo, 665, 5, 160,70,"/home/" )
;gtk_entry_set_text_(GadgetID(#PB_GadgetType_ExplorerCombo),"/home/" )
SpinGadget(#PB_GadgetType_Spin, 665, 80, 160,70,0,10 )
TreeGadget(#PB_GadgetType_Tree, 665, 155, 160,70 )
PanelGadget(#PB_GadgetType_Panel, 665, 230, 160,70 ) :AddGadgetItem(#PB_GadgetType_Panel, -1, "Panel") : ButtonGadget(401, 0, 0, 50,20, "ButtonGadget" ) :AddGadgetItem(#PB_GadgetType_Panel, -1, "Panel2") :CloseGadgetList()
ButtonGadget(291, 0, 0, 0,20, "ButtonGadget" )
StringGadget(292, 0, 0, 0,20, "StringGadget")
SplitterGadget(#PB_GadgetType_Splitter, 665, 305, 160,70,292,291 )
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
Define UseID = UseGadgetList(0)
MDIGadget(#PB_GadgetType_MDI, 665, 380, 160,70,1, 2);, #PB_MDI_AutoSize)
AddGadgetItem(#PB_GadgetType_MDI, #PB_Any, "child window")
UseGadgetList(UseID)
CompilerEndIf
InitScintilla()
ScintillaGadget(#PB_GadgetType_Scintilla, 830, 5, 160,70,0 )
ShortcutGadget(#PB_GadgetType_Shortcut, 830, 80, 160,70 ,-1)
CanvasGadget(#PB_GadgetType_Canvas, 830, 155, 160,70 )
Define i
For i=1 To #PB_GadgetType_Canvas
;SetIDGadget( i )
BindGadgetEvent( i, @Event_Gadget() )
Next
; SetIDGadget( 201 )
; SetIDGadget( 301 )
; SetIDGadget( 401 )
;
; BindGadgetEvent( 201, @EventButton() )
; BindGadgetEvent( 301, @EventButton() )
; BindGadgetEvent( 401, @EventButton() )
HideWindow( 10 , 0 )
; SetIDWindow( 10 )
EndIf
BindEvent( #PB_Event_Gadget, @Event_Window() )
Repeat
Select WaitWindowEvent()
Case #PB_Event_MouseMove
Debug "EventWindow = "+EventWindow()+" Event = #PB_Event_MouseMove EventData = "+EventData()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
EndIf