#include-once
#include <GUISlider.au3>
#include <WinApi.au3>
#include <Array.au3>

;SliderTip.au3 UDF by name22 (autoit.de)

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

	$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