﻿; Die von mir veränderten PNGs (unten als Binärdaten) stammen von "Icojam" (http://www.icojam.com)
; Die PNGs sind als "Public Domain" freigegeben

#include-once
#include <GDIPlus.au3>
#include <StaticConstants.au3>
#include <WinAPI.au3>
#include <WinAPIGdi.au3>
#include <WinAPIConstants.au3>

OnAutoItExitRegister('_GUICtrlProgress_Dispose')

_GDIPlus_Startup()

Global $__g_hGUICtrlProgressPNG = _GDIPlus_BitmapCreateFromMemory(_GUICtrlProgress())

Func _GUICtrlProgress_Dispose()
	_GDIPlus_BitmapDispose($__g_hGUICtrlProgressPNG)
	_GDIPlus_Shutdown()
EndFunc   ;==>_GUICtrlTrafficLight_Dispose

Func _GUICtrlProgress_Create($iLeft, $iTop, $iPercent, $iRGB = 0x00FF00)
	Local $idProgress = GUICtrlCreatePic('', $iLeft, $iTop, 201, 64)
	_GUICtrlProgress_SetData($idProgress, $iPercent, $iRGB)
	Return $idProgress
EndFunc   ;==>_GUICtrlTrafficLight_Create

Func _GUICtrlProgress_SetData($idProgress, $iPercent, $iRGB = 0x00FF00)
	If $iPercent < 0 Then $iPercent = 0
	If $iPercent > 100 Then $iPercent = 100
	Local $hBitmap = _GDIPlus_BitmapCreateFromScan0(201, 64) ; Eine Bitmap erstellen
	Local $hGfxCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap) ; Graphic-Context der Bitmap holen
	_GDIPlus_GraphicsSetTextRenderingHint($hGfxCtxt, 4)
	_GDIPlus_GraphicsDrawImageRect($hGfxCtxt, $__g_hGUICtrlProgressPNG, 0, 0, 201, 38)
	Local $hIA = _GDIPlus_ImageAttributesCreate()
	Local $iR = _WinAPI_GetRValue($iRGB) / 255, $iG = _WinAPI_GetGValue($iRGB) / 255, $iB = _WinAPI_GetBValue($iRGB) / 255
	Local $tColorMatrix = _GDIPlus_ColorMatrixCreateScale($iR, $iG, $iB)
	Local $iProgressBar = 1 + Int($iPercent / 5) * 10
	_GDIPlus_ImageAttributesSetColorMatrix($hIA, 0, True, $tColorMatrix)
	_GDIPlus_GraphicsDrawImageRectRect($hGfxCtxt, $__g_hGUICtrlProgressPNG, 0, 0, $iProgressBar, 38, 0, 0, $iProgressBar, 38, $hIA)
	Local $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000) ; Farbe (ARGB) der Prozentzahl
	Local $hFormat = _GDIPlus_StringFormatCreate()
	Local $hFamily = _GDIPlus_FontFamilyCreate('Verdana') ; Schriftart
	Local $hFont = _GDIPlus_FontCreate($hFamily, 14) ; Schriftgröße
	Local $tLayout = _GDIPlus_RectFCreate(110 - (StringLen($iPercent) + 1) * 10, 40, 100, 24) ; Left, Top, Width, Height
;~ 	_GDIPlus_GraphicsDrawStringEx($hGfxCtxt, $iPercent & '%', $hFont, $tLayout, $hFormat, $hBrush) ; Prozentzahl anzeigen
	_WinAPI_DeleteObject(GUICtrlSendMsg($idProgress, $STM_SETIMAGE, $IMAGE_BITMAP, -1)) ; den alten Inhalt des Pic-Control löschen
	Local $hBMP = _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap) ; HBitmap von der Bitmap erstellen
	_WinAPI_DeleteObject(GUICtrlSendMsg($idProgress, $STM_SETIMAGE, $IMAGE_BITMAP, $hBMP)) ; und an das Pic-Control senden
	; und noch aufräumen
	$tLayout = 0
	_GDIPlus_FontDispose($hFont)
	_GDIPlus_FontFamilyDispose($hFamily)
	_GDIPlus_StringFormatDispose($hFormat)
	_GDIPlus_BrushDispose($hBrush)
	_GDIPlus_ImageAttributesDispose($hIA)
	_WinAPI_DeleteObject($hBMP)
	_GDIPlus_GraphicsDispose($hGfxCtxt)
	_GDIPlus_BitmapDispose($hBitmap)
