UDF: ToolTips für Slider Controls

  • Irgendjemand hat in der Shoutbox gefragt, wie man einen ToolTip bei einem Slider Control anzeigen lassen kann wenn man mit der Maus über die SliderBar fährt (also ohne das Control anzuklicken oder dessen Wert zu verändern) à la Youtube Player.
    Ich habe mal ein wenig damit herumexperimentiert, und dabei ist diese UDF herausgekommen... Sie ist nicht sehr vollständig und Beschreibungen fehlen auch, aber das kann ich ja bei Bedarf noch hinzufügen. Vertikale Slider werden leider noch nicht unterstützt. :( Ein Beispiel ist vorhanden. Ich würde mich über konstruktive Kritik und/oder Verbesserungsvorschläge freuen. :)

    Neue Features:
    - 3ter Parameter um einen Text statt dem Wert des Sliders anzeigen zu lassen. (Idee: hellboy3) :).
    - 4ter Parameter um den bei $sText angegebenen String als Funktion aufzurufen und ihren Rückgabewert im ToolTip anzuzeigen. (Idee: L3viathan) :).
    - 5ter Parameter um festzulegen, ob der ToolTip auch bei inaktivem Fenster (Fokusverlust) angezeigt werden soll. (Idee: hellboy3).

    UDF (normaler ToolTip)
    [autoit]

    #include-once
    #include <GUISlider.au3>
    #include <WinApi.au3>
    #include <Array.au3>

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

    ;SliderTip.au3 UDF by name22 (autoit.de)

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

    Global $aRegisteredSlider[1][10]
    $aRegisteredSlider[0][0] = 0

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

    ; #FUNCTION# ;===============================================================================
    ; Name...........: _SliderTip_RegisterToolTip
    ; Description ...: Erzeugt einen ToolTip an der Mausposition, sobald diese sich über dem angegebenen Slider-Control befindet.
    ; Ist $sText = "" dann wird der Wert des Sliders an der Position der Maus berechnet und als Text für den ToolTip
    ; verwendet.
    ; Syntax.........: _SliderTip_RegisterToolTip($cSliderRegister, $hWndSlider, [$sText = "", [$bCall = False]])
    ; Parameters ....: $cSliderRegister - Control-ID des Sliders.
    ; $hWndSlider - Handle des Fensters, in dem sich der Slider befindet.
    ; $sText - [optional] Text, der anstatt dem Slider Wert im ToolTip angezeigt werden soll.
    ; Standard = "".
    ; $bCall - [optional] Falls True, dann wird der Rückgabewert der bei $sText angegebenen Funktion im
    ; ToolTip angezeigt.
    ; $bHideInactive - [oprional] Falls True, dann wird kein ToolTip angezeigt wenn das Fenster den Fokus verliert.
    ; Return values .: None
    ; Author ........: name22 @autoit.de
    ; Remarks .......:
    ; Example .......; Yes
    ; ;==========================================================================================
    Func _SliderTip_RegisterToolTip($cSliderRegister, $hWndSlider, $sText = "", $bCall = False, $bHideInactive = False)
    $aRegisteredSlider[0][0] += 1
    ReDim $aRegisteredSlider[$aRegisteredSlider[0][0] + 1][10]

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

    $aSliderPos = ControlGetPos($hWndSlider, "", $cSliderRegister)
    $aSliderChannelRectTmp = _GUICtrlSlider_GetChannelRect($cSliderRegister)
    $aRange = _GUICtrlSlider_GetRange($cSliderRegister)
    $VPP = Abs($aRange[0] - $aRange[1]) / Abs($aSliderChannelRectTmp[0] - $aSliderChannelRectTmp[2])

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

    $aRegisteredSlider[$aRegisteredSlider[0][0]][0] = $cSliderRegister
    $aRegisteredSlider[$aRegisteredSlider[0][0]][1] = $aSliderChannelRectTmp[0] + $aSliderPos[0]
    $aRegisteredSlider[$aRegisteredSlider[0][0]][2] = $aSliderChannelRectTmp[1] + $aSliderPos[1] - 7
    $aRegisteredSlider[$aRegisteredSlider[0][0]][3] = $aSliderChannelRectTmp[2] + $aSliderPos[0]
    $aRegisteredSlider[$aRegisteredSlider[0][0]][4] = $aSliderChannelRectTmp[3] + $aSliderPos[1] + 5
    $aRegisteredSlider[$aRegisteredSlider[0][0]][5] = $VPP
    $aRegisteredSlider[$aRegisteredSlider[0][0]][6] = $hWndSlider
    $aRegisteredSlider[$aRegisteredSlider[0][0]][7] = $sText
    $aRegisteredSlider[$aRegisteredSlider[0][0]][8] = $bCall
    $aRegisteredSlider[$aRegisteredSlider[0][0]][9] = $bHideInactive

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

    AdlibRegister("_SliderTip_AdlibRegister", 30)
    EndFunc ;==>_SliderTip_RegisterToolTip

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

    ;Deregistriert einen Slider.
    Func _SliderTip_UnRegisterToolTip($cSliderUnRegister, $hWndSlider)
    If $aRegisteredSlider[0][0] = 0 Then Return 0
    Local $bSliderExists = False

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

    For $i = 1 To $aRegisteredSlider[0][0]
    If $aRegisteredSlider[$i][0] = $cSliderUnRegister And $aRegisteredSlider[$i][6] = $hWndSlider Then
    _ArrayDelete($aRegisteredSlider, $i)
    $bSliderExists = True
    ExitLoop
    EndIf
    Next

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

    If $bSliderExists = False Then Return 0

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

    $aRegisteredSlider[0][0] -= 1
    If $aRegisteredSlider[0][0] = 0 Then AdlibUnRegister("_SliderTip_AdlibRegister")

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

    Return 1
    EndFunc ;==>_SliderTip_UnRegisterToolTip

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

    Func _SliderTip_AdlibRegister()
    Local $bToolTip = False, $aWinPos[2], $aRangeSlider, $tMousePos_Client, $tMousePos_Screen

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

    For $i = 1 To $aRegisteredSlider[0][0]
    $tMousePos_Client = _WinAPI_GetMousePos(True, $aRegisteredSlider[$i][6])
    $tMousePos_Screen = _WinAPI_GetMousePos()
    If DllStructGetData($tMousePos_Client, "X") >= $aRegisteredSlider[$i][1] And DllStructGetData($tMousePos_Client, "Y") >= $aRegisteredSlider[$i][2] And DllStructGetData($tMousePos_Client, "X") <= $aRegisteredSlider[$i][3] And DllStructGetData($tMousePos_Client, "Y") <= $aRegisteredSlider[$i][4] Then
    If _WinAPI_GetForegroundWindow() = $aRegisteredSlider[$i][6] Or $aRegisteredSlider[$i][9] = False Then
    $aWinPos[0] = DllStructGetData($tMousePos_Screen, "X") - DllStructGetData($tMousePos_Client, "X")
    $aWinPos[1] = DllStructGetData($tMousePos_Screen, "Y") - DllStructGetData($tMousePos_Client, "Y")
    $aRangeSlider = _GUICtrlSlider_GetRange($aRegisteredSlider[$i][0])

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

    Switch $aRegisteredSlider[$i][7]
    Case ""
    ToolTip(Round($aRangeSlider[0] + (DllStructGetData($tMousePos_Client, "X") - $aRegisteredSlider[$i][1]) * $aRegisteredSlider[$i][5]), DllStructGetData($tMousePos_Screen, "X"), $aWinPos[1] + $aRegisteredSlider[$i][2] - 20)
    Case Else
    Switch $aRegisteredSlider[$i][8]
    Case False
    ToolTip($aRegisteredSlider[$i][7], DllStructGetData($tMousePos_Screen, "X"), $aWinPos[1] + $aRegisteredSlider[$i][2] - 20)
    Case True
    ToolTip(Call($aRegisteredSlider[$i][7]), DllStructGetData($tMousePos_Screen, "X"), $aWinPos[1] + $aRegisteredSlider[$i][2] - 20)
    EndSwitch
    EndSwitch

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

    $bToolTip = True
    EndIf
    EndIf
    Next

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

    If Not $bToolTip Then ToolTip("")
    EndFunc ;==>_SliderTip_AdlibRegister

    [/autoit]
    UDF (Custom ToolTip)
    [autoit]

    #include-once
    #include <GUISlider.au3>
    #include <WinApi.au3>
    #include <Array.au3>
    #include "ToolTipEx.au3"

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

    ;SliderTipEx.au3 UDF by name22 @autoit.de (ToolTipEx.au3 by name22 required)

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

    Global $aRegisteredSlider[1][10]
    $aRegisteredSlider[0][0] = 0

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

    ; #FUNCTION# ;===============================================================================
    ; Name...........: _SliderTip_RegisterToolTip
    ; Description ...: Erzeugt einen ToolTip an der Mausposition, sobald diese sich über dem angegebenen Slider-Control befindet.
    ; Ist $sText = "" dann wird der Wert des Sliders an der Position der Maus berechnet und als Text für den ToolTip
    ; verwendet.
    ; Syntax.........: _SliderTip_RegisterToolTip($cSliderRegister, $hWndSlider, [$sText = "", [$bCall = False]])
    ; Parameters ....: $cSliderRegister - Control-ID des Sliders.
    ; $hWndSlider - Handle des Fensters, in dem sich der Slider befindet.
    ; $sText - [optional] Text, der anstatt dem Slider Wert im ToolTip angezeigt werden soll.
    ; Standard = "".
    ; $bCall - [optional] Falls True, dann wird der Rückgabewert der bei $sText angegebenen Funktion im
    ; ToolTip angezeigt.
    ; $bHideInactive - [oprional] Falls True, dann wird kein ToolTip angezeigt wenn das Fenster den Fokus verliert.
    ; Return values .: None
    ; Author ........: name22 @autoit.de
    ; Remarks .......:
    ; Example .......; Yes
    ; ;==========================================================================================
    Func _SliderTip_RegisterToolTip($cSliderRegister, $hWndSlider, $sText = "", $bCall = False, $bHideInactive = False)
    $aRegisteredSlider[0][0] += 1
    ReDim $aRegisteredSlider[$aRegisteredSlider[0][0] + 1][10]

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

    $aSliderPos = ControlGetPos($hWndSlider, "", $cSliderRegister)
    $aSliderChannelRectTmp = _GUICtrlSlider_GetChannelRect($cSliderRegister)
    $aRange = _GUICtrlSlider_GetRange($cSliderRegister)
    $VPP = Abs($aRange[0] - $aRange[1]) / Abs($aSliderChannelRectTmp[0] - $aSliderChannelRectTmp[2])

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

    $aRegisteredSlider[$aRegisteredSlider[0][0]][0] = $cSliderRegister
    $aRegisteredSlider[$aRegisteredSlider[0][0]][1] = $aSliderChannelRectTmp[0] + $aSliderPos[0]
    $aRegisteredSlider[$aRegisteredSlider[0][0]][2] = $aSliderChannelRectTmp[1] + $aSliderPos[1] - 7
    $aRegisteredSlider[$aRegisteredSlider[0][0]][3] = $aSliderChannelRectTmp[2] + $aSliderPos[0]
    $aRegisteredSlider[$aRegisteredSlider[0][0]][4] = $aSliderChannelRectTmp[3] + $aSliderPos[1] + 5
    $aRegisteredSlider[$aRegisteredSlider[0][0]][5] = $VPP
    $aRegisteredSlider[$aRegisteredSlider[0][0]][6] = $hWndSlider
    $aRegisteredSlider[$aRegisteredSlider[0][0]][7] = $sText
    $aRegisteredSlider[$aRegisteredSlider[0][0]][8] = $bCall
    $aRegisteredSlider[$aRegisteredSlider[0][0]][9] = $bHideInactive

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

    AdlibRegister("_SliderTip_AdlibRegister", 30)
    EndFunc ;==>_SliderTip_RegisterToolTip

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

    ;Deregistriert einen Slider.
    Func _SliderTip_UnRegisterToolTip($cSliderUnRegister, $hWndSlider)
    If $aRegisteredSlider[0][0] = 0 Then Return 0
    Local $bSliderExists = False

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

    For $i = 1 To $aRegisteredSlider[0][0]
    If $aRegisteredSlider[$i][0] = $cSliderUnRegister And $aRegisteredSlider[$i][6] = $hWndSlider Then
    _ArrayDelete($aRegisteredSlider, $i)
    $bSliderExists = True
    ExitLoop
    EndIf
    Next

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

    If $bSliderExists = False Then Return 0

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

    $aRegisteredSlider[0][0] -= 1
    If $aRegisteredSlider[0][0] = 0 Then AdlibUnRegister("_SliderTip_AdlibRegister")

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

    Return 1
    EndFunc ;==>_SliderTip_UnRegisterToolTip

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

    Func _SliderTip_AdlibRegister()
    Local $bToolTip = False, $aWinPos[2], $aRangeSlider, $tMousePos_Client, $tMousePos_Screen

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

    For $i = 1 To $aRegisteredSlider[0][0]
    $tMousePos_Client = _WinAPI_GetMousePos(True, $aRegisteredSlider[$i][6])
    $tMousePos_Screen = _WinAPI_GetMousePos()
    If DllStructGetData($tMousePos_Client, "X") >= $aRegisteredSlider[$i][1] And DllStructGetData($tMousePos_Client, "Y") >= $aRegisteredSlider[$i][2] And DllStructGetData($tMousePos_Client, "X") <= $aRegisteredSlider[$i][3] And DllStructGetData($tMousePos_Client, "Y") <= $aRegisteredSlider[$i][4] Then
    If _WinAPI_GetForegroundWindow() = $aRegisteredSlider[$i][6] Or $aRegisteredSlider[$i][9] = False Then
    $aWinPos[0] = DllStructGetData($tMousePos_Screen, "X") - DllStructGetData($tMousePos_Client, "X")
    $aWinPos[1] = DllStructGetData($tMousePos_Screen, "Y") - DllStructGetData($tMousePos_Client, "Y")
    $aRangeSlider = _GUICtrlSlider_GetRange($aRegisteredSlider[$i][0])

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

    Switch $aRegisteredSlider[$i][7]
    Case ""
    _ToolTip_Create(Round($aRangeSlider[0] + (DllStructGetData($tMousePos_Client, "X") - $aRegisteredSlider[$i][1]) * $aRegisteredSlider[$i][5]), DllStructGetData($tMousePos_Screen, "X"), $aWinPos[1] + $aRegisteredSlider[$i][2])
    Case Else
    Switch $aRegisteredSlider[$i][8]
    Case False
    _ToolTip_Create($aRegisteredSlider[$i][7], DllStructGetData($tMousePos_Screen, "X"), $aWinPos[1] + $aRegisteredSlider[$i][2])
    Case True
    _ToolTip_Create(Call($aRegisteredSlider[$i][7]), DllStructGetData($tMousePos_Screen, "X"), $aWinPos[1] + $aRegisteredSlider[$i][2])
    EndSwitch
    EndSwitch

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

    $bToolTip = True
    EndIf
    EndIf
    Next

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

    If Not $bToolTip Then _ToolTip_Create("")
    EndFunc ;==>_SliderTip_AdlibRegister

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

    Func _WinGetClientPos($hWnd) ; - Author: name22 (http://www.autoit.de)
    Local $aReturn[2]
    Local $iOptMouseCoord = Opt("MouseCoordMode", 1)

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

    Local $aMousePosAbs = MouseGetPos()
    Local $aMousePosRel = GUIGetCursorInfo($hWnd)

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

    Opt("MouseCoordMode", $iOptMouseCoord)

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

    $aReturn[0] = $aMousePosAbs[0] - $aMousePosRel[0]
    $aReturn[1] = $aMousePosAbs[1] - $aMousePosRel[1]

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

    Return $aReturn
    EndFunc ;==>_WinGetClientPos

    [/autoit]
    Beispiel
    [autoit]

    #include <GUIConstants.au3>
    #include "SliderTip.au3"

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

    $hWnd = GUICreate("SliderTip Beispiel by name22 (autoit.de)", 400, 130)
    $cSlider1 = GUICtrlCreateSlider(5, 5, 390, 40)
    GUICtrlSetLimit(-1, 500, 0)
    $cSlider2 = GUICtrlCreateSlider(5, 45, 390, 40)
    GUICtrlSetLimit(-1, 600, 50)
    $cSlider3 = GUICtrlCreateSlider(5, 85, 390, 40)
    GUICtrlSetLimit(-1, 300, 100)
    GUISetState()

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

    _SliderTip_RegisterToolTip($cSlider1, $hWnd)
    _SliderTip_RegisterToolTip($cSlider2, $hWnd, "AutoIt!", False, True)
    _SliderTip_RegisterToolTip($cSlider3, $hWnd, "_Time", True)

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

    While 1
    Switch GUIGetMsg(0)
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func _Time()
    Return @SEC
    EndFunc

    [/autoit]


    Update: Alternative Version mit dem ToolTip aus meiner neuen UDF (GDIP.au3 findet ihr im Thread zum ToolTip ;)).

  • Sieht ziemlich gut aus.
    Vielleicht kann man das ja noch unter Umständen so ausbauen, das mein wie bei YouTube einen eigenen ToolTip benutzen kann. Also vom Style her. Ich hoffe du verstehste was ich meine.

  • Zitat

    Vielleicht kann man das ja noch unter Umständen so ausbauen, das mein wie bei YouTube einen eigenen ToolTip benutzen kann. Also vom Style her. Ich hoffe du verstehste was ich meine.


    Das ist eine prima Idee, aber dann muss ich auch noch eine eigene ToolTip Funktion schreiben.... Ich werd mal sehen ob ich das hinbekomme. ;)

  • Zitat

    Wäre noch nett wenn man über einen paramter selbst entscheiden könnte was der Tooltip anzeigen soll :)


    Ok. Kann ich einbauen, aber wie genau meinst du das? So dass der Wert des Sliders an dieser Stelle trotzdem angezeigt wird? Oder überall der gleiche Text?

  • Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include "SliderTip.au3"

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

    $meintext = "ToolTip"

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

    $hWnd = GUICreate("SliderTip Beispiel by name22 (autoit.de)", 400, 90)
    $cSlider1 = GUICtrlCreateSlider(5, 5, 390, 40)
    GUICtrlSetLimit(-1, 500, 0)
    $cSlider2 = GUICtrlCreateSlider(5, 45, 390, 40)
    GUICtrlSetLimit(-1, 600, 50)
    GUISetState()

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

    _SliderTip_RegisterToolTip($cSlider1, $hWnd , $meintext) ; so meinte ich das :)
    _SliderTip_RegisterToolTip($cSlider2, $hWnd)

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

    While 1
    Switch GUIGetMsg(0)
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]

    :)

    MfG hellboy

    [autoit]

    Do
    _help($user)
    Until $questions = 0

    [/autoit]

    Meine Werke:
    Ste`s Web-Radio

  • Hier:

    Beispiel
    [autoit]

    #include <GUIConstants.au3>
    #include "SliderTip.au3"

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

    $hWnd = GUICreate("SliderTip Beispiel by name22 (autoit.de)", 400, 130)
    $cSlider1 = GUICtrlCreateSlider(5, 5, 390, 40)
    GUICtrlSetLimit(-1, 500, 0)
    $cSlider2 = GUICtrlCreateSlider(5, 45, 390, 40)
    GUICtrlSetLimit(-1, 600, 50)
    $cSlider3 = GUICtrlCreateSlider(5, 85, 390, 40)
    GUICtrlSetLimit(-1, 600, 50)
    GUISetState()

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

    _SliderTip_RegisterToolTip($cSlider1, $hWnd)
    _SliderTip_RegisterToolTip($cSlider2, $hWnd, "AutoIt!")
    _SliderTip_RegisterToolTip($cSlider3, $hWnd, "time()", True)

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

    While 1
    Switch GUIGetMsg(0)
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd
    Func time()
    Return @SEC
    EndFunc

    [/autoit]

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

  • Funktioniert super! :)

    Ne Frage , wozu dient GuiGetCursorInfo() in deiner UDF? Weil dadurch zuckt mein Slider jetzt (passiert wenn man Guigetcursorinfo zweimal benutzt...laaange geschichte)

    MfG hellboy

    [autoit]

    Do
    _help($user)
    Until $questions = 0

    [/autoit]

    Meine Werke:
    Ste`s Web-Radio