tatane Posted May 10, 2019 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
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