#include-once
#include <FontConstants.au3>
#include <GDIPlus.au3>
#include <StructureConstants.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
;==================================================================================================
; Function Name:   _SplashOn($Item, $fMouse=True, $left=-1, $top=-1, $timeout=-1, _
;                            $txtCol=-1, $bkCol=-1, $trans=1, $size=-1, $font=-1, $weight=400)
; Description::    Show an SplashImage (gif,jpg,bmp) or an SplashText
; Parameter(s):    $Item   - Path picture file or SplashText; Autodetection if file or text
;      optional    $fMouse - True (default) use mousepos for $left and $top
;      optional    $left   - left margin  (default=-1 horizontal centered)
;      optional    $top    - upper margin (default=-1 vertikal centered)
;      optional    $timeout- time how long to show picture/text in ms (default=-1, 3000 ms)
;      optional    $txtCol - SplashText: text color RGB (default=-1, red)
;      optional    $bkCol  - SplashText: back color RGB (default=-1, black)
;      optional    $trans  - SplashText: background transparency yes/now (default=1, yes)
;      optional    $size   - SplashText: font size (default=-1, 30) ; 14 conforms approximately 12 at TimesNewRoman
;      optional    $font   - SplashText: font name (default=-1, Arial)
;      optional    $weight - normal (400) = -1 (Standard), bold (600)
; Return:          Success - 1
;                  Failure - 0  set @error: 1= given file doesn't exist; 2= no size given for textarea
; Author(s):       BugFix (bugfix@autoit.de)
;==================================================================================================
Func _SplashOn($Item, $fMouse=True, $left=-1, $top=-1, $timeout=-1, _
	           $txtCol=-1, $bkCol=-1, $trans=1, $size=-1, $font=-1, $weight=400)
	Local $width, $height
	If $fMouse Then
		Local $MPos = MouseGetPos()
		$left = $MPos[0]
		$top  = $MPos[1]
	EndIf
	If $timeout < 0 Then $timeout = 3000
	If $txtCol < 0 Then $txtCol = 0xFF0000
	If $bkCol < 0 Then $bkCol = 0x000000
	If $trans < 0 Then $trans = 0
	If $size < 0 Then $size = 30
	If $font = -1 Then $font = 'Arial'
	If StringRegExp(StringLeft($Item, 3), '[a-zA-Z]:\\') Then ; picture
		If Not FileExists($Item) Then Return SetError(1,0,0)
			Local $objShell = ObjCreate("Shell.Application")
			Local $objFSO = ObjCreate("Scripting.FileSystemObject")
			Local $objFile = $objFSO.GetFile($Item)
			Local $FileName = $objFSO.GetFileName($objFile)
			Local $objFolder = $objShell.Namespace($objFSO.GetParentFolderName($objFile))
			For $strFileName In $objFolder.Items
				If $objFolder.GetDetailsOf($strFileName, 0) <> $FileName Then ContinueLoop
				$width = StringRegExpReplace($objFolder.GetDetailsOf($strFileName, 27), '(\d+).*', '$1')
				$height = StringRegExpReplace($objFolder.GetDetailsOf($strFileName, 28), '(\d+).*', '$1')
			Next
		Local $gui = GUICreate("", $width, $height, $left, $top, $WS_POPUP, $WS_EX_TOPMOST)
		Local $ctrl = GUICtrlCreatePic($Item, 0, 0, $width, $height)
		GUISetState(@SW_SHOW)
		Local $pos = WinGetPos($gui), $combined_rgn = _WinAPI_CreateRectRgn(0, 0, 0, 0)
		Local $ctrl_pos = ControlGetPos($gui, "", $ctrl)
		Local $ctrl_rgn = _WinAPI_CreateRectRgn($ctrl_pos[0], $ctrl_pos[1], $ctrl_pos[0] + $ctrl_pos[2], $ctrl_pos[1] + $ctrl_pos[3])
		_WinAPI_CombineRgn($combined_rgn, $combined_rgn, $ctrl_rgn, $RGN_OR)
		_WinAPI_DeleteObject($ctrl_rgn)
		_WinAPI_SetWindowRgn($gui, $combined_rgn)
		Sleep($timeout)
		GUIDelete($gui)
	Else ; text
		Local $gui = GUICreate('')
		_GDIPlus_Startup()
		Local $hFormat = _GDIPlus_StringFormatCreate(0)
		Local $hFamily = _GDIPlus_FontFamilyCreate($font)
		Local $style = 0
		If $weight > 400 Then $style = 1
		Local $hFont = _GDIPlus_FontCreate($hFamily, $size, $style, 3)
		Local $tLayout = _GDIPlus_RectFCreate(15, 171, 0, 0)
		Local $hGraphic = _GDIPlus_GraphicsCreateFromHWND($gui)
		Local $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $Item, $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($gui)
		$width = $iWidth
		$height = $iHeight
		If $left = -1 Then $left = Int((@DesktopWidth/2) - ($width/2))
		If $top = -1 Then $top = Int((@DesktopHeight/2) - ($height/2))
		Local $tRECT, $hFont, $hOldFont, $hDC
		If  $left + $width > @DesktopWidth Then $left -= $width
		If  $top + $height > @DesktopHeight Then $top -= $height
		$tRECT = DllStructCreate($tagRect)
		DllStructSetData($tRECT, "Left", $left)
		DllStructSetData($tRECT, "Top", $top)
		DllStructSetData($tRECT, "Right", $left + $width)
		DllStructSetData($tRECT, "Bottom", $top + $height)
		$hDC = _WinAPI_GetDC(0)
		$hFont = _WinAPI_CreateFont($size, 0, 0, 0, $weight, False, False, False, $DEFAULT_CHARSET, _
				$OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, $font)
		$hOldFont = _WinAPI_SelectObject($hDC, $hFont)
		Local $sH = Hex($txtCol,6)
		$txtCol = '0x' & StringRight($sH, 2) & StringMid($sH,3,2) & StringLeft($sH, 2)
		$sH = Hex($BkCol,6)
		$bkCol = '0x' & StringRight($sH, 2) & StringMid($sH,3,2) & StringLeft($sH, 2)
		_WinAPI_SetTextColor($hDC, $txtCol)
		_WinAPI_SetBkColor($hDC, $bkCol)
		If $trans Then _WinAPI_SetBkMode($hDC, $TRANSPARENT)
		Local $timer = TimerInit()
		Do
			_WinAPI_DrawText($hDC, $Item, $tRECT, $DT_CENTER)
			Sleep(20)
		Until TimerDiff($timer) > $timeout
		_WinAPI_SelectObject($hDC, $hOldFont)
		_WinAPI_DeleteObject($hFont)
		_WinAPI_ReleaseDC(0, $hDC)
		_WinAPI_InvalidateRect(0, 0)
		$tRECT = 0
	EndIf
	Return 1
EndFunc  ;==>_SplashOn
