﻿;-- TIME_STAMP   2021-01-15 21:05:38

#include-once

; #INDEX# =======================================================================================================================
; Title .........: ToolTipEx
; AutoIt Version : 3.3.6+
; Language ......: Deutsch
; Description ...: Funktionen für einen alternativen ToolTip.
; Author ........: name22 (autoit.de)
; ===============================================================================================================================

; #CURRENT# =====================================================================================================================
;_ToolTip_Create
;_ToolTip_BGSetColor
;_ToolTip_TextSetColor
;_ToolTip_BorderSetColor
;_ToolTip_BorderSetWidth
;_ToolTip_FontSetOptions
; ===============================================================================================================================

; #INTERNAL_USE_ONLY# ===========================================================================================================
;__ToolTip_Shutdown
;__ToolTip_ReDraw
; ===============================================================================================================================

#include <GDIPlus.au3>
#include <WinApi.au3>
#include <WindowsConstants.au3>

;~ Opt('MustDeclareVars', 1)

OnAutoItExitRegister("__ToolTip_Shutdown")

Global $hBitmap_Tip, $hBuffer_Tip, $iRadius_Tip = 3, $iWidth_Win, $iHeight_Win

Global $hWnd_Tip = GUICreate("", 100, 100, Default, Default, BitOR(0x80000000, 0x08000000), BitOR(0x00080000, 0x00000008, 0x00000080))

_GDIPlus_Startup()

Global $hFormat_Tip = _GDIPlus_StringFormatCreate()
Global $hFamily_Tip = _GDIPlus_FontFamilyCreate("Arial")
Global $hFont_Tip = _GDIPlus_FontCreate($hFamily_Tip, 10)

Global $hGraphic_Tip = _GDIPlus_GraphicsCreateFromHWND($hWnd_Tip)

Global $hBrush_BG_Tip = _GDIPlus_BrushCreateSolid(0xD0202020)
Global $hBrush_Text_Tip = _GDIPlus_BrushCreateSolid(0xE0E0E0E0)
Global $hBrush_Hatch_Tip = _GDIPlus_HatchBrushCreate($GDIP_HATCHSTYLE_CROSS, 0xD0D0D0D0, 0xD0F0F0F0)
Global $hPen_Border_Tip = _GDIPlus_PenCreate(0xE0E57913, 2)

Global $hDC = _WinAPI_GetDC($hWnd_Tip)
Global $hCDC = _WinAPI_CreateCompatibleDC($hDC)

Global $tSize = DllStructCreate($tagSIZE)
Global $pSize = DllStructGetPtr($tSize)
DllStructSetData($tSize, "X", 100)
DllStructSetData($tSize, "Y", 100)
Global $tSource = DllStructCreate($tagPOINT)
Global $pSource = DllStructGetPtr($tSource)
Global $tBlend = DllStructCreate($tagBLENDFUNCTION)
Global $pBlend = DllStructGetPtr($tBlend)
DllStructSetData($tBlend, "Alpha", 255)
DllStructSetData($tBlend, "Format", 1)
Global $tPoint = DllStructCreate($tagPOINT)
Global $pPoint = DllStructGetPtr($tPoint)
DllStructSetData($tPoint, "X", 0)
DllStructSetData($tPoint, "Y", 0)

