GUICtrlSetOnHover ist scriptübergreifend :(

  • hallöchen

    folgendes problem:

    ich verwende die GuiCtrlSetOnHover_UDF.au3:

    Spoiler anzeigen
    [autoit]

    #include-once
    Opt("MustDeclareVars", 1)
    Opt("OnExitFunc", "CallBack_Exit")

    [/autoit] [autoit][/autoit] [autoit]

    ;GUICtrlSetOnHover Initialize
    Global $HOVER_CONTROLS_ARRAY[1][1]
    Global $LAST_HOVERED_ELEMENT[2] = [-1, -1]
    Global $LAST_HOVERED_ELEMENT_MARK = -1
    Global $pTimerProc = DllCallbackRegister("CALLBACKPROC", "none", "hwnd;uint;uint;dword")
    Global $uiTimer = DllCall("user32.dll", "uint", "SetTimer", "hwnd", 0, "uint", 0, "int", 10, "ptr", DllCallbackGetPtr($pTimerProc))
    $uiTimer = $uiTimer[0]

    [/autoit] [autoit][/autoit] [autoit]

    Opt("MustDeclareVars", 0)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Function Name: GUICtrlSetOnHover()
    ; Description: Set function(s) to call when hovering/leave hovering GUI elements.
    ; Parameter(s): $CtrlID - The Ctrl ID to set hovering for (can be a -1 as indication to the last item created).
    ; $HoverFuncName - Function to call when the mouse is hovering the control.
    ; $LeaveHoverFuncName - [Optional] Function to call when the mouse is leaving hovering the control
    ; (-1 no function used).
    ;
    ; Return Value(s): Always returns 1 regardless of success.
    ; Requirement(s): AutoIt 3.2.10.0
    ; Note(s): 1) TreeView/ListView Items can not be set :(.
    ; 2) When the window is not active, the hover/leave hover functions will still called,
    ; but not when the window is disabled.
    ; 3) The hover/leave hover functions will be called even if the script is paused by such functions as MsgBox().
    ; Author(s): G.Sandler (a.k.a CreatoR).
    ;
    ;===============================================================================
    Func GUICtrlSetOnHover($CtrlID, $HoverFuncName, $LeaveHoverFuncName=-1)
    Local $Ubound = UBound($HOVER_CONTROLS_ARRAY)
    ReDim $HOVER_CONTROLS_ARRAY[$Ubound+1][3]
    $HOVER_CONTROLS_ARRAY[$Ubound][0] = GUICtrlGetHandle($CtrlID)
    $HOVER_CONTROLS_ARRAY[$Ubound][1] = $HoverFuncName
    $HOVER_CONTROLS_ARRAY[$Ubound][2] = $LeaveHoverFuncName
    $HOVER_CONTROLS_ARRAY[0][0] = $Ubound
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;CallBack function to handle the hovering process
    Func CALLBACKPROC($hWnd, $uiMsg, $idEvent, $dwTime)
    If UBound($HOVER_CONTROLS_ARRAY)-1 < 1 Then Return
    Local $ControlGetHovered = _ControlGetHovered()
    Local $sCheck_LHE = $LAST_HOVERED_ELEMENT[1]

    If $ControlGetHovered = 0 Or ($sCheck_LHE <> -1 And $ControlGetHovered <> $sCheck_LHE) Then
    If $LAST_HOVERED_ELEMENT_MARK = -1 Then Return
    If $LAST_HOVERED_ELEMENT[0] <> -1 Then Call($LAST_HOVERED_ELEMENT[0], $LAST_HOVERED_ELEMENT[1])
    $LAST_HOVERED_ELEMENT[0] = -1
    $LAST_HOVERED_ELEMENT[1] = -1
    $LAST_HOVERED_ELEMENT_MARK = -1
    Else
    For $i = 1 To $HOVER_CONTROLS_ARRAY[0][0]
    If $HOVER_CONTROLS_ARRAY[$i][0] = GUICtrlGetHandle($ControlGetHovered) Then
    If $LAST_HOVERED_ELEMENT_MARK = $HOVER_CONTROLS_ARRAY[$i][0] Then ExitLoop
    $LAST_HOVERED_ELEMENT_MARK = $HOVER_CONTROLS_ARRAY[$i][0]
    Call($HOVER_CONTROLS_ARRAY[$i][1], $ControlGetHovered)
    If $HOVER_CONTROLS_ARRAY[$i][2] <> -1 Then
    $LAST_HOVERED_ELEMENT[0] = $HOVER_CONTROLS_ARRAY[$i][2]
    $LAST_HOVERED_ELEMENT[1] = $ControlGetHovered
    EndIf
    ExitLoop
    EndIf
    Next
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;Thanks to amel27 for that one!!!
    Func _ControlGetHovered()
    Local $Old_Opt_MCM = Opt("MouseCoordMode", 1)
    Local $iRet = DllCall("user32.dll", "int", "WindowFromPoint", _
    "long", MouseGetPos(0), _
    "long", MouseGetPos(1))
    $iRet = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $iRet[0])
    Opt("MouseCoordMode", $Old_Opt_MCM)
    Return $iRet[0]
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;Release the CallBack resources
    Func CallBack_Exit()
    DllCallbackFree($pTimerProc)
    DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "uint", $uiTimer)
    EndFunc

    [/autoit]

    in folgendem testscript:

    Spoiler anzeigen
    [autoit]

    #include "GuiCtrlSetOnHover_UDF.au3"

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("HoverButton",170,100,100,200)
    GUICtrlCreateIcon(@SystemDir & "\shell32.dll", -1, 50, 50, 32, 32)
    GUICtrlSetOnHover(-1, "Hover_Func", "Leave_Hover_Func")
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func Hover_Func($CtrlID)
    GUICtrlSetImage($CtrlID, @SystemDir & "\shell32.dll", 2)
    EndFunc
    Func Leave_Hover_Func($CtrlID)
    GUICtrlSetImage($CtrlID, @SystemDir & "\shell32.dll", 1)
    EndFunc

    [/autoit]

    wenn ich nun folgendes script paralell laufen lasse:

    Spoiler anzeigen
    [autoit]

    GUICreate("Nix Hover",170,100,300,100)
    GUICtrlCreateLabel("Dieses Label triggert den hover-effekt des anderen scripts",10,50,150,50)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit]

    dann läßt sich das icon des ersten script mit dem label des 2 scriptes hovern...
    ich hoffe, ihr wisst, was ich meine; der hovereffekt ist leider nicht auf ein script beschränkt!

    kann man das irgendwie lösen, sodaß sich die beiden programme nicht gegenseitig stören?

    vielen dank
    lgE

  • Sollte gehen, wenn die hoverUDF änderst:

    [autoit]

    Zeile 58
    If $HOVER_CONTROLS_ARRAY[$i][0] = GUICtrlGetHandle($ControlGetHovered) Then
    ändern in
    If $HOVER_CONTROLS_ARRAY[$i][0] = $ControlGetHovered Then

    [/autoit]


    und Zeile 78 löschen.
    Es ist doch sinnlos, die erst das Handle in eine ControlID und die dann wieder in ein Handle zu verwandeln. Dann werde auch ControlIDs von anderen Fenster als eigene gesehen, wenn es die gleiche ist.

    //Edit: Es war doch etwas mehr:

    HoverUDF_fixed
    [autoit]

    #include-once
    Opt("MustDeclareVars", 1)
    Opt("OnExitFunc", "CallBack_Exit")

    [/autoit] [autoit][/autoit] [autoit]

    ;GUICtrlSetOnHover Initialize
    Global $HOVER_CONTROLS_ARRAY[1][1]
    Global $LAST_HOVERED_ELEMENT[2] = [-1, -1]
    Global $LAST_HOVERED_ELEMENT_MARK = -1
    Global $pTimerProc = DllCallbackRegister("CALLBACKPROC", "none", "hwnd;uint;uint;dword")
    Global $uiTimer = DllCall("user32.dll", "uint", "SetTimer", "hwnd", 0, "uint", 0, "int", 10, "ptr", DllCallbackGetPtr($pTimerProc))
    $uiTimer = $uiTimer[0]

    [/autoit] [autoit][/autoit] [autoit]

    Opt("MustDeclareVars", 0)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Function Name: GUICtrlSetOnHover()
    ; Description: Set function(s) to call when hovering/leave hovering GUI elements.
    ; Parameter(s): $CtrlID - The Ctrl ID to set hovering for (can be a -1 as indication to the last item created).
    ; $HoverFuncName - Function to call when the mouse is hovering the control.
    ; $LeaveHoverFuncName - [Optional] Function to call when the mouse is leaving hovering the control
    ; (-1 no function used).
    ;
    ; Return Value(s): Always returns 1 regardless of success.
    ; Requirement(s): AutoIt 3.2.10.0
    ; Note(s): 1) TreeView/ListView Items can not be set :(.
    ; 2) When the window is not active, the hover/leave hover functions will still called,
    ; but not when the window is disabled.
    ; 3) The hover/leave hover functions will be called even if the script is paused by such functions as MsgBox().
    ; Author(s): G.Sandler (a.k.a CreatoR).
    ;
    ;===============================================================================
    Func GUICtrlSetOnHover($CtrlID, $HoverFuncName, $LeaveHoverFuncName=-1)
    Local $Ubound = UBound($HOVER_CONTROLS_ARRAY)
    ReDim $HOVER_CONTROLS_ARRAY[$Ubound+1][3]
    $HOVER_CONTROLS_ARRAY[$Ubound][0] = GUICtrlGetHandle($CtrlID)
    $HOVER_CONTROLS_ARRAY[$Ubound][1] = $HoverFuncName
    $HOVER_CONTROLS_ARRAY[$Ubound][2] = $LeaveHoverFuncName
    $HOVER_CONTROLS_ARRAY[0][0] = $Ubound
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;CallBack function to handle the hovering process
    Func CALLBACKPROC($hWnd, $uiMsg, $idEvent, $dwTime)
    If UBound($HOVER_CONTROLS_ARRAY)-1 < 1 Then Return
    Local $ControlGetHovered = _ControlGetHoveredHwnd()
    Local $sCheck_LHE = $LAST_HOVERED_ELEMENT[1]

    If $ControlGetHovered = 0 Or ($sCheck_LHE <> -1 And $ControlGetHovered <> $sCheck_LHE) Then
    If $LAST_HOVERED_ELEMENT_MARK = -1 Then Return
    If $LAST_HOVERED_ELEMENT[0] <> -1 Then Call($LAST_HOVERED_ELEMENT[0], _ControlGetID($LAST_HOVERED_ELEMENT[1]))
    $LAST_HOVERED_ELEMENT[0] = -1
    $LAST_HOVERED_ELEMENT[1] = -1
    $LAST_HOVERED_ELEMENT_MARK = -1
    Else
    For $i = 1 To $HOVER_CONTROLS_ARRAY[0][0]
    If $HOVER_CONTROLS_ARRAY[$i][0] = $ControlGetHovered Then
    If $LAST_HOVERED_ELEMENT_MARK = $HOVER_CONTROLS_ARRAY[$i][0] Then ExitLoop
    $LAST_HOVERED_ELEMENT_MARK = $HOVER_CONTROLS_ARRAY[$i][0]
    Call($HOVER_CONTROLS_ARRAY[$i][1], _ControlGetID($ControlGetHovered))
    If $HOVER_CONTROLS_ARRAY[$i][2] <> -1 Then
    $LAST_HOVERED_ELEMENT[0] = $HOVER_CONTROLS_ARRAY[$i][2]
    $LAST_HOVERED_ELEMENT[1] = $ControlGetHovered
    EndIf
    ExitLoop
    EndIf
    Next
    EndIf
    EndFunc
    #include <WinApi.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Func _ControlGetID($ControlGetHovered)
    Local $ControlGetHoveredID = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $ControlGetHovered)
    If @error Then Return
    Return $ControlGetHoveredID[0]
    EndFunc
    ;Thanks to amel27 for that one!!!
    Func _ControlGetHoveredHwnd()
    Local $mouse = _WinAPI_GetCursorInfo()
    Local $iRet = DllCall("user32.dll", "hwnd", "WindowFromPoint", _
    "long", $mouse[3], _
    "long", $mouse[4])
    Return $iRet[0]
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;Release the CallBack resources
    Func CallBack_Exit()
    DllCallbackFree($pTimerProc)
    DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "uint", $uiTimer)
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von progandy (9. April 2008 um 12:42)