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)
#include-once
#include <GUISlider.au3>
#include <WinApi.au3>
#include <Array.au3>
;SliderTip.au3 UDF by name22 (autoit.de)
[/autoit] [autoit][/autoit] [autoit]Global $aRegisteredSlider[1][10]
$aRegisteredSlider[0][0] = 0
; #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]
$aSliderPos = ControlGetPos($hWndSlider, "", $cSliderRegister)
$aSliderChannelRectTmp = _GUICtrlSlider_GetChannelRect($cSliderRegister)
$aRange = _GUICtrlSlider_GetRange($cSliderRegister)
$VPP = Abs($aRange[0] - $aRange[1]) / Abs($aSliderChannelRectTmp[0] - $aSliderChannelRectTmp[2])
$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
AdlibRegister("_SliderTip_AdlibRegister", 30)
EndFunc ;==>_SliderTip_RegisterToolTip
;Deregistriert einen Slider.
Func _SliderTip_UnRegisterToolTip($cSliderUnRegister, $hWndSlider)
If $aRegisteredSlider[0][0] = 0 Then Return 0
Local $bSliderExists = False
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
If $bSliderExists = False Then Return 0
[/autoit] [autoit][/autoit] [autoit]$aRegisteredSlider[0][0] -= 1
If $aRegisteredSlider[0][0] = 0 Then AdlibUnRegister("_SliderTip_AdlibRegister")
Return 1
EndFunc ;==>_SliderTip_UnRegisterToolTip
Func _SliderTip_AdlibRegister()
Local $bToolTip = False, $aWinPos[2], $aRangeSlider, $tMousePos_Client, $tMousePos_Screen
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])
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
$bToolTip = True
EndIf
EndIf
Next
If Not $bToolTip Then ToolTip("")
EndFunc ;==>_SliderTip_AdlibRegister
UDF (Custom ToolTip)
#include-once
#include <GUISlider.au3>
#include <WinApi.au3>
#include <Array.au3>
#include "ToolTipEx.au3"
;SliderTipEx.au3 UDF by name22 @autoit.de (ToolTipEx.au3 by name22 required)
[/autoit] [autoit][/autoit] [autoit]Global $aRegisteredSlider[1][10]
$aRegisteredSlider[0][0] = 0
; #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]
$aSliderPos = ControlGetPos($hWndSlider, "", $cSliderRegister)
$aSliderChannelRectTmp = _GUICtrlSlider_GetChannelRect($cSliderRegister)
$aRange = _GUICtrlSlider_GetRange($cSliderRegister)
$VPP = Abs($aRange[0] - $aRange[1]) / Abs($aSliderChannelRectTmp[0] - $aSliderChannelRectTmp[2])
$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
AdlibRegister("_SliderTip_AdlibRegister", 30)
EndFunc ;==>_SliderTip_RegisterToolTip
;Deregistriert einen Slider.
Func _SliderTip_UnRegisterToolTip($cSliderUnRegister, $hWndSlider)
If $aRegisteredSlider[0][0] = 0 Then Return 0
Local $bSliderExists = False
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
If $bSliderExists = False Then Return 0
[/autoit] [autoit][/autoit] [autoit]$aRegisteredSlider[0][0] -= 1
If $aRegisteredSlider[0][0] = 0 Then AdlibUnRegister("_SliderTip_AdlibRegister")
Return 1
EndFunc ;==>_SliderTip_UnRegisterToolTip
Func _SliderTip_AdlibRegister()
Local $bToolTip = False, $aWinPos[2], $aRangeSlider, $tMousePos_Client, $tMousePos_Screen
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])
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
$bToolTip = True
EndIf
EndIf
Next
If Not $bToolTip Then _ToolTip_Create("")
EndFunc ;==>_SliderTip_AdlibRegister
Func _WinGetClientPos($hWnd) ; - Author: name22 (http://www.autoit.de)
Local $aReturn[2]
Local $iOptMouseCoord = Opt("MouseCoordMode", 1)
Local $aMousePosAbs = MouseGetPos()
Local $aMousePosRel = GUIGetCursorInfo($hWnd)
Opt("MouseCoordMode", $iOptMouseCoord)
[/autoit] [autoit][/autoit] [autoit]$aReturn[0] = $aMousePosAbs[0] - $aMousePosRel[0]
$aReturn[1] = $aMousePosAbs[1] - $aMousePosRel[1]
Return $aReturn
EndFunc ;==>_WinGetClientPos
Beispiel
#include <GUIConstants.au3>
#include "SliderTip.au3"
$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()
_SliderTip_RegisterToolTip($cSlider1, $hWnd)
_SliderTip_RegisterToolTip($cSlider2, $hWnd, "AutoIt!", False, True)
_SliderTip_RegisterToolTip($cSlider3, $hWnd, "_Time", True)
While 1
Switch GUIGetMsg(0)
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func _Time()
Return @SEC
EndFunc
Update: Alternative Version mit dem ToolTip aus meiner neuen UDF (GDIP.au3 findet ihr im Thread zum ToolTip ;)).