; #FUNCTION# ====================================================================================================================
; Name...........: _ToolTip_Create
; Description ...: Zeigt einen ToolTip an der gewünschten Position an.
; Syntax.........: _ToolTip_Create($sText_Tip, [$iX = False, [$iY = False, [$iStyle_Tip = 0]]])
; Parameters ....: $sText_Tip  - Text des ToolTips.
;                  $iX         - [optional] X-Koordinate des ToolTips.
;                  $iY         - [optional] Y-Koordinate des ToolTips.
;                  $iStyle_Tip - [optional] Stil des ToolTips. 0 = Abgerundetes Rechteck mit Pfeil nach unten.
;                                                              1 = Abgerundetes Rechteck mit Pfeil nach oben.
;                                                              2 = Rechteck mit kariertem Hintergrund.
; Return values .: -
; Author ........: name22 (autoit.de)
; Remarks .......: Ein Leerstring als Text, löscht den zuvor gesetzten ToolTip.
;                  Werden keine Koordinaten angegeben, wird der ToolTip in die Nähe des Mauszeigers gesetzt.
; ===============================================================================================================================
Func _ToolTip_Create($sText_Tip, $iX = False, $iY = False, $iStyle_Tip = 0)
	Switch $sText_Tip
		Case ""
			GUIRegisterMsg($WM_PAINT, "")
			GUISetState(@SW_HIDE, $hWnd_Tip)
		Case Else
			If $iX = False And $iY = False Then
				$iX = MouseGetPos(0)
				$iY = MouseGetPos(1)
			EndIf

			GUIRegisterMsg($WM_PAINT, "")
			Local $tLayout_Tip = _GDIPlus_GraphicsMeasureString($hGraphic_Tip, $sText_Tip, $hFont_Tip, _GDIPlus_RectFCreate(), $hFormat_Tip), _
				$iWidth_Tip, $iHeight_Tip, $iX_Tip, $iY_Tip

			Switch $iStyle_Tip
				Case 0
					$iWidth_Tip = DllStructGetData($tLayout_Tip[0], "width") + 6
					$iHeight_Tip = DllStructGetData($tLayout_Tip[0], "height") + 6
					$iX_Tip = 1
					$iY_Tip = 1
					DllStructSetData($tLayout_Tip[0], "x", $iX_Tip + 3)
					DllStructSetData($tLayout_Tip[0], "y", $iY_Tip + 3)

					_GDIPlus_BitmapDispose($hBitmap_Tip)
					_GDIPlus_GraphicsDispose($hBuffer_Tip)
					$hBitmap_Tip = _GDIPlus_BitmapCreateFromGraphics($iWidth_Tip + $iX_Tip + 2, $iHeight_Tip + $iY_Tip + 13, $hGraphic_Tip)
					$hBuffer_Tip = _GDIPlus_ImageGetGraphicsContext($hBitmap_Tip)
					_GDIPlus_GraphicsSetSmoothingMode($hBuffer_Tip, 2)

					DllStructSetData($tSize, "X", $iWidth_Tip + $iX_Tip + 2)
					DllStructSetData($tSize, "Y", $iHeight_Tip + $iY_Tip + 13)
					DllStructSetData($tPoint, "X", $iX - DllStructGetData($tSize, "X") / 2)
					DllStructSetData($tPoint, "Y", $iY - DllStructGetData($tSize, "Y"))

					Local $hPath_Tip = _GDIPlus_PathCreate()
					_GDIPlus_PathAddArc($hPath_Tip, $iX_Tip, $iY_Tip, $iRadius_Tip * 2, $iRadius_Tip * 2, -180, 90)
					_GDIPlus_PathAddLine($hPath_Tip, $iX_Tip + $iRadius_Tip, $iY_Tip, $iX_Tip + $iWidth_Tip - $iRadius_Tip, $iY_Tip)
					_GDIPlus_PathAddArc($hPath_Tip, $iX_Tip + $iWidth_Tip - $iRadius_Tip * 2, $iY_Tip, $iRadius_Tip * 2, $iRadius_Tip * 2, -90, 90)
					_GDIPlus_PathAddLine($hPath_Tip, $iX_Tip + $iWidth_Tip, $iY_Tip + $iRadius_Tip, $iX_Tip + $iWidth_Tip, $iY_Tip + $iHeight_Tip - $iRadius_Tip)
					_GDIPlus_PathAddArc($hPath_Tip, $iX_Tip + $iWidth_Tip - $iRadius_Tip * 2, $iY_Tip + $iHeight_Tip - $iRadius_Tip * 2, $iRadius_Tip * 2, $iRadius_Tip * 2, 0, 90)
					_GDIPlus_PathAddLine($hPath_Tip, $iX_Tip + $iWidth_Tip - $iRadius_Tip, $iY_Tip + $iHeight_Tip, $iX_Tip + $iWidth_Tip / 2 + 5, $iY_Tip + $iHeight_Tip)
					_GDIPlus_PathAddLine($hPath_Tip, $iX_Tip + $iWidth_Tip / 2 + 5, $iY_Tip + $iHeight_Tip, $iX_Tip + $iWidth_Tip / 2, $iY_Tip + $iHeight_Tip + 10)
					_GDIPlus_PathAddLine($hPath_Tip, $iX_Tip + $iWidth_Tip / 2, $iY_Tip + $iHeight_Tip + 10, $iX_Tip + $iWidth_Tip / 2 - 5, $iY_Tip + $iHeight_Tip)
					_GDIPlus_PathAddLine($hPath_Tip, $iX_Tip + $iWidth_Tip / 2 - 5, $iY_Tip + $iHeight_Tip, $iX_Tip + $iRadius_Tip, $iY_Tip + $iHeight_Tip)
					_GDIPlus_PathAddArc($hPath_Tip, $iX_Tip, $iY_Tip + $iHeight_Tip - $iRadius_Tip * 2, $iRadius_Tip * 2, $iRadius_Tip * 2, 90, 90)
					_GDIPlus_PathAddLine($hPath_Tip, $iX_Tip, $iY_Tip + $iHeight_Tip - $iRadius_Tip, $iX_Tip, $iY_Tip + $iRadius_Tip)

					_GDIPlus_GraphicsFillPath($hBuffer_Tip, $hPath_Tip, $hBrush_BG_Tip)
			        _GDIPlus_GraphicsDrawPath($hBuffer_Tip, $hPath_Tip, $hPen_Border_Tip)
					_GDIPlus_PathDispose($hPath_Tip)
				Case 1
					$iWidth_Tip = DllStructGetData($tLayout_Tip[0], "width") + 6
					$iHeight_Tip = DllStructGetData($tLayout_Tip[0], "height") + 6
					$iX_Tip = 1
					$iY_Tip = 12
					DllStructSetData($tLayout_Tip[0], "x", $iX_Tip + 3)
					DllStructSetData($tLayout_Tip[0], "y", $iY_Tip + 3)

					_GDIPlus_BitmapDispose($hBitmap_Tip)
					_GDIPlus_GraphicsDispose($hBuffer_Tip)
					$hBitmap_Tip = _GDIPlus_BitmapCreateFromGraphics($iWidth_Tip + $iX_Tip + 2, $iHeight_Tip + $iY_Tip + 2, $hGraphic_Tip)
					$hBuffer_Tip = _GDIPlus_ImageGetGraphicsContext($hBitmap_Tip)
					_GDIPlus_GraphicsSetSmoothingMode($hBuffer_Tip, 2)

					DllStructSetData($tSize, "X", $iWidth_Tip + $iX_Tip + 2)
					DllStructSetData($tSize, "Y", $iHeight_Tip + $iY_Tip + 2)
					DllStructSetData($tPoint, "X", $iX - DllStructGetData($tSize, "X") / 2)
					DllStructSetData($tPoint, "Y", $iY)

					$hPath_Tip = _GDIPlus_PathCreate()
					_GDIPlus_PathAddArc($hPath_Tip, $iX_Tip, $iY_Tip, $iRadius_Tip * 2, $iRadius_Tip * 2, -180, 90)
					_GDIPlus_PathAddLine($hPath_Tip, $iX_Tip + $iRadius_Tip, $iY_Tip, $iX_Tip + $iWidth_Tip / 2 - 5, $iY_Tip)
					_GDIPlus_PathAddLine($hPath_Tip, $iX_Tip + $iWidth_Tip / 2 - 5, $iY_Tip, $iX_Tip + $iWidth_Tip / 2, $iY_Tip - 10)
					_GDIPlus_PathAddLine($hPath_Tip, $iX_Tip + $iWidth_Tip / 2, $iY_Tip - 10, $iX_Tip + $iWidth_Tip / 2 + 5, $iY_Tip)
					_GDIPlus_PathAddLine($hPath_Tip, $iX_Tip + $iWidth_Tip / 2 + 5, $iY_Tip, $iX_Tip + $iWidth_Tip - $iRadius_Tip, $iY_Tip)
					_GDIPlus_PathAddArc($hPath_Tip, $iX_Tip + $iWidth_Tip - $iRadius_Tip * 2, $iY_Tip, $iRadius_Tip * 2, $iRadius_Tip * 2, -90, 90)
					_GDIPlus_PathAddLine($hPath_Tip, $iX_Tip + $iWidth_Tip, $iY_Tip + $iRadius_Tip, $iX_Tip + $iWidth_Tip, $iY_Tip + $iHeight_Tip - $iRadius_Tip)
					_GDIPlus_PathAddArc($hPath_Tip, $iX_Tip + $iWidth_Tip - $iRadius_Tip * 2, $iY_Tip + $iHeight_Tip - $iRadius_Tip * 2, $iRadius_Tip * 2, $iRadius_Tip * 2, 0, 90)
					_GDIPlus_PathAddLine($hPath_Tip, $iX_Tip + $iWidth_Tip - $iRadius_Tip, $iY_Tip + $iHeight_Tip, $iX_Tip + $iRadius_Tip, $iY_Tip + $iHeight_Tip)
					_GDIPlus_PathAddArc($hPath_Tip, $iX_Tip, $iY_Tip + $iHeight_Tip - $iRadius_Tip * 2, $iRadius_Tip * 2, $iRadius_Tip * 2, 90, 90)
					_GDIPlus_PathAddLine($hPath_Tip, $iX_Tip, $iY_Tip + $iHeight_Tip - $iRadius_Tip, $iX_Tip, $iY_Tip + $iRadius_Tip)

					_GDIPlus_GraphicsFillPath($hBuffer_Tip, $hPath_Tip, $hBrush_BG_Tip)
			        _GDIPlus_GraphicsDrawPath($hBuffer_Tip, $hPath_Tip, $hPen_Border_Tip)
					_GDIPlus_PathDispose($hPath_Tip)
				Case 2
					$iWidth_Tip = DllStructGetData($tLayout_Tip[0], "width") + 6
					$iHeight_Tip = DllStructGetData($tLayout_Tip[0], "height") + 6
					DllStructSetData($tLayout_Tip[0], "x", 3)
					DllStructSetData($tLayout_Tip[0], "y", 3)

					_GDIPlus_BitmapDispose($hBitmap_Tip)
					_GDIPlus_GraphicsDispose($hBuffer_Tip)
					$hBitmap_Tip = _GDIPlus_BitmapCreateFromGraphics($iWidth_Tip, $iHeight_Tip, $hGraphic_Tip)
					$hBuffer_Tip = _GDIPlus_ImageGetGraphicsContext($hBitmap_Tip)
					_GDIPlus_GraphicsSetSmoothingMode($hBuffer_Tip, 2)

					DllStructSetData($tSize, "X", $iWidth_Tip)
					DllStructSetData($tSize, "Y", $iHeight_Tip)
					DllStructSetData($tPoint, "X", $iX)
					DllStructSetData($tPoint, "Y", $iY)

					_GDIPlus_GraphicsFillRect($hBuffer_Tip, 0, 0, $iWidth_Tip, $iHeight_Tip, $hBrush_Hatch_Tip)
			EndSwitch

			_GDIPlus_GraphicsDrawStringEx($hBuffer_Tip, $sText_Tip, $hFont_Tip, $tLayout_Tip[0], $hFormat_Tip, $hBrush_Text_Tip)
			__ToolTip_ReDraw()

			If BitAND(WinGetState($hWnd_Tip), 2) <> 2 Then GUISetState(@SW_SHOWNOACTIVATE, $hWnd_Tip)

			GUIRegisterMsg($WM_PAINT, "__ToolTip_ReDraw")
	EndSwitch

