Jump to content

Recommended Posts

Posted (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 :

#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 by tatane

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...