EndFunc   ;==>_GUICtrlTrafficLight_SetData

; Code below was generated by: 'File to Base64 String' Code Generator v1.20 Build 2015-01-20
; Danke an UEZ (www.autoit.de)

Func _GUICtrlProgress($bSaveBinary = False, $sSavePath = @ScriptDir)
	Local $GUICtrlProgress
	$GUICtrlProgress &= 'iVBORw0KGgoAAAANSUhEUgAAAMkAAAAmCAYAAABu1L9SAAADP0lEQVR42u3dv0tbURQH8GOqWwaXDhLIpIu4ibVD/4luBceC4tihk6uzHUU0EhE0KFpRFEGQECpoya6IEBISE4yiaFT8kbye+wqnQsPJc/Ly7vfAwSAfhJvLF43vvXvaiGtqairOX0a5v3K/p39V5U5yT46MjORC5D7y6x/cH7gjL1yDO8v9nV3mFc729drurN6PNoaxSCRS7O7upmg0Su3t7SKfn5+pWq1SsVgkz/M+sfsVAveZ3c8AbpTdZAD3hV3K4vXa7mzfjx4TkvH+/v6xeDxOV1dX9PDwQI1Gg15WuVymfD5/wG4wBK7ELhbA1dhFA7gyuy6L12u7s30/JkxIikNDQ7FKpUJ3d3fUrJ6eniibzdbZvQuBI3b0Bs729wX70dxVTEi84eFhOjw8/C9JL2tvb4/g4Fx0EpKjoyPSKpPJEByci05Ccnx8rOJ0Ok1wcC46CcnJyYmKd3d3CQ7ORSchyeVyKt7Z2SE4OBedhKRQKKh4e3ub4OBcdBKSUqmk4s3NTYKDc9FJSMyFE602NjYIDs5FJyE5OztT8draGsHBuegkJBcXFypeWVkhODgXnYTk8vJSxcvLywQH56KTkFxfX6s4lUoRHJyLTkJSq9VUvLCwQHBwLjoJyf39vYrn5+cJDs5FJyEx99NrNTc3R3BwLjoJyePjo4qTySTBwbnoJCTmkUWtZmdnCQ7ORSchqdfrKk4kEgQH56KTkGhPZ5mamZkhODgXnYTE8zwVT09PExyciw4hgYNr4fDnFhxcC4cP7nBwLRyuk8DBtXC4LQUOroWTkNzc3Kh4cXGR4OBcdBIScx6qVktLSwQH56KTkJyfn6t4dXWV4OBcdBISc3CwVuvr6wQH56KTkJyenqr/M97a2iI4OBedjF4wn/Jvb2+bQnPPfTqd9o+qD4Hzj+Z/A2f7+4L9aO780QvjAwMDY729vf5D8c2GmeTzeXOw8AG7wRC4ErtYAFdjFw3gyuy6LF6v7c72/ZiQcXB9fX3U2dlJHR0dgsyFFvPryJyXyj/AH58VAuePHwvg/PFjAZw/fszi9drubN+PnjbzzRYDFhP0d8BiIUROG1D5m/sbu/1XONvXa7uzej/+ABoThw9POzmGAAAAAElFTkSuQmCC'
	Local Const $bString = Binary(_WinAPI_Base64Decode($GUICtrlProgress))
	If $bSaveBinary Then
		Local Const $hFile = FileOpen($sSavePath & "\progress.png", 18)
		If @error Then Return SetError(1, 0, 0)
		FileWrite($hFile, $bString)
		FileClose($hFile)
	EndIf
	Return $bString
EndFunc   ;==>_GUICtrlProgress

Func _WinAPI_Base64Decode($sB64String)
	Local $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "ptr", 0, "dword*", 0, "ptr", 0, "ptr", 0)
	If @error Or Not $aCrypt[0] Then Return SetError(1, 0, "")
	Local $bBuffer = DllStructCreate("byte[" & $aCrypt[5] & "]")
	$aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "struct*", $bBuffer, "dword*", $aCrypt[5], "ptr", 0, "ptr", 0)
	If @error Or Not $aCrypt[0] Then Return SetError(2, 0, "")
	Return DllStructGetData($bBuffer, 1)
EndFunc   ;==>_WinAPI_Base64Decode