EndFunc   ;==>_ToolTip_Create

; #FUNCTION# ====================================================================================================================
; Name...........: __ToolTip_ReDraw
; Description ...: Zeichnet den ToolTip neu.
; Syntax.........: __ToolTip_ReDraw()
; Return values .: -
; Author ........: name22 (autoit.de)
; Remarks .......: Intern genutzte Funktion.
; ===============================================================================================================================
Func __ToolTip_ReDraw()
	Local $hBitmapTmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap_Tip)
	_WinAPI_SelectObject($hCDC, $hBitmapTmp)
	_WinAPI_UpdateLayeredWindow($hWnd_Tip, $hDC, $pPoint, $pSize, $hCDC, $pSource, 0, $pBlend, 2)
	_WinAPI_DeleteObject($hBitmapTmp)
EndFunc   ;==>_ToolTip_ReDraw

; #FUNCTION# ====================================================================================================================
; Name...........: _ToolTip_BGSetColor
; Description ...: Ändert die Hintergundfarbe des ToolTips auf den gewünschten ARGB Farbwert ab.
; Syntax.........: _ToolTip_BGSetColor([$NewColor])
; Parameters ....: $NewColor - [optional] Neuer Farbwert im Format 0xAARRGGBB. Transparenz wird unterstützt.
; Return values .: -
; Author ........: name22 (autoit.de)
; Remarks .......: Gilt nur für ToolTip Style 0/1.
; ===============================================================================================================================
Func _ToolTip_BGSetColor($NewColor = 0xD0202020)
	_GDIPlus_BrushSetSolidColor($hBrush_BG_Tip, $NewColor)
