#include <Array.au3>
#include <GDIPlus.au3>
#include-once
Dim $aTransIn[1][4] = [["Ctrl_Input","Ctrl_Lable","Text","FontSize"]]
Dim $aMarker[6]
$DUMMY = GUICreate("DUMMY")
AdlibRegister("_TransInput_Update",50)
AdlibRegister("_TransInput_SelectText",250)
$dll = DllOpen("user32.dll")

Func _TransInput_Create(ByRef $ctrlID,$ifSize=8.5)
	;SEuBo
	$hParent_Wnd = DllCall($dll,"hwnd","GetParent","hwnd", GUICtrlGetHandle($ctrlID))
	$hParent_Wnd = $hParent_Wnd[0]
	$cOldText = ControlGetText($hParent_Wnd,"",$ctrlID)
	$cPos = ControlGetPos($hParent_Wnd,"",$ctrlID)
	If Not @error Then
		$oldGUI = GUISwitch($DUMMY)
		GUISwitch($oldGUI)
		$nCtrlID = GUICtrlCreateLabel($cOldText,$cPos[0]+6,$cPos[1]+5,$cPos[2],$cPos[3])
		GUICtrlSetBkColor(-1,-2)
		GUICtrlSetFont(-1,$ifSize)
		$hwnd_gui = GUICreate("",$cPos[2],$cPos[3],$cPos[0],$cPos[1],0x80000000,BitOR(0x00000040,0x00000008),$hParent_Wnd)
		GUICtrlDelete($ctrlID)
		$ctrlID = GUICtrlCreateInput($cOldText,0,0,$cPos[2],$cPos[3])
		GUICtrlSetState(-1,2048)
		GUICtrlSetFont(-1,$ifSize)
		WinSetTrans($hwnd_gui,"",1)
		GUISetState(@SW_SHOW,$hwnd_gui)
		ReDim $aTransIn[UBound($aTransIn)+1][4]
		$aTransIn[UBound($aTransIn)-1][0] = $nCtrlID
		$aTransIn[UBound($aTransIn)-1][1] = $ctrlID
		$aTransIn[UBound($aTransIn)-1][2] = $cOldText
		$aTransIn[UBound($aTransIn)-1][3] = $ifSize
		GUISwitch($oldGUI)
		Return $nCtrlID
	EndIf
EndFunc
Func _TransInput_Update()
	For $i = 1 to UBound($aTransIn)-1
		If $aTransIn[$i][2] <> GUICtrlRead($aTransIn[$i][1]) Then
			$aTransIn[$i][2] = GUICtrlRead($aTransIn[$i][1])
			GUICtrlSetData($aTransIn[$i][0],$aTransIn[$i][2])
		EndIf
	Next
EndFunc
Func _TransInput_SelectText()
	For $i = 1 to UBound($aTransIn)-1
		$hControl = GUICtrlGetHandle($aTransIn[$i][1])
		$hParent_Wnd = DllCall($dll,"hwnd","GetParent","hwnd", $hControl)
		$hParent_Wnd = $hParent_Wnd[0]
		If ControlGetHandle("","",ControlGetFocus("")) = $hControl Then
			$sOldClip = ClipGet()
			Send("^c")
			If GUICtrlRead($aTransIn[$i][0]) <> $aMarker[5] Then
				GUICtrlDelete($aMarker[0])
				$aMarker[5] = GUICtrlRead($aTransIn[$i][0])
				Return
			EndIf
			If ClipGet() = $sOldClip Then
				Return
			EndIf
			GUICtrlDelete($aMarker[0])
			$aSize = _GetTextSize(StringLeft(GUICtrlRead($aTransIn[$i][0]),StringInStr(GUICtrlRead($aTransIn[$i][0]),ClipGet())),$aTransIn[$i][3])
			If not @error Then
				$hParentParent = DllCall($dll,"hwnd","GetParent","hwnd", $hParent_Wnd)
				$hParentParent = $hParentParent[0]
				$hold = GUISwitch($hParentParent)
				$aContPos = ControlGetPos($hParentParent,"",$aTransIn[$i][0])
				if not @error Then
					$aMarkedSize = _GetTextSize(ClipGet(),$aTransIn[$i][3])
					$aMarker[0] = GUICtrlCreateLabel(ClipGet(),$aSize[0]+4,$aContPos[1]-2,$aMarkedSize[0]*0.90,$aMarkedSize[1],0x0C)
					GUICtrlSetFont(-1,$aTransIn[$i][3])
					GUICtrlSetState(-1,128)
					GUICtrlSetBkColor(-1,0x1E90FF)
					GUICtrlSetColor(-1,0x1E90FF)
					$aLabelPos = ControlGetPos($hParentParent,"",$aMarker[0])
					$aMarker[1] = $aSize[0]
					$aMarker[2] = $aContPos[1]
					$aMarker[3] = $aLabelPos[2]
					$aMarker[4] = $aLabelPos[3]
					$aMarker[5] = GUICtrlRead($aTransIn[$i][0])
				EndIf
			GUISwitch($hold)
			EndIf
		Else
			GUICtrlDelete($aMarker[0])
		EndIf

	Next
EndFunc
Func _GetTextSizeLbl($nText, $iFontSize = 8.5, $sFont = 'Microsoft Sans Serif', $iFontAttributes = 0)
    Local $hGUI = GUICreate("Text'o'meter")
	$hLable = GUICtrlCreateLabel($nText,0,0)
	GUICtrlSetFont(-1,$iFontSize)
    $aCtrlSize = ControlGetPos($hGUI,"",$hLable)
	GUIDelete($hGUI)
    Local $aSize[2] = [$aCtrlSize[2],$aCtrlSize[3]]
    Return $aSize
EndFunc   ;==>_GetTextSizeLbl
Func _GetTextSize($nText, $iFontSize = 8.5, $sFont = 'Microsoft Sans Serif', $iFontAttributes = 0)
    ;Author: Bugfix
    ;Modified: funkey
    If $nText = '' Then Return
	$hOld = GUISwitch($DUMMY)
    Local $hGUI = GUICreate("Textmeter by Bugfix")
    _GDIPlus_Startup()
    Local $hFormat = _GDIPlus_StringFormatCreate(0)
    Local $hFamily = _GDIPlus_FontFamilyCreate($sFont)
    Local $hFont = _GDIPlus_FontCreate($hFamily, $iFontSize, $iFontAttributes, 3)
    Local $tLayout = _GDIPlus_RectFCreate(15, 171, 0, 0)
    Local $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    Local $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $nText, $hFont, $tLayout, $hFormat)
    Local $iWidth = Ceiling(DllStructGetData($aInfo[0], "Width"))
    Local $iHeight = Ceiling(DllStructGetData($aInfo[0], "Height"))
    _GDIPlus_StringFormatDispose($hFormat)
    _GDIPlus_FontDispose($hFont)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    GUIDelete($hGUI)
    Local $aSize[2] = [$iWidth, $iHeight]
	GUISwitch($hOld)
    Return $aSize
EndFunc   ;==>_GetTextSize


