tatane Posted May 10, 2019 Share Posted May 10, 2019 (edited) Hello ! I would like to create a script that allow me to show a network view of my LAN switches. To achieve that I'm loading Pic controls that I can move inside the GUI and resize like a zoom. My problem is to handle the scrollbar/zoom with this GUI. Look at that : expandcollapse popup#include <WindowsConstants.au3> #include <GUIConstantsEx.au3> #Include <GDIPlus.au3> #include <StaticConstants.au3> #include <WinAPI.au3> #include <GUIScrollbars_Ex.au3> #include <Array.au3> ;These constants found in the helpfile under Windows Message Codes ;Global Const $WM_MOUSEMOVE = 0x0200 ;mouse move ;~ Global Const $WM_MOUSEWHEEL = 0x020A ;wheel up/down ;~ Global Const $WM_LBUTTONDOWN = 0x0201 ;~ ;Global Const $WM_LBUTTONUP = 0x0202 ;~ Global Const $WM_RBUTTONDOWN = 0x0204 ;~ Global Const $WM_RBUTTONUP = 0x0205 ;~ Global Const $WM_MBUTTONDOWN = 0x0207 ;~ Global Const $WM_MBUTTONUP = 0x0208 Global Const $MSLLHOOKSTRUCT = $tagPOINT & ";dword mouseData;dword flags;dword time;ulong_ptr dwExtraInfo" Global $currentEvent[2] Global $iLBUTTONDOWN = 0 Global $iRBUTTONDOWN = 0 Global $iMBUTTONDOWN = 0 Global $LRClickStatus = 0 Global $RLClickStatus = 0 Global $LRDrag = 0 Global $RLDrag = 0 Global $LMDrag = 0 Global $RMDrag = 0 Global $doubleClickTime = 400 Global $tPoint Global $diff_x Global $diff_y Global $g_iMouseX, $g_iMouseY Global $diviseur = 1 ;Register callback $hKey_Proc = DllCallbackRegister("_Mouse_Proc", "int", "int;ptr;ptr") $hM_Module = DllCall("kernel32.dll", "hwnd", "GetModuleHandle", "ptr", 0) $hM_Hook = DllCall("user32.dll", "hwnd", "SetWindowsHookEx", "int", $WH_MOUSE_LL, "ptr", DllCallbackGetPtr($hKey_Proc), "hwnd", $hM_Module[0], "dword", 0) Global $_GUI = GUICreate("Ma GUI", 1020, 720, -1, -1, BitOR($WS_MAXIMIZEBOX,$WS_MINIMIZEBOX,$WS_SYSMENU,$WS_TABSTOP)) Global $b_zoomminus = GUICtrlCreateButton("zoom -", 5, 5) Global $b_zoomplus = GUICtrlCreateButton("zoom +", 55, 5) _GDIPlus_Startup() $sImageName = "" ; choose an jpg or bmp to load with full path $hImage = _GDIPlus_ImageLoadFromFile($sImageName) $iWidth = _GDIPlus_ImageGetWidth($hImage) $iHeight = _GDIPlus_ImageGetHeight($hImage) _GDIPlus_ImageDispose($hImage) _GDIPlus_Shutdown() Local $_Image = GUICtrlCreatePic($sImageName, 10, 200, $iWidth, $iHeight) GUICtrlSetPos($_Image, Default, Default, $iWidth / 2, $iHeight / 2) GUISetState(@SW_SHOW) _GUIScrollbars_Generate($_GUI, 2000, 2000) While 1 $nmsg = GUIGetMsg() Switch $nmsg Case $GUI_EVENT_CLOSE DllCall("user32.dll", "int", "UnhookWindowsHookEx", "hwnd", $hM_Hook[0]) $hM_Hook[0] = 0 DllCallbackFree($hKey_Proc) $hKey_Proc = 0 Exit Case $GUI_EVENT_MINIMIZE _GUIScrollbars_Minimize($_GUI) Case $GUI_EVENT_RESTORE _GUIScrollbars_Restore($_GUI) Case $b_zoomplus $diviseur = diviseur * 2 $a_scroll = _GUIScrollbars_Generate($_GUI, 2000 * diviseur, 2000 * diviseur) $a_ctrlcurrentpos = ControlGetPos($_GUI, "", $_Image) GUICtrlSetPos($_Image, Default, Default, $a_ctrlcurrentpos[2] * 2, $a_ctrlcurrentpos[3] * 2) Case $b_zoomminus If $diviseur > 1 Then $diviseur = diviseur / 2 $a_scroll = _GUIScrollbars_Generate($_GUI, 2000 / diviseur, 2000 / diviseur) $a_ctrlcurrentpos = ControlGetPos($_GUI, "", $_Image) GUICtrlSetPos($_Image, Default, Default, $a_ctrlcurrentpos[2] / 2, $a_ctrlcurrentpos[3] / 2) EndIf EndSwitch Sleep(10) WEnd Func _Mouse_Proc($nCode, $wParam, $lParam) Local $info, $mouseData, $time, $timeDiff Local $a_cursorinfo If $nCode < 0 Then $ret = DllCall("user32.dll", "long", "CallNextHookEx", "hwnd", $hM_Hook[0], _ "int", $nCode, "ptr", $wParam, "ptr", $lParam) Return $ret[0] EndIf $info = DllStructCreate($MSLLHOOKSTRUCT, $lParam) $mouseData = DllStructGetData($info, 3) $time = DllStructGetData($info, 5) $timeDiff = $time - $currentEvent[1] Select Case $wParam = $WM_MOUSEMOVE ;Test for Drag in here If $currentEvent[0] <> "LDrag" Or $currentEvent[0] <> "LRDrag" Or $currentEvent[0] <> "LMDrag" Then If $iLBUTTONDOWN = 1 Then $currentEvent[0] = "LDrag" ; coordonnées globales $g_iMouseX = DllStructGetData($info, 1) $g_iMouseY = DllStructGetData($info, 2) ; conversion des coordonnées globales en relatives $tPoint = DllStructCreate("int X;int Y") DllStructSetData($tPoint, "X", $g_iMouseX) DllStructSetData($tPoint, "Y", $g_iMouseY) _WinAPI_ScreenToClient($_GUI, $tPoint) GUICtrlSetPos($_Image, DllStructGetData($tPoint, "X") - $diff_x, DllStructGetData($tPoint, "Y") - $diff_y) If $iRBUTTONDOWN = 1 Then $currentEvent[0] = "LRDrag" $LRDrag = 2 EndIf EndIf EndIf If $currentEvent[0] <> "RDrag" Or $currentEvent[0] <> "RMDrag" Or $currentEvent[0] <> "LRDrag" Then If $iRBUTTONDOWN = 1 Then $currentEvent[0] = "RDrag" EndIf EndIf If $currentEvent[0] <> "MDrag" Then If $iMBUTTONDOWN = 1 Then $currentEvent[0] = "MDrag" $currentEvent[1] = $time EndIf EndIf If $iRBUTTONDOWN = 1 And $iMBUTTONDOWN = 1 And $currentEvent[0] <> "RMDrag" Then $RMDrag = 2 $currentEvent[0] = "RMDrag" $currentEvent[1] = $time EndIf If $iLBUTTONDOWN = 1 And $iMBUTTONDOWN = 1 And $currentEvent[0] <> "LMDrag" Then $LMDrag = 2 $currentEvent[0] = "LMDrag" $currentEvent[1] = $time EndIf Case $wParam = $WM_MOUSEWHEEL If _WinAPI_HiWord($mouseData) > 0 Then ;Wheel Up $currentEvent[0] = "WheelUp" $currentEvent[1] = $time Else ;Wheel Down $currentEvent[0] = "WheelDown" $currentEvent[1] = $time EndIf Case $wParam = $WM_LBUTTONDOWN ; on récupère la position du curseur lors du clic et l'id du control cliqué s'il y en a un sous le curseur $a_cursorinfo = GUIGetCursorInfo($_GUI) If $a_cursorinfo[4] = $_Image Then ; position du control Local $a_controlpos = ControlGetPos($_GUI, "", $_Image) ; on calcule la différence entre les coordonnées du clic et celles du control ; cela permettra de déplacer le control sans décalage de position $diff_x = $a_cursorinfo[0] - $a_controlpos[0] $diff_y = $a_cursorinfo[1] - $a_controlpos[1] ; Register Button Down, check for Right/Left If $currentEvent[0] = "RClick" Then $LRClickStatus = 1 EndIf $iLBUTTONDOWN = 1 EndIf Case $wParam = $WM_LBUTTONUP ;Update $iLBUTTONDOWN $iLBUTTONDOWN = 0 ;Test for Right/Left Click If $RLClickStatus = 1 And ($timeDiff) < $doubleClickTime Then $currentEvent[0] = "RLClick" $currentEvent[1] = $time EndIf If $currentEvent[0] = "LClick" And ($timeDiff) < $doubleClickTime Then $currentEvent[0] = "LDClick" $currentEvent[1] = $time EndIf ;Test for Drops If $currentEvent[0] = "LDrag" Then $currentEvent[0] = "LDrop" $currentEvent[1] = $time EndIf If $LRDrag = 2 And $iRBUTTONDOWN = 1 Then $LRDrag = 1 ; Denote $LRDrag as still having one button clicked, need to register the drop on RButton up EndIf If $LRDrag = 1 And $iRBUTTONDOWN = 0 Then $currentEvent[0] = "LRDrop" $currentEvent[1] = $time $LRDrag = 0 EndIf If $LMDrag = 2 And $iMBUTTONDOWN = 1 Then $LMDrag = 1 ; Denote $LMDrag as still having one button clicked, need to register the drop on MButton up EndIf If $LMDrag = 1 And $iMBUTTONDOWN = 0 Then $currentEvent[0] = "LMDrop" $currentEvent[1] = $time $LMDrag = 0 EndIf ;Set LClick if other events haven't fired If $currentEvent[1] <> $time Then $currentEvent[0] = "LClick" $currentEvent[1] = $time EndIf ;Negate $LRClickStatus $RLClickStatus = 0 Case $wParam = $WM_RBUTTONDOWN ;Register Button Down If $currentEvent[0] = "LClick" Then $RLClickStatus = 1 EndIf $iRBUTTONDOWN = 1 Case $wParam = $WM_RBUTTONUP ;Test for Left, Right, and Right Doubleclick here ;Update $iRBUTTONDOWN $iRBUTTONDOWN = 0 ;Test for Right/Left Click If $LRClickStatus = 1 And ($timeDiff) < $doubleClickTime Then $currentEvent[0] = "LRClick" $currentEvent[1] = $time EndIf If $currentEvent[0] = "RClick" And ($timeDiff) < $doubleClickTime Then $currentEvent[0] = "RDClick" $currentEvent[1] = $time EndIf ;Test for Drops If $currentEvent[0] = "RDrag" Then $currentEvent[0] = "RDrop" $currentEvent[1] = $time EndIf If $LRDrag = 2 And $iLBUTTONDOWN = 1 Then $LRDrag = 1 ; Denote $LRDrag as still having one button clicked, need to register the drop on RButton up EndIf If $LRDrag = 1 And $iLBUTTONDOWN = 0 Then $currentEvent[0] = "LRDrop" $currentEvent[1] = $time $LRDrag = 0 EndIf If $RMDrag = 2 And $iMBUTTONDOWN = 1 Then $RMDrag = 1 ; Denote $LMDrag as still having one button clicked, need to register the drop on MButton up EndIf If $RMDrag = 1 And $iMBUTTONDOWN = 0 Then $currentEvent[0] = "RMDrop" $currentEvent[1] = $time $RMDrag = 0 EndIf ;Set LClick if other events haven't fired If $currentEvent[1] <> $time Then $currentEvent[0] = "RClick" $currentEvent[1] = $time EndIf ;Negate $LRClickStatus $LRClickStatus = 0 Case $wParam = $WM_MBUTTONDOWN ;Register Button Down $iMBUTTONDOWN = 1 Case $wParam = $WM_MBUTTONUP ;Test for Middle Double Click here ;Update $iRBUTTONDOWN $iMBUTTONDOWN = 0 ;Test for Right/Left Click If $currentEvent[0] = "MClick" And ($timeDiff) < $doubleClickTime Then $currentEvent[0] = "MDClick" $currentEvent[1] = $time EndIf ;Test for Drops If $currentEvent[0] = "MDrag" Then $currentEvent[0] = "MDrop" $currentEvent[1] = $time EndIf If $LMDrag = 2 And $iLBUTTONDOWN = 1 Then $LMDrag = 1 ; Denote $LRDrag as still having one button clicked, need to register the drop on RButton up EndIf If $LMDrag = 1 And $iLBUTTONDOWN = 0 Then $currentEvent[0] = "LMDrop" $currentEvent[1] = $time $LMDrag = 0 EndIf If $RMDrag = 2 And $iRBUTTONDOWN = 1 Then $RMDrag = 1 ; Denote $LMDrag as still having one button clicked, need to register the drop on MButton up EndIf If $RMDrag = 1 And $iRBUTTONDOWN = 0 Then $currentEvent[0] = "RMDrop" $currentEvent[1] = $time $RMDrag = 0 EndIf ;Set MClick if other events haven't fired If $currentEvent[1] <> $time Then $currentEvent[0] = "MClick" $currentEvent[1] = $time EndIf EndSelect ;~ If $currentEvent[0] <> "" Then _ ;~ ConsoleWrite("event"&$currentEvent[0] & @CRLF & $currentEvent[1] & @CRLF) $ret = DllCall("user32.dll", "long", "CallNextHookEx", "hwnd", $hM_Hook[0], _ "int", $nCode, "ptr", $wParam, "ptr", $lParam) Return $ret[0] EndFunc ;==>_Mouse_Proc Thanks for your help. Edited May 14, 2019 by tatane Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now