EndFunc   ;==>_ToolTip_BGSetColor

; #FUNCTION# ====================================================================================================================
; Name...........: _ToolTip_TextSetColor
; Description ...: Ändert die Textfarbe des ToolTips auf den gewünschten ARGB Farbwert ab.
; Syntax.........: _ToolTip_TextSetColor([$NewColor])
; Parameters ....: $NewColor - [optional] Neuer Farbwert im Format 0xAARRGGBB. Transparenz wird unterstützt.
; Return values .: -
; Author ........: name22 (autoit.de)
; Remarks .......: -
; ===============================================================================================================================
Func _ToolTip_TextSetColor($NewColor = 0xE0E0E0E0)
	_GDIPlus_BrushSetSolidColor($hBrush_Text_Tip, $NewColor)
EndFunc   ;==>_ToolTip_TextSetColor

; #FUNCTION# ====================================================================================================================
; Name...........: _ToolTip_BorderSetColor
; Description ...: Ändert die Randlinienfarbe des ToolTips auf den gewünschten ARGB Farbwert ab.
; Syntax.........: _ToolTip_BorderSetColor([$NewColor])
; Parameters ....: $NewColor - [optional] Neuer Farbwert im Format 0xAARRGGBB. Transparenz wird unterstützt.
; Return values .: -
; Author ........: name22 (autoit.de)
; Remarks .......: Gilt nur für ToolTip Style 0/1.
; ===============================================================================================================================
Func _ToolTip_BorderSetColor($NewColor = 0xE0E57913)
	_GDIPlus_PenSetColor($hPen_Border_Tip, $NewColor)
EndFunc   ;==>_ToolTip_BorderSetColor

; #FUNCTION# ====================================================================================================================
; Name...........: _ToolTip_BorderSetWidth
; Description ...: Ändert die Randliniendicke des ToolTips auf den gewünschten Dezimalwert ab.
; Syntax.........: _ToolTip_BorderSetWidth([$fWidth])
; Parameters ....: $fWidth - [optional] Neuer Wert.
; Return values .: -
; Author ........: name22 (autoit.de)
; Remarks .......: Ein zu großer Wert kann Fehldarstellungen verursachen.
;                  Gilt nur für ToolTip Style 0/1.
; ===============================================================================================================================
Func _ToolTip_BorderSetWidth($fWidth = 2)
	_GDIPlus_PenSetWidth($hPen_Border_Tip, $fWidth)
EndFunc   ;==>_ToolTip_BorderSetWidth

; #FUNCTION# ====================================================================================================================
; Name...........: _ToolTip_FontSetOptions
; Description ...: Ändert die Einstellungen für den Text des ToolTips.
; Syntax.........: _ToolTip_FontSetOptions($sFont = "Arial", $fSize = 10, $iStyle = 0)
; Parameters ....: $sFont  - [optional] Schriftart des ToolTips.
;                  $fSize  - [optional] Schriftgröße des ToolTips.
;                  $iStyle - [optional] Schriftstil des ToolTips. 0 = "Normal"; 1 = "Fett"; 2 = "Kursiv"; 4 = "Unterstrichen";
;                            8 = "Durchgestrichen". Werte können kombiniert werden.
; Return values .: -
; Author ........: name22 (autoit.de)
; Remarks .......: -
; ===============================================================================================================================
Func _ToolTip_FontSetOptions($sFont = "Arial", $fSize = 10, $iStyle = 0)
	_GDIPlus_FontFamilyDispose($hFamily_Tip)
	_GDIPlus_FontDispose($hFont_Tip)
	$hFamily_Tip = _GDIPlus_FontFamilyCreate($sFont)
	$hFont_Tip = _GDIPlus_FontCreate($hFamily_Tip, $fSize, $iStyle)
EndFunc   ;==>_ToolTip_FontSetOptions

; #FUNCTION# ====================================================================================================================
; Name...........: _ToolTip_HatchSetColors
; Description ...: Ändert die Einstellungen für den Text des ToolTips.
; Syntax.........: _ToolTip_HatchSetColors($ARGB_Lines = 0xD0D0D0D0, $ARGB_BG = 0xD0F0F0F0)
; Parameters ....: $ARGB_Lines - [optional] Linienfarbe des karierten ToolTipMusters.
;                  $ARGB_BG    - [optional] Hintergrundfarbe des karierten ToolTipMusters.
; Return values .: -
; Author ........: name22 (autoit.de)
; Remarks .......: Gilt nur für den ToolTip Style 2
; ===============================================================================================================================
Func _ToolTip_HatchSetColors($ARGB_Lines = 0xD0D0D0D0, $ARGB_BG = 0xD0F0F0F0)
	_GDIPlus_BrushDispose($hBrush_Hatch_Tip)
	$hBrush_Hatch_Tip = _GDIPlus_HatchBrushCreate($GDIP_HATCHSTYLE_CROSS, $ARGB_Lines, $ARGB_BG)
EndFunc   ;==>_ToolTip_FontSetOptions

; #FUNCTION# ====================================================================================================================
; Name...........: __ToolTip_Shutdown
; Description ...: Entfernt die von der UDF verwendeten Ressourcen aus dem Arbeitsspeicher.
; Syntax.........: __ToolTip_Shutdown()
; Return values .: -
; Author ........: name22 (autoit.de)
; Remarks .......: Intern genutzte Funktion.
; ===============================================================================================================================
Func __ToolTip_Shutdown()
	GUIRegisterMsg($WM_PAINT, "")
	_GDIPlus_GraphicsDispose($hGraphic_Tip)
	_GDIPlus_BitmapDispose($hBitmap_Tip)
	_GDIPlus_GraphicsDispose($hBuffer_Tip)
	_GDIPlus_StringFormatDispose($hFormat_Tip)
	_GDIPlus_FontDispose($hFont_Tip)
	_GDIPlus_FontFamilyDispose($hFamily_Tip)
	_GDIPlus_BrushDispose($hBrush_BG_Tip)
	_GDIPlus_BrushDispose($hBrush_Text_Tip)
	_GDIPlus_BrushDispose($hBrush_Hatch_Tip)
	_GDIPlus_PenDispose($hPen_Border_Tip)
	_GDIPlus_Shutdown()
EndFunc   ;==>_ToolTip_Shutdown
