;-- TIME_STAMP   2017-10-26 14:22:56   v 1.0
#include-once
#include <AutoItConstants.au3>
#include <FontConstants.au3>
#include <GDIPlus.au3>
#include <StructureConstants.au3>
#include <Timers.au3>
#include <WinAPI.au3>
#include <WinAPIGdi.au3>
#include <WindowsConstants.au3>


; #ABOUT-THIS# ==================================================================================================================
; With GuiCtrlBusy.au3 you can create ToolTip like controls, with a lot of features.
; • Multiple controls can be used at the same time, e.g. for debugging in nested loops.
; • Controls has a minimum size of 250*120 (w*h)
; • You can drag the controls with the mouse.
; • 3 kinds of view, Title line with: Title only / Title and Clocktime / Title and Countdown (default)
; • All views can be used with countdown. The remaining time can be shown in text with "%C%"
; • You can switch from a Title-only/ Title&Clocktime control to an Countdown control and vice versa.
; • The title font, size and style is fix. The title and the separating line has the same color.
; • You can set an icon left from title. (from *.dll or *.ico file)
; • The text can be output to the left, right, or center (default).
; • The text color can be set different to the title color.
; • For Text you can change font, size and style.
; • For background coloring is used a gradient. You can change the direction from top-to-bottom (default) to left-to-right.
; • There are existing predefined color schemes, that can be used.
; • You can temporary add your own color schemes.
; • All parameter can be changed during lifetime of the Control.
; • All controls have a safety timeout. It's defined in $GCB_U_TIMEOUT_ZERO (default = 2 hours). If you set an higher value for countdown,
;   the $GCB_U_TIMEOUT_ZERO will increase.
; • All default parameters can be changed with _GuiCtrlBusy_UserDefaults().
; • You can get a Dummy-ID with _GuiCtrlBusy_GetClosed(). This dummy will fired, if an control has closed (by countdown or with _GuiCtrlBusy_Close() ).
;   With GuiCtrlRead(dummy) you get the handle of the closed control.
; • The callback interval can be changed for each control (default is 500 ms). But handle with care.
;   At high frequency, many controls and recalculation of the control size at every time, your CPU needs to work hard.
;   Additional you can stop the recalculation of control size (normally it will done while text or title is changed). If the changes has none
;   or minimal effect to the text length, it's usefull to stop the calculation. Than you can also use very short callback intervals.

; Mit GuiCtrlBusy.au3 können ToolTip ähnliche Controls erstellt werden, mit einer Vielzahl von Funktionen.
; • Mehrere Ctrl lassen sich gleichzeitig erstellen, z.B. zum Debuggen in verschachtelten Schleifen.
; • Ctrl haben eine minimale Größe von 250*120 (B*H)
; • Die Ctrl lassen sich mit der Maus ziehen.
; • 3 Arten von Ansichten, Titelzeile mit: Titel allein / Titel und Uhrzeit / Titel und Countdown (Standard)
; • Alle Ansichten lassen sich mit Countdown verwenden. Die Restzeit kann im Text angezeigt werden mit "%C%".
; • Zwischen den Ansichtsarten kann hin und her gewechselt werden.
; • Font, Größe und Stil des Titels sind fest. Titel und Trennlinie verwenden dieselbe Farbe.
; • Links vom Titel kann ein Icon gesetzt werden. (aus *.dll oder *.ico Datei)
; • Die Textausgabe erfolgt links, rechts oder zentriert (Standard).
; • Die Textfarbe kann unterschiedlich zur Titelfarbe gesetzt werden.
; • Der Text kann in Font, Größe und Stil verändert werden.
; • Für die Färbung des Hintergrundes wird ein Farbverlauf verwendet. Dessen Richtung kann von oben-nach-unten (Standard) auf links-nach-rechts geändert werden.
; • Es existieren vordefinierte Farbschemata, die genutzt werden können.
; • Temporär lassen sich eigene Farbschemata hinzufügen.
; • Alle Parameter sind zur Lebenszeit des Ctrl änderbar.
; • Alle Ctrl haben ein Sicherheits-Timeout. Es ist vordefiniert in $GCB_U_TIMEOUT_ZERO (Standard = 2 Stunden). Beim Setzen eines höheren Countdown Wertes,
;   wird $GCB_U_TIMEOUT_ZERO automatisch auf diesen Wert erhöht.
; • Alle Standard Parameter lassen sich ändern mit _GuiCtrlBusy_UserDefaults().
; • Die Funktion _GuiCtrlBusy_GetClosed() gibt eine Dummy-ID zurück. Der Dummy wird ausgelöst beim Schliessen eines Ctrl (mit Countdown oder _GuiCtrlBusy_Close() ).
;   Das Handle des geschlossenen Ctrl kann dann mit GuiCtrlRead(dummy) ausgelesen werden.
; • Das Callback Intervall ist für jedes Ctrl einzeln änderbar (Standard ist 500 ms). Bitte mit Vorsicht anwenden.
;   Bei hoher Frequenz, vielen Control und Neuberechnung der Ctrl-Größe bei jedem Aufruf, wird die CPU stark gefordert.
;   Zusätzlich kann aber die Neuberechnung der Ctrl-Größe gestoppt werden (normalerweise passiert das bei jeder Änderung in Titel oder Text). Haben die Änderungen
;   keinen oder minimalen Einfluß auf die Textlänge, ist es sinnvoll die Berechnung zu stoppen. Dann lassen sich auch sehr kurze Callback Intervalle verwenden.
; ===============================================================================================================================

; #CURRENT# =====================================================================================================================
; _GuiCtrlBusy_Create
; _GuiCtrlBusy_Close
; _GuiCtrlBusy_SetTitle
; _GuiCtrlBusy_SetIcon
; _GuiCtrlBusy_SetText
; _GuiCtrlBusy_SetCBInterval
; _GuiCtrlBusy_StopRecalc
; _GuiCtrlBusy_SetColors
; _GuiCtrlBusy_SetGradient
; _GuiCtrlBusy_SetScheme
; _GuiCtrlBusy_GetScheme
; _GuiCtrlBusy_AddScheme
; _GuiCtrlBusy_SetPos
; _GuiCtrlBusy_SetTimeout
; _GuiCtrlBusy_SetOnTop
; _GuiCtrlBusy_UserDefaults
; _GuiCtrlBusy_GetClosed
; ===============================================================================================================================

; #au3.user.calltips.api# =======================================================================================================
; _GuiCtrlBusy_Create([$_sTitle=''[, $_sText=''[, $_iAlign=2[, $_iX=-1[, $_iY=-1[, $_iTimeout=-1[, $_iTimeCounter=-1[, $_BGRtitle=-1[, $_BGRtext=-1[, $_RGBtopleft=-1[, $_RGBbottomright=-1[, $_bRotate=False]]]]]]]]]]]]) Creates an Busy control. (Requires: #include "GuiCtrlBusy.au3")
; _GuiCtrlBusy_Close([$_hWnd=-1]) Close one/all controls. (Requires: #include "GuiCtrlBusy.au3")
; _GuiCtrlBusy_SetTitle($_hWnd, $_sTitle=''[, $_iTimeCounter=''[, $_iTimeout=''[, $_BGRtitle=''[, $_bSetOnTop='']]]]) Sets for title line: title, show:nothing/countdown/time, timeout, color. (Requires: #include "GuiCtrlBusy.au3")
; _GuiCtrlBusy_SetIcon($_hWnd, $_sIconFile=''[, $_iIconID]) Sets icon from shell32.dll or any *.dll/*.ico file. (Requires: #include "GuiCtrlBusy.au3")
; _GuiCtrlBusy_SetText($_hWnd, $_sText=''[, $_BGRtext=''[, $_iSize=''[, $_iStyle=''[, $_sFontname=''[,$_iAlign=''[, $_bSetOnTop='']]]]]]) Sets text /~color /~size /~style /~font. (Requires: #include "GuiCtrlBusy.au3")
; _GuiCtrlBusy_SetCBInterval($_hWnd[, $_iInterval=$GCB_U_CALLBACK_INTERVAL[, $_bNoReCalc=False]]) Sets an individual callback interval, opt. stops recalculation of ctrl size. (Requires: #include "GuiCtrlBusy.au3")
; _GuiCtrlBusy_StopRecalc($_hWnd[, $_bNoReCalc=True]) Stops (or allows) recalculation of control size while text or title is changed. (Requires: #include "GuiCtrlBusy.au3")
; _GuiCtrlBusy_SetColors($_hWnd, $_BGRtitle=''[, $_BGRtext=''[, $_RGBtopleft=''[, $_RGBbottomright='']]]) Sets title/text/gradient colors. (Requires: #include "GuiCtrlBusy.au3")
; _GuiCtrlBusy_SetGradient($_hWnd, $_RGBtopleft=''[, $_RGBbottomright=''[, $_bRotate='']]) Sets gradient colors and direction. (Requires: #include "GuiCtrlBusy.au3")
; _GuiCtrlBusy_SetScheme($_hWnd[, $_sScheme=''[, $_bRotate=''[, $_bSetOnTop='']]]) Sets color-scheme/gradient-direction/optional ontop. (Requires: #include "GuiCtrlBusy.au3")
; _GuiCtrlBusy_GetScheme($_sScheme='') Gets array of one or all color schemes. (Requires: #include "GuiCtrlBusy.au3")
; _GuiCtrlBusy_AddScheme($_sScheme, $_RGBtopleft, $_RGBbottomright, $_BGRtitle, $_BGRtext) Adds a new color scheme, only valid at runtime. (Requires: #include "GuiCtrlBusy.au3")
; _GuiCtrlBusy_SetPos($_hWnd, $_iX=''[, $_iY=''[, $_bSetOnTop='']]) Moves the control to x/y position, optional set ontop. (Requires: #include "GuiCtrlBusy.au3")
; _GuiCtrlBusy_SetTimeout($_hWnd, $_iTimeout, $_iTimeCounter) Sets/Stops the control timeout. (Requires: #include "GuiCtrlBusy.au3")
; _GuiCtrlBusy_SetOnTop([$_hWnd=-1]) Sets one (default: all) control on top. (Requires: #include "GuiCtrlBusy.au3")
; _GuiCtrlBusy_UserDefaults($_sParamValue[, $_sDelim='|']) Changes the default values for control creation. (Requires: #include "GuiCtrlBusy.au3")
; _GuiCtrlBusy_GetClosed() Gets a Dummy-ID, that will fired by closing ctrl. Use "GuiCtrlRead(Dummy)" to get Ctrl-hWnd. (Requires: #include "GuiCtrlBusy.au3")
; ===============================================================================================================================

; #INTERNAL_USE_ONLY# ===========================================================================================================
; __CallbackDrawBusy
; __CalcControlSize
; __GetTextMeasure
; __FormatSeconds
; __OnExit
; __ManageCtrl
; __WinAPI_IconFromDll
; __Or
; __IconCreate
; __RGB2BGR
; ===============================================================================================================================


OnAutoItExitRegister('__OnExit')

; #ICON# ========================================================================================================================
Global $__sPathIcon = @TempDir & "\ctrl_busy.ico"
__IconCreate()
; ===============================================================================================================================


; #GLOBALS# =====================================================================================================================
Global Const $GCB_TITLE_DEF          = (StringInStr('0407 0807 0C07', @OSLang) ? 'Bin beschäftigt' : "I'm busy")
Global Const $GCB_TEXT_DEF           = (StringInStr('0407 0807 0C07', @OSLang) ? 'Bitte haben Sie noch etwas Geduld, ich arbeite...' : 'Please be patient, I am working...')
Global Const $GCB_TEXTSIZE           = 11         ; The default text size
Global Const $GCB_TEXTSTYLE          = 0          ; Text has normal style
Global Const $GCB_TEXALIGN           = 2          ; Text is centered
Global Const $GCB_TEXTFONT           = 'Microsoft Sans Serif' ; The default font
Global Const $GCB_MINWIDTH           = 250        ; The minimum control width
Global Const $GCB_MINHEIGHT          = 120        ; The minimum control height
Global Const $GCB_TEXT_MARGIN        = 15         ; Margin left & right from text. Minimum is 15 px
Global Const $GCB_RGB_TOPLEFT        = 0xA7BED7   ; Default RGB Color Gradient (top or left)
Global Const $GCB_RGB_BOTTRIGHT      = 0xF7F7F7   ; Default RGB Color Gradient (bottom or right)
Global Const $GCB_BGR_TITLE          = 0x800000   ; Default BGR Color Title (& Countdown/Time & Separating line)
Global Const $GCB_BGR_TEXT           = 0x400000   ; Default BGR Color Text
Global Const $GCB_DEF_COLSCHEME      = 'clouds'   ; The Default Color Scheme (Title / Text / Gradient)
Global Const $GCB_GRADIENT_L2R       = False      ; Gradient Left-To-Right (True), Default: Top-To-Bottom
Global Const $GCB_TIME_COUNTER       = 1          ; '0' - don't show Clocktime or Countdown, '1' - shows Countdown (Timeout required), '2' - shows Clocktime
Global Const $GCB_TIMEOUT_DEF        = 10         ; Default Timeout to close the control
Global Const $GCB_TIMEOUT_ZERO       = 2*60*60    ; The safety timeout (in s) to close controls - default: 2 hours
Global Const $GCB_CALLBACK_INTERVAL  = 500        ; Callback Interval (ms)

; User Default settings with: _GuiCtrlBusy_UserDefaults()
Global $GCB_U_TITLE_DEF         = $GCB_TITLE_DEF
Global $GCB_U_TEXT_DEF          = $GCB_TEXT_DEF
Global $GCB_U_TEXTSIZE          = $GCB_TEXTSIZE
Global $GCB_U_TEXTSTYLE         = $GCB_TEXTSTYLE
Global $GCB_U_TEXALIGN          = $GCB_TEXALIGN
Global $GCB_U_TEXTFONT          = $GCB_TEXTFONT
Global $GCB_U_MINWIDTH          = $GCB_MINWIDTH
Global $GCB_U_MINHEIGHT         = $GCB_MINHEIGHT
Global $GCB_U_TEXT_MARGIN       = $GCB_TEXT_MARGIN
Global $GCB_U_RGB_TOPLEFT       = $GCB_RGB_TOPLEFT
Global $GCB_U_RGB_BOTTRIGHT     = $GCB_RGB_BOTTRIGHT
Global $GCB_U_BGR_TITLE         = $GCB_BGR_TITLE
Global $GCB_U_BGR_TEXT          = $GCB_BGR_TEXT
Global $GCB_U_DEF_COLSCHEME     = $GCB_DEF_COLSCHEME
Global $GCB_U_GRADIENT_L2R      = $GCB_GRADIENT_L2R
Global $GCB_U_TIME_COUNTER      = $GCB_TIME_COUNTER
Global $GCB_U_TIMEOUT_DEF       = $GCB_TIMEOUT_DEF
Global $GCB_U_TIMEOUT_ZERO      = $GCB_TIMEOUT_ZERO
Global $GCB_U_CALLBACK_INTERVAL = $GCB_CALLBACK_INTERVAL


; Color Schemes
Global $gaGCB_COLORSCHEME[][] = [ _  ; ['Name_Scheme', RGB_Gradient_Start, RGB_Gradient_End, BGR_Title, BGR_Text]
['cacao',      0x460000,0xC06565,0xE6E6FF,0x0092FF], _
['clouds',     0xA7BED7,0xF7F7F7,0x800000,0x400000], _
['coffee',     0x000000,0xFDEADF,0xE9F1FF,0xE9F1FF], _
['darkness',   0x000000,0x666666,0xD4D4DE,0xD4D4DE], _
['fire',       0xFFA60C,0xFF0015,0xBC200B,0xD1FAFF], _
['forest',     0x005C1F,0xC5E0CE,0xEFFBE8,0x0C1F01], _
['midnight',   0x1C0E5D,0xDFD8FE,0xF6DCE1,0x180508], _
['orange',     0xE28304,0xFFDBAB,0xDCEEFA,0x000F80], _
['silver',     0x666666,0xDDDDDD,0xF6F6F6,0x0A0A0B], _
['system',     _WinAPI_GetSysColor($COLOR_WINDOW),_WinAPI_GetSysColor($COLOR_WINDOW),__RGB2BGR(_WinAPI_GetSysColor($COLOR_CAPTIONTEXT)),__RGB2BGR(_WinAPI_GetSysColor($COLOR_INFOTEXT))], _
['sys_invers', _WinAPI_GetSysColor($COLOR_CAPTIONTEXT),_WinAPI_GetSysColor($COLOR_INFOTEXT),__RGB2BGR(_WinAPI_GetSysColor($COLOR_WINDOW)),__RGB2BGR(_WinAPI_GetSysColor($COLOR_WINDOW))]]

Global $giGCB_INDEX_DEFSCHEME = 1 ; scheme "clouds", is changed when the default user scheme is changed with _GuiCtrlBusy_UserDefaults()

; Array indices like names
Global Enum $__ghHWnd, $__gsTitle, $__gsIcoFile, $__giIcoID, $__gsTxt, $__giTxtSize, $__giTxtStyle, $__gsTxtFont, $__giFontHeight, $__giAlign, $__giWidth, $__giHeight, _
$__giX, $__giY, $__giTimeOut, $__giTimeCnt, $__gBGRTitle, $__gBGRTxt, $__gRGBTL, $__gRGBBR, $__gaVertex, $__gbRotate, $__giLenTitle, $__giLenTime, $__giTxtTop, $__giTxtBott, _
$__gbPosNew, $__gbBreak, $__gbRecalc, $__gbRedraw, $__giDiffSecLast, $__giTimestamp, $__giCBInter, $__gbNoReCalc, $__giIDTimer, $__gbNewStamp, $__iUbCtrl

; Array, that stores the controls
Global $gaGCB_CTRL[1][$__iUbCtrl] = [[0]]

; Array template for parameter settings, default filled with "Null"
Global $gaGCB_DefParam[$__iUbCtrl]
For $i = 0 To $__iUbCtrl -1
	$gaGCB_DefParam[$i] = Null
Next

; Run Callback only if none access to ctrl-array by user at the same time
Global $gbCALLBACK_LOCKED = False

; Dummy, will be fired by closing a ctrl. Get the ctrl-handle with "GuiCtrlRead(dummy)"
Global $gGCB_CLOSED_DUMMY = -1

; ===============================================================================================================================




; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_Create
; Description ...: Creates an Busy-Control with minimal size of 250*120. The control size will calculate with used text (size, style, font).
;                  The really size will used, if greater than minimal. While the control is displayed, the script continues.
;                  The title line has fix text parameters: size (11), style (bold), font (Microsoft Sans Serif).
;                  The text is created with defaults [size (11), style (normal), font (Microsoft Sans Serif)]. This values are changeable (_GuiCtrlBusy_SetText).
;                  You can use multiple controls at the same time. By default, every 500 ms is checked to see if it is necessary to redraw
;                  (counter has new value, clocktime has changed, User has set any parameter).
;                  A control exists until manual deletion or until the timeout or security timeout is reached.
;                  All parameter can be changed during lifetime of the Control.
;                  You can get a Dummy-ID with _GuiCtrlBusy_GetClosed(). This dummy will fired, if an control has closed (by countdown or with _GuiCtrlBusy_Close() ).
;                  With GuiCtrlRead(dummy) you get the handle of the closed control.
;                  Using e.g.:
;                    Without Timeout for process with unknown end. If end of process calculable: set timeout and counter
;                    Control with some information - in error case: set title/text and signal colors
; Syntax ........: _GuiCtrlBusy_Create([$_sTitle = ''[, $_sText = ''[, $_iAlign=2[, $_iX = -1[, $_iY = -1[, $_iTimeout = -1[, $_iTimeCounter = -1[,
;                                     $_BGRtitleScheme = -1[, $_BGRtextOrRotate = -1[, $_RGBtopleft = -1[, $_RGBbottomright = -1[, $_bRotate = False]]]]]]]]]]]])
; Parameters ....: $_sTitle             - [optional] The title. Default ('') = value from $GCB_U_TITLE_DEF.
;                  $_sText              - [optional] The message text. Default ('') = value from $GCB_U_TEXT_DEF.
;                                         The text can have multiple lines. Linebreaks are possible with "\n" iside text or @LF or @CRLF.
;                                         The remaining time can be displayed in the text with "%C%".
;                                         All kind of views can be used with countdown. (title only / title w. clock time / title w. countdown)
;                  $_iAlign             - [optional] Text align. Default (-1) = centered. (0/1/2 = left/right/centered)
;                  $_iX                 - [optional] X-position. Default (-1) = horicontal centered
;                  $_iY                 - [optional] Y-position. Default (-1) = vertical centered
;                  $_iTimeout           - [optional] Time in seconds to close the control. Default (-1) = $GCB_TIMEOUT_DEF (10 s).
;                                         With "0" the control exists until manual deletion or until the timeout or security timeout is reached. ($GCB_U_TIMEOUT_ZERO)
;                  $_iTimeCounter       - [optional] Show countdown (1), clocktime (2) or nothing (0) in title line. Countdown requires a timeout. Default (-1) = $GCB_U_TIME_COUNTER.
;                  $_BGRtitleScheme     - [optional] BGR title color (& counter & delimiter line). Default (-1) = value from $GCB_U_BGR_TITLE.
;                                         !! You can use a color schem name for the parameter $_BGRTitleScheme
;                                            (predefined: cacao, clouds, coffee, darkness, fire, forest, midnight, orange, silver, system, sys_invers)
;                                         !! In this case will not need the other color parameters and the value for $_bRotate can given as the next parameter.
;                  $_BGRtextOrRotate    - [optional] BGR text color. Default (-1) = value from $GCB_U_BGR_TEXT. Is used as $_bRotate, ONLY if a color scheme name was used.
;                  $_RGBtopleft         - [optional] RGB gradient color (top/left). Default (-1) = value from $GCB_U_RGB_TOPLEFT.
;                  $_RGBbottomright     - [optional] RGB gradient color (bottom/right). Default (-1) = value from $GCB_U_RGB_BOTTRIGHT.
;                  $_bRotate            - [optional] Gradient direction.  Default = $GCB_U_GRADIENT_L2R ("False" top to bottom). With "True" from left to right.
; Return values .: The control handle.

; Description ...: Erstellt ein Busy-Ctrl mit den minimal Maßen 250 x 120. Die Größe wird aus dem Platzbedarf
;                  des Textes ermittelt. Während das Ctrl angezeigt wird, läuft das Skript weiter.
;                  Text und Titel werden mit Standard -Größe(11), -Style(normal), -Font(Microsoft Sans Serif) erstellt.
;                  Für den Text sind diese Werte änderbar (_GuiCtrlBusy_SetText)
;                  Es können zeitgleich mehrere Ctrl erstellt werden. Standardmäßig wird alle 500 ms geprüft, ob ein Neuzeichnen des Ctrl
;                  notwendig ist (Counter hat neuen Wert, User hat Parameter neu gesetzt).
;                  Ein Ctrl existiert bis zum manuellen Löschen, bis Erreichen des Timeout oder Erreichen des Sicherheitstimeout.
;                  ALLE Parameter des Ctrl lassen sich zur Laufzeit ändern.
;                  Es kann ein Dummy-Ctrl erstellt werden mit _GuiCtrlBusy_GetClosed(). Der Dummy wird ausgelöst, wenn ein Control beendet wird (mit Countdown oder _GuiCtrlBusy_Close() ).
;                  z.B.
;                    Ctrl ohne Timeout für länger dauernden Vorgang - Prozeßende kalkulierbar: Setzen von Timeout und Counter
;                    Ctrl mit allgemeinem Hinweis - Fehler tritt auf: Titel/Text ändern und Farbverlauf in Signalfarben
; Syntax ........: _GuiCtrlBusy_Create([$_sTitle = ''[, $_sText = ''[, $_iAlign=2[, $_iX = -1[, $_iY = -1[, $_iTimeout = -1[, $_iTimeCounter = -1[,
;                                     $_BGRtitleScheme = -1[, $_BGRtextOrRotate = -1[, $_RGBtopleft = -1[, $_RGBbottomright = -1[, $_bRotate = False]]]]]]]]]]]])
; Parameters ....: $_sTitle             - [optional] Der Ctrl-Titel. Standard ('') = Wert von $GCB_U_TITLE_DEF.
;                  $_sText              - [optional] Der Msg-Text. Standard ('') = Wert von $GCB_U_TEXT_DEF.
;                                         Der Text kann mehrzeilig sein. Zeilenumbrüche sind möglich durch "\n" im Text od. @LF od. @CRLF
;                                         Im Text kann mit Platzhalter "%C%" die Restlaufzeit angezeigt werden.
;                                         Alle Ctrl-Typen sind mit Countdown verwendbar. (nur Titel / Titel m. Uhrzeit / Titel m. Countdown)
;                  $_iAlign             - [optional] Textausrichtung Standard (-1) = zentriert. (0/1/2 = links/rechts/mittig)
;                  $_iX                 - [optional] X-Position. Standard (-1) = horiz. zentriert.
;                  $_iY                 - [optional] Y-Position. Standard (-1) = vert. zentriert
;                  $_iTimeout           - [optional] Zeit in s nach der das Ctrl beendet wird. Standard (-1) = $GCB_TIMEOUT_DEF (10 s).
;                                         Mit "0" existiert das Ctrl bis zum manuellen Löschen oder bis Erreichen des Sicherheits-Timeout ($GCB_U_TIMEOUT_ZERO)
;                  $_iTimeCounter       - [optional] Anzeige Countdown (1), Zeit (2) od. nichts (0) in Titelzeile rechts. Countdown erfordert gesetzten Timeout. Standard (-1) = $GCB_U_TIME_COUNTER.
;                  $_BGRtitleScheme     - [optional] BGR-Farbe Titel (& Counter & Trennlinie). Standard (-1) = Wert von $GCB_U_BGR_TITLE.
;                                         !! Für $_BGRTitleScheme kann auch der Name eines Farbschemas übergeben werden
;                                            (vordefiniert: cacao, clouds, coffee, darkness, forest, midnight, orange, silver, system, sys_invers)
;                                         !! In diesem Fall werden die anderen Farbparameter nicht benötigt und $_bRotate darf als Folgeparameter angegeben werden.
;                  $_BGRtextOrRotate    - [optional] BGR-Farbe Text. Standard (-1) = Wert von $GCB_U_BGR_TEXT. Wird als $_bRotate genutzt, NUR wenn ein Farbschema übergeben wird.
;                  $_RGBtopleft         - [optional] RGB-Farbe Gradient top od. left. Standard (-1) = Wert von $GCB_U_RGB_TOPLEFT.
;                  $_RGBbottomright     - [optional] RGB-Farbe Gradient bottom od. right. Standard (-1) = Wert von $GCB_U_RGB_BOTTRIGHT.
;                  $_bRotate            - [optional] Gradientverlauf ist Standard = $GCB_U_GRADIENT_L2R ("False" von oben nach unten). Mit "True" erfolgt Verlauf von links nach rechts.
; Return values .: Das Handle des Ctrl.

; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlBusy_Create($_sTitle='', $_sText='', $_iAlign=2, $_iX=-1, $_iY=-1, $_iTimeout=-1, $_iTimeCounter=-1, _
	                     $_BGRtitleScheme=-1, $_BGRtextOrRotate=-1, $_RGBtopleft=-1, $_RGBbottomright=-1, $_bRotate=$GCB_U_GRADIENT_L2R)
	Local Static $bFirstRun = True, $iTimeLastCall

	If $bFirstRun Then
		_GDIPlus_Startup()
		$fFirstRun = False
		$iTimeLastCall = _Timer_Init()
	Else
		; If you continuously create controls, the sleep avoids a collision inside the callback function, which will instantly called.
		If _Timer_Diff($iTimeLastCall) < 100 Then Sleep(100)
		$iTimeLastCall = _Timer_Init()
	EndIf

	Local $sScheme = IsString($_BGRtitleScheme) ? $_BGRtitleScheme : ''
	$_bRotate = IsBool($_BGRtextORRotate) ? $_BGRtextORRotate : $_bRotate
	If $sScheme <> '' Then
		Local $iIndex = $giGCB_INDEX_DEFSCHEME ; default scheme
		For $i = 0 To UBound($gaGCB_COLORSCHEME) -1
			If $gaGCB_COLORSCHEME[$i][0] = $sScheme Then
				$iIndex = $i
				ExitLoop
			EndIf
		Next
		$_RGBtopleft      = $gaGCB_COLORSCHEME[$iIndex][1]
		$_RGBbottomright  = $gaGCB_COLORSCHEME[$iIndex][2]
		$_BGRtitleScheme  = $gaGCB_COLORSCHEME[$iIndex][3]
		$_BGRtextORRotate = $gaGCB_COLORSCHEME[$iIndex][4]
	EndIf

	Local $aParam = $gaGCB_DefParam
	$aParam[$__gsTitle]   = ($_sTitle <> '' ? $_sTitle : Null)
	$aParam[$__gsTxt]     = ($_sText <> '' ? $_sText : Null)
	$aParam[$__giAlign]   = ($_iAlign = -1 ? Null : $_iAlign)
	$aParam[$__giX]       = ($_iX = -1 ? Null : $_iX)
	$aParam[$__giY]       = ($_iY = -1 ? Null : $_iY)
	$aParam[$__giTimeOut] = ($_iTimeout = -1 ? Null : $_iTimeout)
	$aParam[$__giTimeCnt] = ($_iTimeCounter = -1 ? Null : $_iTimeCounter)
	$aParam[$__gRGBTL]    = ($_RGBtopleft = -1 ? Null : $_RGBtopleft)
	$aParam[$__gRGBBR]    = ($_RGBbottomright = -1 ? Null : $_RGBbottomright)
	$aParam[$__gBGRTitle] = ($_BGRTitleScheme = -1 ? Null : $_BGRTitleScheme)
	$aParam[$__gBGRTxt]   = ($_BGRtextORRotate = -1 ? Null : $_BGRtextORRotate)
	$aParam[$__gbRotate]  =  $_bRotate

	Local $hWnd = __ManageCtrl(Null, 'set', $aParam)
	_Timer_SetTimer($hWnd, 0, '__CallbackDrawBusy')
	Return $hWnd
EndFunc  ;==>_GuiCtrlBusy_Create


; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_Close
; Description ...: Closes one/all Busy-Control. (This function is registered on Autoit exit)
; Syntax ........: _GuiCtrlBusy_Close([$_hWnd = -1])
; Parameters ....: $_hWnd               - [optional] The control handle. default (-1) = all control.
; Return values .: Erfolg  None
;                  Fehler  0 - set Error = 1   Handle is not valid

; Description ...: Beendet ein/alle Busy-Ctrl. (Die Funktion ist für AutoIt Exit registriert)
; Syntax ........: _GuiCtrlBusy_Close([$_hWnd = -1])
; Parameters ....: $_hWnd               - [optional] Das Handle des Ctrl. Stadard (-1) = alle Ctrl.
; Return values .: Erfolg  None
;                  Fehler  0 - set Error = 1   Handle ist nicht gültig

; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlBusy_Close($_hWnd=-1)
	If $_hWnd = -1 Then Return __ManageCtrl()  ; kill all
	If @error Then Return SetError(1,0,0)
	Local $aParam = $gaGCB_DefParam
	$aParam[$__gbBreak] = True
	__ManageCtrl($_hWnd, 'set', $aParam)       ; will killed in callback
EndFunc  ;==>_GuiCtrlBusy_Close


; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_SetTitle
; Description ...: Changes title, countdown, timeout, titel color
; Syntax ........: _GuiCtrlBusy_SetTitle($_hWnd, $_sTitle = ''[, $_iTimeCounter = ''[, $_iTimeout = ''[, $_BGRtitle = ''[, $_bSetOnTop = '']]]])
; Parameters ....: $_hWnd               - The control handle.
;                  $_sTitle             - [optional] The new title or '' to keep the old value.
;                  $_iTimeCounter       - [optional] '0'-title only, '1'-title & countdown, '2'-title & clocktime, '-1'-value from defaults or '' to keep the old value.
;                  $_iTimeout           - [optional] Timeout in s, '0' = none timeout (manually closing). '' to keep the old value.
;                                         If $_iTimeout has a higher value than $GCB_U_TIMEOUT_ZERO, the $GCB_U_TIMEOUT_ZERO value will increase.
;                  $_BGRtitle           - [optional] BGR title color or '' to keep the old value.
;                                         The color will also used for clocktime/countdown and seperating line.
;                  $_bSetOnTop          - [optional] 'True' sets control ontop

; Description ...: Ändern von Titel, Countdown, Timeout, Titelfarbe
; Syntax ........: _GuiCtrlBusy_SetTitle($_hWnd, $_sTitle = ''[, $_iTimeCounter = ''[, $_iTimeout = ''[, $_BGRtitle = ''[, $_bSetOnTop = '']]]])
; Parameters ....: $_hWnd               - Das Handle des Ctrl.
;                  $_sTitle             - [optional] Der neue Titel oder '' für Beibehalten bisheriger Wert.
;                  $_iTimeCounter       - [optional] '0'-keine Anzeige, '1'-Countdown, '2'-Zeit, '-1'-Standardwert oder '' für Beibehalten bisheriger Wert.
;                  $_iTimeout           - [optional] Timeout in s, '0' = kein Timeout (manuell Beenden). '' für Beibehalten bisheriger Wert.
;                                         Ist Timeout größer als TimeoutZero, wird TimeoutZero automatisch auf denselben Wert erhöht.
;                  $_BGRtitle           - [optional] BGR-Farbe Titel oder '' für Beibehalten bisheriger Wert.
;                                         Farbe auch für Counter und Trennlinie gültig
;                  $_bSetOnTop          - [optional] Bringt das Ctrl in den Vordergrund

; Return values .: None
; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlBusy_SetTitle($_hWnd, $_sTitle='', $_iTimeCounter='', $_iTimeout='', $_BGRtitle='', $_bSetOnTop='')
	Local $aParam = $gaGCB_DefParam
	$aParam[$__gsTitle]   = $_sTitle <> '' ? $_sTitle : Null
	$aParam[$__giTimeCnt] = $_iTimeCounter <> '' ? $_iTimeCounter : Null
	$aParam[$__giTimeOut] = $_iTimeout <> '' ? ($_iTimeout = -1 ? $GCB_U_TEXT_DEF : $_iTimeout) : Null
	$aParam[$__gBGRTitle] = $_BGRtitle <> '' ? ($_BGRtitle = -1 ? $GCB_U_BGR_TITLE : $_BGRtitle) : Null
	$aParam[$__gbRecalc]  = True
	$aParam[$__gbRedraw]  = True
	If $_sTitle <> '' Then WinSetTitle($_hWnd, '', $_sTitle)
	If $_bSetOnTop Then _WinAPI_SetWindowPos($_hWnd, $HWND_TOP, 0, 0, 0, 0, BitOR($SWP_NOMOVE,$SWP_NOSIZE))
	__ManageCtrl($_hWnd, 'set', $aParam)
EndFunc  ;==>_GuiCtrlBusy_SetTitle


; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_SetIcon
; Description ...: Sets an icon
; Syntax.........: _GuiCtrlBusy_SetIcon($_hWnd, $_sIconFile=''[, $_iIconID=''])
; Parameters ....: $_hWnd               - The control handle.
; ...............: $_sIconFile          - [optional] Default = '' uses "shell32.dll" (also with "shell32" or "shell32.dll")
;                                         otherwise the full path to the icon file (*.dll or *.ico)
; ...............: $_iIconID            - [optional] Only to use with "*.dll" - the icon ID

; Description ...: Setzt ein Icon
; Syntax.........: _GuiCtrlBusy_SetIcon($_hWnd, $_sIconFile=''[, $_iIconID=''])
; Parameters ....: $_hWnd               - Das Ctrl-Handle.
; ...............: $_sIconFile          - [optional] Standard = '' greift auf "shell32.dll" zu (auch mit "shell32" oder "shell32.dll")
;                                         anderenfalls der kpl. Pfad der Icondatei (*.dll oder *.ico)
; ...............: $_iIconID            - [optional] Nur bei Verwendung von "*.dll" - die Icon ID

; Return values .: none
; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlBusy_SetIcon($_hWnd, $_sIconFile='', $_iIconID='')
	Local $aParam = $gaGCB_DefParam
	$aParam[$__gsIcoFile] = $_sIconFile = '' ? 'shell32.dll' : $_sIconFile
	$aParam[$__giIcoID]   = $_iIconID <> '' ? $_iIconID : Null
	$aParam[$__gbRecalc]  = True
	$aParam[$__gbRedraw]  = True
	__ManageCtrl($_hWnd, 'set', $aParam)
EndFunc  ;==>_GuiCtrlBusy_SetIcon


; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_SetText
; Description ...: Changes text, text color, text size, text style, text font, text align, sets control ontop
; Syntax ........: _GuiCtrlBusy_SetText($_hWnd, $_sText=''[, $_BGRtext=''[, $_iSize=''[, $_iStyle=''[, $_sFontname=''[,$_iAlign=''[, $_bSetOnTop='']]]]]])
; Parameters ....: $_hWnd               - The control handle.
;                  $_sText              - [optional] New text or '' to keep the old value, (-1 = default text).
;                  $_BGRtext            - [optional] New BGR text color or '' to keep the old value, (-1 = default color).
;                  $_iSize              - [optional] New text size or '' to keep the old value, (-1 = default size).
;                  $_iStyle             - [optional] New text style or '' to keep the old value, (-1 = default style).
;                  $_sFontname          - [optional] New text font or '' to keep the old value, (-1 = default font).
;                  $_iAlign             - [optional] New text align or '' to keep the old value, (-1 = default align).
;                  $_bSetOnTop          - [optional] 'True' sets control ontop

; Description ...: Ändern von Text, Textfarbe, Textgröße, Textstyle, Textfont, Textausrichtung, Ctrl ontop
; Syntax ........: _GuiCtrlBusy_SetText($_hWnd, $_sText=''[, $_BGRtext=''[, $_iSize=''[, $_iStyle=''[, $_sFontname=''[,$_iAlign=''[, $_bSetOnTop='']]]]]])
; Parameters ....: $_hWnd               - Das Handle des Ctrl.
;                  $_sText              - [optional] Der neue Text oder '' für Beibehalten bisheriger Wert, (-1 = Standardwert).
;                  $_BGRtext            - [optional] Neue BGR-Textfarbe oder '' für Beibehalten bisheriger Wert, (-1 = Standardwert).
;                  $_iSize              - [optional] Neue Textgröße oder '' für Beibehalten bisheriger Wert, (-1 = Standardwert).
;                  $_iStyle             - [optional] Neuer Textstyle oder '' für Beibehalten bisheriger Wert, (-1 = Standardwert).
;                  $_sFontname          - [optional] Neuer Textfont oder '' für Beibehalten bisheriger Wert, (-1 = Standardwert).
;                  $_iAlign             - [optional] Neue Textausrichtung oder '' für Beibehalten bisheriger Wert, (-1 = Standardwert).
;                  $_bSetOnTop          - [optional] 'True' bringt das Ctrl in den Vordergrund

; Return values .: None
; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlBusy_SetText($_hWnd, $_sText='', $_BGRtext='', $_iSize='', $_iStyle='', $_sFontname='', $_iAlign='', $_bSetOnTop='')
	Local $aParam = $gaGCB_DefParam
	$aParam[$__gsTxt]      = $_sText <> '' ? ($_sText = -1 ? $GCB_U_TEXT_DEF : $_sText) : Null
	$aParam[$__gBGRTxt]    = $_BGRtext <> '' ? ($_BGRtext = -1 ? $GCB_U_BGR_TEXT : $_BGRtext) : Null
	$aParam[$__giTxtSize]  = $_iSize <> '' ? ($_iSize = -1 ? $GCB_U_TEXTSIZE : $_iSize) : Null
	$aParam[$__giTxtStyle] = $_iStyle <> '' ? ($_iStyle = -1 ? $GCB_U_TEXTSTYLE : $_iStyle) : Null
	$aParam[$__gsTxtFont]  = $_sFontname <> '' ? ($_sFontname = -1 ? $GCB_U_TEXTFONT : $_sFontname) : Null
	$aParam[$__giAlign]    = $_iAlign <> '' ? ($_iAlign = -1 ? $GCB_U_TEXALIGN : $_iAlign) : Null
	$aParam[$__gbRecalc]   = True
	$aParam[$__gbRedraw]   = True
	If $_bSetOnTop Then _WinAPI_SetWindowPos($_hWnd, $HWND_TOP, 0, 0, 0, 0, BitOR($SWP_NOMOVE,$SWP_NOSIZE))
	__ManageCtrl($_hWnd, 'set', $aParam)
EndFunc  ;==>_GuiCtrlBusy_SetText


; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_SetCBInterval
; Description ...: Sets an individual callback frequency for the control.
; Syntax ........: _GuiCtrlBusy_SetCBInterval($_hWnd[, $_iInterval=$GCB_U_CALLBACK_INTERVAL[, $_bNoReCalc=False]])
; Parameters ....: $_hWnd               - The control handle.
;                  $_iFrequency         - [optional] The new callback interval. Default is $GCB_U_CALLBACK_INTERVAL.
;                  $_bNoReCalc          - [optional] By using a high frequency, it may be usefull to avoid recalculation of the control size, if
;                                                    the changed text has none or only minimal effect to text length.
;                                         Default is "False" - recalculation required.

; Description ...: Setzt eines individuellen Callback Intervalls für das Ctrl
; Syntax ........: _GuiCtrlBusy_SetCBFreq($_hWnd[, $_iInterval=$GCB_U_CALLBACK_INTERVAL[, $_bNoReCalc=False]])
; Parameters ....: $_hWnd               - Das Ctrl Handle.
;                  $_iFrequency         - [optional] Das neue Callback Intervall. Standard ist $GCB_U_CALLBACK_INTERVAL.
;                  $_bNoReCalc          - [optional] Bei Verwendung einer hoheh Frequenz kann es sinnvoll sein, eine Neuberechnung der Ctrl-Größe
;                                                    zu verhindern, wenn Textänderungen keinen oder minimalen Einfluss auf die Textlänge haben.
;                                         Standard ist "False" - Neuberechnung erforderlich.
; Return values .: None
; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlBusy_SetCBInterval($_hWnd, $_iInterval=$GCB_U_CALLBACK_INTERVAL, $_bNoReCalc=False)
	Local $aParam = $gaGCB_DefParam
	$aParam[$__giCBInter]    = $_iInterval
	$aParam[$__gbNoReCalc] = $_bNoReCalc
	If $_bNoReCalc Then Sleep($GCB_CALLBACK_INTERVAL) ; wait until has calculated the real size (required, if this call is directly after the creation)
	__ManageCtrl($_hWnd, 'set', $aParam)
EndFunc  ;==>_GuiCtrlBusy_SetCBInterval


; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_StopRecalc
; Description ...: Stops recalculation of control size while changing of text or title.
;                  Usefull, if the changed text has none or only minimal effect to text length.
; Syntax ........: _GuiCtrlBusy_StopRecalc($_hWnd[, $_bNoReCalc=True])
; Parameters ....: $_hWnd               - The control handle.
;                  $_bNoReCalc          - [optional] Default is "True", none recalculation. "False" allows again the default behaviour.
; Return values .: None
; Note ..........: If recalculation is stopped, you can't set an icon, if none exists before.

; Description ...: Stoppt die Neuberechnung der Ctrl-Größe bei Änderung in Text oder Titel
;                  Sinnvoll, wenn Textänderungen keinen oder minimalen Einfluss auf die Textlänge haben.
; Syntax ........: _GuiCtrlBusy_StopRecalc($_hWnd[, $_bNoReCalc=True])
; Parameters ....: $_hWnd               - Das Ctrl Handle.
;                  $_bNoReCalc          - [optional] Standard ist "True", keine Neuberechnung. "False" setzt zurück auf Standardverhalten.
; Return values .: None
; Note ..........: Wenn die Neuberechnung gestoppt ist, kann kein Icon gesetzt werden, sofern noch keins existierte.
; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlBusy_StopRecalc($_hWnd, $_bNoReCalc=True)
	Local $aParam = $gaGCB_DefParam
	$aParam[$__gbNoReCalc] = $_bNoReCalc
	If $_bNoReCalc Then Sleep($GCB_CALLBACK_INTERVAL) ; wait until has calculated the real size (required, if this call is directly after the creation)
	__ManageCtrl($_hWnd, 'set', $aParam)
EndFunc  ;==>_GuiCtrlBusy_StopRecalc


; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_SetColors
; Description ...: Changes all color values
; Syntax ........: _GuiCtrlBusy_SetColors($_hWnd[, $_BGRtitle=''[, $_BGRtext=''[, $_RGBtopleft=''[, $_RGBbottomright='']]]])
; Parameters ....: $_hWnd               - The control handle.
;                  $_BGRtitle           - [optional] The BGR title color (-1 = default) or '' to keep the old value.
;                  $_BGRtext            - [optional] The BGR text color (-1 = default) or '' to keep the old value.
;                  $_RGBtopleft         - [optional] The RGB gradient (top/left) color (-1 = default color) or '' to keep the old value.
;                  $_RGBbottomright     - [optional] The RGB gradient (bottom/right) color (-1 = default color) or '' to keep the old value.

; Description ...: Ändern aller Farbwerte
; Syntax ........: _GuiCtrlBusy_SetColors($_hWnd[, $_BGRtitle=''[, $_BGRtext=''[, $_RGBtopleft=''[, $_RGBbottomright='']]]])
; Parameters ....: $_hWnd               - Das Handle des Ctrl.
;                  $_BGRtitle           - [optional] Die BGR-Titelfarbe (-1 für Default-Farbe) oder '' für Beibehalten bisheriger Wert.
;                  $_BGRtext            - [optional] Die BGR-Textfarbe (-1 für Default-Farbe) oder '' für Beibehalten bisheriger Wert.
;                  $_RGBtopleft         - [optional] Die RGB-Farbe Farbverlauf (oben/links) (-1 = Standard Farbe) oder '' für Beibehalten bisheriger Wert.
;                  $_RGBbottomright     - [optional] Die RGB-Farbe Farbverlauf (unten/rechts) (-1 = Standard Farbe) oder '' für Beibehalten bisheriger Wert.

; Return values .: None
; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlBusy_SetColors($_hWnd, $_BGRtitle='', $_BGRtext='', $_RGBtopleft='', $_RGBbottomright='')
	Local $aParam = $gaGCB_DefParam
	$aParam[$__gRGBTL]    = $_RGBtopleft <> '' ? ($_RGBtopleft = -1 ? $GCB_U_RGB_TOPLEFT : $_RGBtopleft) : Null
	$aParam[$__gRGBBR]    = $_RGBbottomright <> '' ? ($_RGBbottomright = -1 ? $GCB_U_RGB_BOTTRIGHT : $_RGBbottomright) : Null
	$aParam[$__gBGRTitle] = $_BGRtitle <> '' ? ($_BGRtitle = -1 ? $GCB_U_BGR_TITLE : $_BGRtitle) : Null
	$aParam[$__gBGRTxt]   = $_BGRtext <> '' ? ($_BGRtext = -1 ? $GCB_U_BGR_TITLE : $_BGRtext) : Null
	$iIndex = __ManageCtrl($_hWnd, 'get')
	Local $aVertexTmp[2][3] = [[0, 0, ($aParam[$__gRGBTL] <> Null ? $aParam[$__gRGBTL] : $gaGCB_CTRL[$iIndex][$__gRGBTL])], _
		[$gaGCB_CTRL[$iIndex][$__giWidth], $gaGCB_CTRL[$iIndex][$__giHeight], ($aParam[$__gRGBBR] <> Null ? $aParam[$__gRGBBR] : $gaGCB_CTRL[$iIndex][$__gRGBBR])]]
	$aParam[$__gaVertex]  = $aVertexTmp
	$aParam[$__gbRedraw]  = True
	__ManageCtrl($_hWnd, 'set', $aParam)
EndFunc  ;==>_GuiCtrlBusy_SetColors


; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_SetGradient
; Description ...: Changes the gradient settings
; Syntax ........: _GuiCtrlBusy_SetGradient($_hWnd, $_RGBtopleft = ''[, $_RGBbottomright = ''[, $_bRotate = '']])
; Parameters ....: $_hWnd               - The control handle.
;                  $_RGBtopleft         - [optional] New RGB color (gradient top/left) or '' to keep the old value.
;                  $_RGBbottomright     - [optional] New RGB color (gradient bottom/right) or '' to keep the old value.
;                  $_bRotate            - [optional] Gradientverlauf "False" von oben nach unten, "True" von links nach rechts.
;                                                    Oder '' to keep the old value.
;                  $_bSetOnTop          - [optional] 'True' sets control ontop

; Description ...: Ändern der Farbverlaufeinstellungen
; Syntax ........: _GuiCtrlBusy_SetGradient($_hWnd, $_RGBtopleft = ''[, $_RGBbottomright = ''[, $_bRotate = '']])
; Parameters ....: $_hWnd               - Das Handle des Ctrl.
;                  $_RGBtopleft         - [optional] Neue RGB-Farbe (Farbverlauf oben/links) oder '' für Beibehalten bisheriger Wert.
;                  $_RGBbottomright     - [optional] Neue RGB-Farbe (Farbverlauf unten/rechts) oder '' für Beibehalten bisheriger Wert.
;                  $_bRotate            - [optional] Farbverlauf "False" von oben nach unten, "True" von links nach rechts.
;                                                    Oder '' für Beibehalten bisheriger Wert.
;                  $_bSetOnTop          - [optional] 'True' Bringt das Ctrl in den Vordergrund

; Return values .: None
; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlBusy_SetGradient($_hWnd, $_RGBtopleft, $_RGBbottomright='', $_bRotate='', $_bSetOnTop='')
	Local $aParam = $gaGCB_DefParam, $iIndex = __ManageCtrl($_hWnd, 'get')
	$aParam[$__gRGBTL]   = $_RGBtopleft <> '' ? ($_RGBtopleft = -1 ? $GCB_U_RGB_TOPLEFT : $_RGBtopleft) : Null
	$aParam[$__gRGBBR]   = $_RGBbottomright <> '' ? ($_RGBbottomright = -1 ? $GCB_U_RGB_BOTTRIGHT : $_RGBbottomright) : Null
	$aParam[$__gbRotate] = $_bRotate <> '' ? ($_bRotate = -1 ? $GCB_U_GRADIENT_L2R : $_bRotate) : Null
	Local $aVertexTmp[2][3] = [[0, 0, $aParam[$__gRGBTL]], [$gaGCB_CTRL[$iIndex][$__giWidth], $gaGCB_CTRL[$iIndex][$__giHeight], $aParam[$__gRGBBR]]]
	$aParam[$__gaVertex] = $aVertexTmp
	$aParam[$__gbRedraw] = True
	If $_bSetOnTop Then _WinAPI_SetWindowPos($_hWnd, $HWND_TOP, 0, 0, 0, 0, BitOR($SWP_NOMOVE,$SWP_NOSIZE))
	__ManageCtrl($_hWnd, 'set', $aParam)
EndFunc  ;==>_GuiCtrlBusy_SetGradient


; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_SetScheme
; Description ...: Sets a new color scheme to an control. Optional change the gradient direction, set ontop.
; Syntax ........: _GuiCtrlBusy_SetScheme($_hWnd[, $_sScheme = ''[, $_bRotate = ''[, $_bSetOnTop = '']]])
; Parameters ....: $_hWnd               - The control handle.
;                  $_sScheme            - [optional] The color scheme to set. Default is '', uses the default scheme.
;                  $_bRotate            - [optional] The gradient direction (True=left to right, False=top to bottom). Default is '', the value from creation.
;                  $_bSetOnTop          - [optional] Sets the control ontop. Default is '', none action.

; Description ...: Setzen eines neuen Farbschemas für ein Ctrl. Optional mit Änderung Farbverlauf und Setzen OnTop.
; Syntax ........: _GuiCtrlBusy_SetScheme($_hWnd[, $_sScheme = ''[, $_bRotate = ''[, $_bSetOnTop = '']]])
; Parameters ....: $_hWnd               - Das Handle des Ctrl.
;                  $_sScheme            - [optional] Das zu setzende Farbschema. Standard ist '', das Default Schema.
;                  $_bRotate            - [optional] Die Farbverlauf Richtung (True=links nach rechts, False=oben nach unten). Standard ist '', der Wert von der Erstellung.
;                  $_bSetOnTop          - [optional] Setzt das Ctrl ontop. Standard ist '', keine Aktion.

; Return values .: None
; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlBusy_SetScheme($_hWnd, $_sScheme='', $_bRotate='', $_bSetOnTop='')
	Local $iIndex = $giGCB_INDEX_DEFSCHEME ; default scheme
	If $_sScheme <> '' Then
		For $i = 0 To UBound($gaGCB_COLORSCHEME) -1
			If $gaGCB_COLORSCHEME[$i][0] = $_sScheme Then
				$iIndex = $i
				ExitLoop
			EndIf
		Next
	EndIf
	Local $RGBtopleft     = $gaGCB_COLORSCHEME[$iIndex][1]
	Local $RGBbottomright = $gaGCB_COLORSCHEME[$iIndex][2]
	Local $BGRtitle       = $gaGCB_COLORSCHEME[$iIndex][3]
	Local $BGRtext        = $gaGCB_COLORSCHEME[$iIndex][4]

	Local $aParam = $gaGCB_DefParam
	$aParam[$__gRGBTL]    = $RGBtopleft
	$aParam[$__gRGBBR]    = $RGBbottomright
	$aParam[$__gBGRTitle] = $BGRtitle
	$aParam[$__gBGRTxt]   = $BGRtext
	$aParam[$__gbRotate]  = $_bRotate <> '' ? $_bRotate : Null
	$iIndex = __ManageCtrl($_hWnd, 'get')
	Local $aVertexTmp[2][3] = [[0, 0, $RGBtopleft], [$gaGCB_CTRL[$iIndex][$__giWidth], $gaGCB_CTRL[$iIndex][$__giHeight], $RGBbottomright]]
	$aParam[$__gaVertex]  = $aVertexTmp
	$aParam[$__gbRedraw]  = True

	If $_bSetOnTop Then _WinAPI_SetWindowPos($_hWnd, $HWND_TOP, 0, 0, 0, 0, BitOR($SWP_NOMOVE,$SWP_NOSIZE))
	__ManageCtrl($_hWnd, 'set', $aParam)
EndFunc  ;==>_GuiCtrlBusy_SetScheme


; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_GetScheme
; Description ...: Returns one or all color schemes
; Syntax ........: _GuiCtrlBusy_GetScheme($_sScheme='')
; Parameters ....: $_sScheme            - The name of the scheme. (default: "" = all)
; Return values .: Array(1D/2D) with one/all scheme/s

; Description ...: Gibt ein oder alle Farbschema zurück
; Syntax ........: _GuiCtrlBusy_GetScheme($_sScheme='')
; Parameters ....: $_sScheme            - Der Name des Schemas. (Standard: "" = alle)
; Return values .: Array(1D/2D) mit einem/allen Schema/ta

; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlBusy_GetScheme($_sScheme='')
	If $_sScheme = '' Then Return $gaGCB_COLORSCHEME
	Local $aRet[5]
	For $i = 0 To UBound($gaGCB_COLORSCHEME) -1
		If $gaGCB_COLORSCHEME[$i][0] = $_sScheme Then
			For $j = 0 To 4
				$aRet[$j] = $gaGCB_COLORSCHEME[$i][$j]
			Next
		EndIf
	Next
	Return $aRet
EndFunc  ;==>_GuiCtrlBusy_GetScheme


; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_AddScheme
; Description ...: Adds a color scheme (temporary on runtime).
; Syntax ........: _GuiCtrlBusy_AddScheme($_sScheme='')
; Parameters ....: $_sScheme            - The name of the new scheme.
;                  $_RGBtopleft         - RGB gradient Start
;                  $_RGBbottomright     - RGB gradient End
;                  $_BGRtitle           - BGR Title
;                  $_BGRtext            - BGR Text
; Return values .: Erfolg               - 1
;                  Fehler               - 0 @error=1, name of scheme already exists

; Description ...: Fügt ein Farbschema hinzu (temporär zur Laufzeit).
; Syntax ........: _GuiCtrlBusy_AddScheme($_sScheme='')
; Parameters ....: $_sScheme            - Der Name des neuen Schemas.
;                  $_RGBtopleft         - RGB Gradient Start
;                  $_RGBbottomright     - RGB Gradient End
;                  $_BGRtitle           - BGR Titel
;                  $_BGRtext            - BGR Text
; Return values .: Erfolg               - 1
;                  Fehler               - 0 @error=1, Schema existiert bereits

; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlBusy_AddScheme($_sScheme, $_RGBtopleft, $_RGBbottomright, $_BGRtitle, $_BGRtext)
	For $i = 0 To UBound($gaGCB_COLORSCHEME) -1
		If $gaGCB_COLORSCHEME[$i][0] = $_sScheme Then
			Return SetError(1,0,0)
		EndIf
	Next
	Local $iUbound = UBound($gaGCB_COLORSCHEME)
	ReDim $gaGCB_COLORSCHEME[$iUbound+1][5]
	$gaGCB_COLORSCHEME[$iUbound][0] = $_sScheme
	$gaGCB_COLORSCHEME[$iUbound][1] = $_RGBtopleft
	$gaGCB_COLORSCHEME[$iUbound][2] = $_RGBbottomright
	$gaGCB_COLORSCHEME[$iUbound][3] = $_BGRtitle
	$gaGCB_COLORSCHEME[$iUbound][4] = $_BGRtext
	Return 1
EndFunc  ;==>_GuiCtrlBusy_AddScheme


; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_SetPos
; Description ...: Change the control position (X, Y), optional set ontop
; Syntax ........: _GuiCtrlBusy_SetPos($_hWnd, $_iX = ''[, $_iY = ''[, $_bSetOnTop = '']])
; Parameters ....: $_hWnd               - The control handle.
;                  $_iX                 - New X position or '' to keep the old value. "-1" = centered horicontal
;                  $_iY                 - [optional] New Y position or '' to keep the old value. "-1" = centered vertical
;                  $_bSetOnTop          - [optional] 'True' sets control ontop

; Description ...: Ändern der Position (X, Y), optional set OnTop
; Syntax ........: _GuiCtrlBusy_SetPos($_hWnd, $_iX = ''[, $_iY = ''[, $_bSetOnTop = '']])
; Parameters ....: $_hWnd               - Das Handle des Ctrl.
;                  $_iX                 - Neue X-Position oder '' für Beibehalten bisheriger Wert. "-1" = zentriert
;                  $_iY                 - [optional] Neue Y-Position oder '' für Beibehalten bisheriger Wert. "-1" = zentriert
;                  $_bSetOnTop          - [optional] 'True' bringt das Ctrl in den Vordergrund

; Return values .: None
; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlBusy_SetPos($_hWnd, $_iX, $_iY='', $_bSetOnTop='')
	Local $aParam = $gaGCB_DefParam
	$aParam[$__giX]      = $_iX <> '' ? ($_iX = -1 ? Int(@DesktopWidth/2 - $GCB_U_MINWIDTH/2) : $_iX) : Null
	$aParam[$__giY]      = $_iY <> '' ? ($_iY = -1 ? Int(@DesktopHeight/2 - $GCB_U_MINHEIGHT/2) : $_iY) : Null
	$aParam[$__gbPosNew] = True
	If $_bSetOnTop Then _WinAPI_SetWindowPos($_hWnd, $HWND_TOP, 0, 0, 0, 0, BitOR($SWP_NOMOVE,$SWP_NOSIZE))
	__ManageCtrl($_hWnd, 'set', $aParam)
EndFunc  ;==>_GuiCtrlBusy_SetPos


; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_SetTimeout
; Description ...: Sets timeout for countdown or changes the kind of view
; Syntax ........: _GuiCtrlBusy_SetTimeout($_hWnd, $_iTimeout, $_iTimeCounter)
; Parameters ....: $_hWnd               - The control handle.
;                  $_iTimeout           - The new timeout. "0" = none timeout, closing manually (required by changing kind of view)
;                                         If timeout is gt TimeoutZero, will TimeoutZero increase to this value.
;                  $_iTimeCounter       - The currently used kind of view [0=title only, 1=countdown(default), 2=title&clocktime]

; Description ...: Setzen des Timeout für Countdown oder Ändern des Anzeigetyps
; Syntax ........: _GuiCtrlBusy_SetTimeout($_hWnd, $_iTimeout[, $_iTimeCounter=1])
; Parameters ....: $_hWnd               - Das Handle des Ctrl.
;                  $_iTimeout           - Der neue Timeout. "0" = kein Timeout, Beenden manuell
;                                         Ist Timeout größer als TimeoutZero, wird TimeoutZero automatisch auf denselben Wert erhöht.
;                  $_iTimeCounter       - Die aktuelle Anzeigeart [0=Nur Titel, 1=Countdown(Standard), 2=Titel&Uhrzeit]

; Return values .: None
; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlBusy_SetTimeout($_hWnd, $_iTimeout, $_iTimeCounter)
	Local $aParam = $gaGCB_DefParam
	$aParam[$__gbNewStamp]    = True
	$aParam[$__giTimeOut]     = ($_iTimeout = -1 ? $GCB_U_TIMEOUT_DEF : $_iTimeout)
	$aParam[$__giTimeCnt]     = $_iTimeCounter
	$aParam[$__giDiffSecLast] = 0
	$aParam[$__gbRecalc]      = True
	$aParam[$__gbRedraw]      = True
	__ManageCtrl($_hWnd, 'set', $aParam)
EndFunc  ;==>_GuiCtrlBusy_SetTimeout


; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_SetOnTop
; Description ...: Sets an control ontop
; Syntax ........: _GuiCtrlBusy_SetOnTop($_hWnd)
; Parameters ....: $_hWnd               - The control handle. -1 (default) sets all control ontop

; Description ...: Setzt ein Ctrl OnTop
; Syntax ........: _GuiCtrlBusy_SetOnTop($_hWnd)
; Parameters ....: $_hWnd               - Das Handle des Ctrl. -1 (Standard) setzt alle Ctrl OnTop

; Return values .: None
; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlBusy_SetOnTop($_hWnd=-1)
	If $_hWnd = -1 Then
		For $i = 1 To $gaGCB_CTRL[0][0]
			_WinAPI_SetWindowPos($gaGCB_CTRL[$i][0], $HWND_TOP, 0, 0, 0, 0, BitOR($SWP_NOMOVE,$SWP_NOSIZE))
		Next
	Else
		_WinAPI_SetWindowPos($_hWnd, $HWND_TOP, 0, 0, 0, 0, BitOR($SWP_NOMOVE,$SWP_NOSIZE))
	EndIf
EndFunc  ;==>_GuiCtrlBusy_SetOnTop


; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_UserDefaults
; Description ...: Sets user defined default values or sets back to system defaults
; Syntax ........: _GuiCtrlBusy_UserDefaults($_sParamValue[, $_sDelim = '|'])
; Parameters ....: $_sParamValue        - The parameter string. "parameter1=value|parameter2=value|.."
;                        possible parameters:
;                        sTitle, sText, iTextSize, iTextStyle, iAlign, sTextFont, iMinWidth, iMinHeight, iMargin, RGBTopLeft, RGBBotRight, _
;                        BGRTitle, BGRText, sScheme, bRotate, iTimeCounter, iTimeOut, iTimeoutZero, iCallback
;                        "all=system" sets all user defaults back to system defaults
;                        Every parameter can set back to system default with "param=system"
;                  $_sDelim             - [optional] Delimiter between parameters (default '|').
; Return values .: Success    String "Parameter=NewValue (OldValue)"
;                  Error      '' set Error=1  -  none valid parameter string

; Description ...: Setzen von benutzerdefinierten Standardwerten oder Zurücksetzen auf Programmstandards
; Syntax ........: _GuiCtrlBusy_UserDefaults($_sParamValue[, $_sDelim = '|'])
; Parameters ....: $_sParamValue        - Parameterstring. "Parameter1=Wert|Parameter2=Wert|.."
;                        mögliche Parameter:
;                        sTitle, sText, iTextSize, iTextStyle, iAlign, sTextFont, iMinWidth, iMinHeight, iMargin, RGBTopLeft, RGBBotRight, _
;                        BGRTitle, BGRText, sScheme, bRotate, iTimeCounter, iTimeOut, iTimeoutZero, iCallback
;                        "all=system" setzt die User-Defaults zurück auf System-Defaults
;                        Jeder Parameter kann auch einzeln mit "Param=system" auf System-Defaults zurückgesetzt werden.
;                  $_sDelim             - [optional] Trennzeichen zwischen den Parametern. Standard ist '|'.
; Return values .: Erfolg     String "Parameter=NeuerWert (AlterWert)"
;                  Fehler     '' set Error=1  -  kein gültiger Parameterstring übergeben


; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlBusy_UserDefaults($_sParamValue, $_sDelim='|')
	Local $SF = StringFormat, $sOldValues = ''
	If $_sParamValue = "all=system" Then
		$sOldValues = $SF('sTitle=%s (%s)%ssText=%s (%s)%siTextSize=%s (%s)%siTextStyle=%s (%s)%siAlign=%s (%s)%ssTextFont=%s (%s)%siMinWidth=%s (%s)%siMinHeight=%s (%s)%siMargin=%s (%s)%s' & _
            'RGBTopLeft=0x%s (0x%s)%sRGBBotRight=0x%s (0x%s)%sBGRTitle=0x%s (0x%s)%sBGRText=0x%s (0x%s)%sbRotate=%s (%s)%siTimeCounter=%s (%s)%siTimeOut=%s (%s)%s' & _
			'iTimeoutZero=%s (%s)%siCallback=%s (%s)%s', _
            $GCB_U_TITLE_DEF,$GCB_TITLE_DEF,$_sDelim,$GCB_U_TEXT_DEF,$GCB_TEXT_DEF,$_sDelim,$GCB_U_TEXTSIZE,$GCB_TEXTSIZE,$_sDelim,$GCB_U_TEXTSTYLE,$GCB_TEXTSTYLE,$_sDelim,$GCB_U_TEXALIGN,$GCB_TEXALIGN,$_sDelim, _
			$GCB_U_TEXTFONT,$GCB_TEXTFONT,$_sDelim,$GCB_U_MINWIDTH,$GCB_MINWIDTH,$_sDelim,$GCB_U_MINHEIGHT,$GCB_MINHEIGHT,$_sDelim,$GCB_U_TEXT_MARGIN,$GCB_TEXT_MARGIN,$_sDelim, _
			Hex($GCB_U_RGB_TOPLEFT,6),Hex($GCB_RGB_TOPLEFT,6),$_sDelim,Hex($GCB_U_RGB_BOTTRIGHT,6),Hex($GCB_RGB_BOTTRIGHT,6),$_sDelim,Hex($GCB_U_BGR_TITLE,6),Hex($GCB_BGR_TITLE,6),$_sDelim, _
			Hex($GCB_U_BGR_TEXT,6),Hex($GCB_BGR_TEXT,6),$_sDelim,$GCB_U_DEF_COLSCHEME,$GCB_DEF_COLSCHEME,$_sDelim,$GCB_U_GRADIENT_L2R,$GCB_GRADIENT_L2R,$_sDelim, _
			$GCB_U_TIME_COUNTER,$GCB_TIME_COUNTER,$_sDelim,$GCB_U_TIMEOUT_DEF,$GCB_TIMEOUT_DEF,$_sDelim,$GCB_U_TIMEOUT_ZERO,$GCB_TIMEOUT_ZERO,$_sDelim, _
			$GCB_U_CALLBACK_INTERVAL,$GCB_CALLBACK_INTERVAL,$_sDelim)
		$GCB_U_TITLE_DEF         = $GCB_TITLE_DEF
		$GCB_U_TEXT_DEF          = $GCB_TEXT_DEF
		$GCB_U_TEXTSIZE          = $GCB_TEXTSIZE
		$GCB_U_TEXTSTYLE         = $GCB_TEXTSTYLE
		$GCB_U_TEXALIGN          = $GCB_TEXALIGN
		$GCB_U_TEXTFONT          = $GCB_TEXTFONT
		$GCB_U_MINWIDTH          = $GCB_MINWIDTH
		$GCB_U_MINHEIGHT         = $GCB_MINHEIGHT
		$GCB_U_TEXT_MARGIN       = $GCB_TEXT_MARGIN
		$GCB_U_RGB_TOPLEFT       = $GCB_RGB_TOPLEFT
		$GCB_U_RGB_BOTTRIGHT     = $GCB_RGB_BOTTRIGHT
		$GCB_U_BGR_TITLE         = $GCB_BGR_TITLE
		$GCB_U_BGR_TEXT          = $GCB_BGR_TEXT
		$GCB_U_DEF_COLSCHEME     = $GCB_DEF_COLSCHEME
		$GCB_U_GRADIENT_L2R      = $GCB_GRADIENT_L2R
		$GCB_U_TIME_COUNTER      = $GCB_TIME_COUNTER
		$GCB_U_TIMEOUT_DEF       = $GCB_TIMEOUT_DEF
		$GCB_U_TIMEOUT_ZERO      = $GCB_TIMEOUT_ZERO
		$GCB_U_CALLBACK_INTERVAL = $GCB_CALLBACK_INTERVAL
	Else
		Local $aParamSet = StringSplit($_sParamValue, $_sDelim), $aKeyVal
		For $i = 1 To $aParamSet[0]
			$aKeyVal = StringSplit($aParamSet[$i], '=')
			If $aKeyVal[0] = 1 Then ContinueLoop
			Switch $aKeyVal[1]
				Case 'sTitle'
					$sOldValues &= $SF('sTitle=%s (%s)%s', $aKeyVal[2], $GCB_U_TITLE_DEF, $_sDelim)
					$GCB_U_TITLE_DEF = ($aKeyVal[2] = 'system' ? $GCB_TITLE_DEF : $aKeyVal[2])
				Case 'sText'
					$sOldValues &= $SF('sText=%s (%s)%s', $aKeyVal[2], $GCB_U_TEXT_DEF, $_sDelim)
					$GCB_U_TEXT_DEF = ($aKeyVal[2] = 'system' ? $GCB_TEXT_DEF : $aKeyVal[2])
				Case 'iTextSize'
					$sOldValues &= $SF('iTextSize=%s (%s)%s', $aKeyVal[2], $GCB_U_TEXTSIZE, $_sDelim)
					$GCB_U_TEXTSIZE = ($aKeyVal[2] = 'system' ? $GCB_TEXTSIZE : $aKeyVal[2])
				Case 'iTextStyle'
					$sOldValues &= $SF('iTextStyle=%s (%s)%s', $aKeyVal[2], $GCB_U_TEXTSTYLE, $_sDelim)
					$GCB_U_TEXTSTYLE = ($aKeyVal[2] = 'system' ? $GCB_TEXTSTYLE : $aKeyVal[2])
				Case 'iAlign'
					$sOldValues &= $SF('iAlign=%s (%s)%s', $aKeyVal[2], $GCB_U_TEXALIGN, $_sDelim)
					$GCB_U_TEXALIGN = ($aKeyVal[2] = 'system' ? $GCB_TEXALIGN : $aKeyVal[2])
				Case 'sTextFont'
					$sOldValues &= $SF('sTextFont=%s (%s)%s', $aKeyVal[2], $GCB_U_TEXTFONT, $_sDelim)
					$GCB_U_TEXTFONT = ($aKeyVal[2] = 'system' ? $GCB_TEXTFONT : $aKeyVal[2])
				Case 'iMinWidth'
					$aKeyVal[2] = $aKeyVal[2] < $GCB_MINWIDTH ? $GCB_MINWIDTH : $aKeyVal[2] ; can't be smaller than $GCB_MINWIDTH
					$sOldValues &= $SF('iMinWidth=%s (%s)%s', $aKeyVal[2], $GCB_U_MINWIDTH, $_sDelim)
					$GCB_U_MINWIDTH = ($aKeyVal[2] = 'system' ? $GCB_MINWIDTH : $aKeyVal[2])
				Case 'iMinHeight'
					$aKeyVal[2] = $aKeyVal[2] < $GCB_MINHEIGHT ? $GCB_MINHEIGHT : $aKeyVal[2] ; can't be smaller than $GCB_MINHEIGHT
					$sOldValues &= $SF('iMinHeight=%s (%s)%s', $aKeyVal[2], $GCB_U_MINHEIGHT, $_sDelim)
					$GCB_U_MINHEIGHT = ($aKeyVal[2] = 'system' ? $GCB_MINHEIGHT : $aKeyVal[2])
				Case 'iMargin'
					$sOldValues &= $SF('iMargin=%s (%s)%s', $aKeyVal[2], $GCB_U_TEXT_MARGIN, $_sDelim)
					$GCB_U_TEXT_MARGIN = ($aKeyVal[2] = 'system' ? $GCB_TEXT_MARGIN : $aKeyVal[2])
				Case 'RGBTopLeft'
					$sOldValues &= $SF('RGBTopLeft=0x%s (0x%s)%s', Hex($aKeyVal[2],6), Hex($GCB_U_RGB_TOPLEFT,6), $_sDelim)
					$GCB_U_RGB_TOPLEFT = ($aKeyVal[2] = 'system' ? $GCB_RGB_TOPLEFT : $aKeyVal[2])
				Case 'RGBBotRight'
					$sOldValues &= $SF('RGBBotRight=0x%s (0x%s)%s', Hex($aKeyVal[2],6), Hex($GCB_U_RGB_BOTTRIGHT,6), $_sDelim)
					$GCB_U_RGB_BOTTRIGHT = ($aKeyVal[2] = 'system' ? $GCB_RGB_BOTTRIGHT : $aKeyVal[2])
				Case 'BGRTitle'
					$sOldValues &= $SF('BGRTitle=0x%s (0x%s)%s', Hex($aKeyVal[2],6), Hex($GCB_U_BGR_TITLE,6), $_sDelim)
					$GCB_U_BGR_TITLE = ($aKeyVal[2] = 'system' ? $GCB_BGR_TITLE : $aKeyVal[2])
				Case 'BGRText'
					$sOldValues &= $SF('BGRText=0x%s (0x%s)%s', Hex($aKeyVal[2],6), Hex($GCB_U_BGR_TEXT,6), $_sDelim)
					$GCB_U_BGR_TEXT = ($aKeyVal[2] = 'system' ? $GCB_BGR_TEXT : $aKeyVal[2])
				Case 'sScheme'
					Local $sOldScheme = $GCB_U_DEF_COLSCHEME
					$GCB_U_DEF_COLSCHEME = ($aKeyVal[2] = 'system' ? $GCB_DEF_COLSCHEME : $aKeyVal[2])
					Local $iIndex = $giGCB_INDEX_DEFSCHEME                ; store the old default index
					For $n = 0 To UBound($gaGCB_COLORSCHEME) -1           ; search index for new scheme
						If $gaGCB_COLORSCHEME[$n][0] = $GCB_U_DEF_COLSCHEME Then
							$iIndex = $n                                  ; the new default index
							ExitLoop
						EndIf
					Next
					$GCB_U_DEF_COLSCHEME = $gaGCB_COLORSCHEME[$iIndex][0] ; if scheme not found - the old one will used
					$giGCB_INDEX_DEFSCHEME = $iIndex                      ; reset the default scheme index
					$sOldValues &= $SF('sScheme=%s (%s)%s', $GCB_U_DEF_COLSCHEME, $sOldScheme, $_sDelim)
				Case 'bRotate'
					$sOldValues &= $SF('bRotate=%s (%s)%s', $aKeyVal[2], $GCB_U_GRADIENT_L2R, $_sDelim)
					$GCB_U_GRADIENT_L2R = ($aKeyVal[2] = 'system' ? $GCB_GRADIENT_L2R : $aKeyVal[2])
				Case 'iTimeCounter'
					$sOldValues &= $SF('iTimeCounter=%s (%s)%s', $aKeyVal[2], $GCB_U_TIME_COUNTER, $_sDelim)
					$GCB_U_TIME_COUNTER = ($aKeyVal[2] = 'system' ? $GCB_TIME_COUNTER : $aKeyVal[2])
				Case 'iTimeOut'
					$sOldValues &= $SF('iTimeOut=%s (%s)%s', $aKeyVal[2], $GCB_U_TIMEOUT_DEF, $_sDelim)
					$GCB_U_TIMEOUT_DEF = ($aKeyVal[2] = 'system' ? $GCB_TIMEOUT_DEF : $aKeyVal[2])
				Case 'iTimeoutZero'
					$sOldValues &= $SF('iTimeoutZero=%s (%s)%s', $aKeyVal[2], $GCB_U_TIMEOUT_ZERO, $_sDelim)
					$GCB_U_TIMEOUT_ZERO = ($aKeyVal[2] = 'system' ? $GCB_TIMEOUT_ZERO : $aKeyVal[2])
				Case 'iCallback'
					$sOldValues &= $SF('iCallback=%s (%s)%s', $aKeyVal[2], $GCB_U_CALLBACK_INTERVAL, $_sDelim)
					$GCB_U_CALLBACK_INTERVAL = ($aKeyVal[2] = 'system' ? $GCB_CALLBACK_INTERVAL : $aKeyVal[2])
			EndSwitch
		Next
		If $sOldValues <> '' Then
			Return StringTrimRight($sOldValues, StringLen($_sDelim))
		Else
			Return SetError(1,0,'')
		EndIf
	EndIf
EndFunc  ;==>_GuiCtrlBusy_UserDefaults


; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_GetClosed
; Description ...: Creates an dummy control, that will be fired by closing a busy control. With "GuiCtrlRead(dummy)" you get the handle
;                  of the closed control.
; Syntax ........: _GuiCtrlBusy_GetClosed()

; Description ...: Erstellt ein Dummy-Ctrl, das bei Beenden eines Ctrl befeuert wird. Mit "GuiCtrlRead(Dummy)" wird das Ctrl-Handle
;                  des geschlossenen Ctrl ausgelesen.
; Syntax ........: _GuiCtrlBusy_GetClosed()

; Return values .: ID Dummy Ctrl.
; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlBusy_GetClosed()
	If $gGCB_CLOSED_DUMMY = -1 Then $gGCB_CLOSED_DUMMY = GUICtrlCreateDummy()
	Return $gGCB_CLOSED_DUMMY
EndFunc  ;==>_GuiCtrlBusy_GetClosed

; ===============================================================================================================================


#region - internal functions ====================================================================================================
;===================================================================================================
; Function Name....: __CallbackDrawBusy
; Description......: The timer called draw function, re/draw the controls
;===================================================================================================
Func __CallbackDrawBusy($hWnd, $iMsg, $iIDTimer, $iTime)
    #forceref $hWnd, $iMsg, $iIDTimer, $iTime
	If $gbCALLBACK_LOCKED Then Return    ; don't run callback if ctrl array is accessed
	; stored Param:
    ; hWnd, sTitle, sIcoFile, iIcoID, sTxt, iTxtSize, iTxtStyle, sTxtFont, iFontHeight, iAlign, iWidth, iHeight, iX, iY, iTimeOut, iTimeCnt, BGRTitle, BGRTxt
    ; RGBTL, RGBBR, aVertex, bRotate, iLenTitle, iTxtTop, iTxtBott, bPosNew, bBreak, bRecalc, bRedraw, iDiffSecLast, iTimestamp, iCBFrq, bNoReCalc, iIDTimer, bNewStamp

	Local $idxCtrl = __ManageCtrl($hWnd)
	If @error Then Return

	Local $iTimeStamp = $gaGCB_CTRL[$idxCtrl][$__giTimestamp]

	; first time to draw - show ctrl, set time stamp
	If $iTimeStamp = 0 Then
		$gaGCB_CTRL[$idxCtrl][$__giTimestamp] = $iTime
		GUISetState(@SW_SHOW, $hWnd)
	EndIf

	; if new timeout set
	If $gaGCB_CTRL[$idxCtrl][$__gbNewStamp] Then
		$gaGCB_CTRL[$idxCtrl][$__gbNewStamp] = False
		$gaGCB_CTRL[$idxCtrl][$__giTimestamp] = $iTime
	EndIf


	; brake by script OR timeout/safety timeout ended
	If $gaGCB_CTRL[$idxCtrl][$__gbBreak] Or _
	   $iTime - $gaGCB_CTRL[$idxCtrl][$__giTimestamp] >= ($gaGCB_CTRL[$idxCtrl][$__giTimeOut] = 0 ? $GCB_U_TIMEOUT_ZERO : $gaGCB_CTRL[$idxCtrl][$__giTimeOut])*1000 Then
		_Timer_KillTimer($hWnd, $iIDTimer)
		__ManageCtrl($hWnd, 'del')
		GUIDelete($hWnd)
		; send message, that the control has closed (not working while used _GuiCtrlBusy_Close(-1) to kill all)
		If $gGCB_CLOSED_DUMMY <> -1 Then GUICtrlSendToDummy($gGCB_CLOSED_DUMMY, $hWnd)
		Return
	EndIf

	Local $iDiffSec = Int(($iTime-$gaGCB_CTRL[$idxCtrl][$__giTimestamp])/1000)

	; check ctrl position (once a second or on every callback, if this value is higher) - may be changed by user with mouse drag --> only, if none new position should be set
	If ($iDiffSec - $gaGCB_CTRL[$idxCtrl][$__giDiffSecLast] >= 1) And (Not $gaGCB_CTRL[$idxCtrl][$__gbPosNew]) Then
		Local $aPos = WinGetPos($hWnd)
		$gaGCB_CTRL[$idxCtrl][$__giX] = $aPos[0]
		$gaGCB_CTRL[$idxCtrl][$__giY] = $aPos[1]
	EndIf

	; set new position
	If $gaGCB_CTRL[$idxCtrl][$__gbPosNew] Then
		$gaGCB_CTRL[$idxCtrl][$__gbPosNew] = False
		WinMove($hWnd, '', $gaGCB_CTRL[$idxCtrl][$__giX], $gaGCB_CTRL[$idxCtrl][$__giY])
	EndIf

	Local $bRedraw = False

	; check for redraw
	If $iTimeStamp = 0 Then   ; 1st draw
		$bRedraw = True
	Else
		; some changes in title line or text
		If ($iDiffSec <> $gaGCB_CTRL[$idxCtrl][$__giDiffSecLast]) Or $gaGCB_CTRL[$idxCtrl][$__gbRedraw] Then
		    $bRedraw = True
		EndIf
	EndIf
	$gaGCB_CTRL[$idxCtrl][$__giDiffSecLast] = $iDiffSec
	If Not $bRedraw Then Return  ; none redraw required

	; check for icon setting
	Local $sIcoFile = $gaGCB_CTRL[$idxCtrl][$__gsIcoFile]
	Local $bIcon = $sIcoFile = Null ? False : True

	; Draw Title (& Countdown/Time) & Line & Text
	Local Static $iHeigthTitleFont
	; re/calculation of control size   (if title or text is changed)
	; but with "$gaGCB_CTRL[$idxCtrl][$__gbNoReCalc] = True" the user can avoid recalculation. Usefull, if text changes has none or minimal effect for text length.
	If $gaGCB_CTRL[$idxCtrl][$__gbRecalc] Then
		$gaGCB_CTRL[$idxCtrl][$__gbRecalc] = False
		If Not $gaGCB_CTRL[$idxCtrl][$__gbNoReCalc] Then
			__CalcControlSize($bIcon, $gaGCB_CTRL[$idxCtrl][$__giTimeCnt],  $gaGCB_CTRL[$idxCtrl][$__giLenTime], $gaGCB_CTRL[$idxCtrl][$__gsTitle],      $gaGCB_CTRL[$idxCtrl][$__gsTxt], _
									  $gaGCB_CTRL[$idxCtrl][$__giLenTitle], $iHeigthTitleFont,                   $gaGCB_CTRL[$idxCtrl][$__giWidth],      $gaGCB_CTRL[$idxCtrl][$__giHeight], _
									  $gaGCB_CTRL[$idxCtrl][$__giTxtTop],   $gaGCB_CTRL[$idxCtrl][$__giTxtBott], $gaGCB_CTRL[$idxCtrl][$__giFontHeight], $gaGCB_CTRL[$idxCtrl][$__giTxtSize], _
									  $gaGCB_CTRL[$idxCtrl][$__giTxtStyle], $gaGCB_CTRL[$idxCtrl][$__gsTxtFont])
			Local $aVertexTmp[2][3] = [ _
				  [0, 0, $gaGCB_CTRL[$idxCtrl][$__gRGBTL]], _
				  [$gaGCB_CTRL[$idxCtrl][$__giWidth], $gaGCB_CTRL[$idxCtrl][$__giHeight], $gaGCB_CTRL[$idxCtrl][$__gRGBBR]]]
			$gaGCB_CTRL[$idxCtrl][$__gaVertex] = $aVertexTmp
			WinMove($gaGCB_CTRL[$idxCtrl][$__ghHWnd], '', $gaGCB_CTRL[$idxCtrl][$__giX], $gaGCB_CTRL[$idxCtrl][$__giY], $gaGCB_CTRL[$idxCtrl][$__giWidth], $gaGCB_CTRL[$idxCtrl][$__giHeight])
		EndIf
	EndIf

	Local $hRgn = _WinAPI_CreateRoundRectRgn(0, 0, $gaGCB_CTRL[$idxCtrl][$__giWidth], $gaGCB_CTRL[$idxCtrl][$__giHeight], 12, 12)
	_WinAPI_SetWindowRgn($hWnd, $hRgn)

	; Create gradient
	Local $hDC = _WinAPI_GetDC($hWnd)
	Local $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $gaGCB_CTRL[$idxCtrl][$__giWidth], $gaGCB_CTRL[$idxCtrl][$__giHeight])
	Local $hDestDC = _WinAPI_CreateCompatibleDC($hDC)
	Local $hDestSv = _WinAPI_SelectObject($hDestDC, $hBitmap)
	_WinAPI_GradientFill($hDestDC, $gaGCB_CTRL[$idxCtrl][$__gaVertex], 0, -1, $gaGCB_CTRL[$idxCtrl][$__gbRotate])

	; draw Icon if icon file exists
	Local $hIcon = Null, $bDLL = False
	If $bIcon Then
		$sIcoFile = $sIcoFile = 'shell32' ? 'shell32.dll' : $sIcoFile
		Switch StringRight($sIcoFile, 3)
			Case 'dll'
				$hIcon = __WinAPI_IconFromDll($sIcoFile, $gaGCB_CTRL[$idxCtrl][$__giIcoID])
				$bDLL = True
			Case 'ico'
				$hIcon = _WinAPI_LoadImage(0, $sIcoFile, $IMAGE_ICON, 24, 24, $LR_LOADFROMFILE)
		EndSwitch
		If $hIcon <> 0 Then
			_WinAPI_DrawIconEx($hDestDC, 5, 3, $hIcon, 24, 24)
		Else
			$bIcon = False
		EndIf
	EndIf

	; Title  (size [11], style [bold] and font [Microsoft Sans Serif] are fix)
	Local $hFontTitle = _WinAPI_CreateFont($iHeigthTitleFont, 0, 0, 0, 600, False, False, False, $DEFAULT_CHARSET, _
			$OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, 'Microsoft Sans Serif')
	_WinAPI_SelectObject($hDestDC, $hFontTitle)
	_WinAPI_SetTextColor($hDestDC, $gaGCB_CTRL[$idxCtrl][$__gBGRTitle])
	_WinAPI_SetBkMode($hDestDC, $TRANSPARENT)
	Local $tRECT = DllStructCreate($tagRect)
	Local $iIconMargin = 34  ; 5px +[Icon 24px] +5px
	DllStructSetData($tRECT, "Left", ($bIcon ? $iIconMargin : $GCB_U_TEXT_MARGIN))
	DllStructSetData($tRECT, "Top", 5)
	DllStructSetData($tRECT, "Right", $gaGCB_CTRL[$idxCtrl][$__giLenTitle] +$iIconMargin)
	DllStructSetData($tRECT, "Bottom", 30)
	_WinAPI_DrawText($hDestDC, $gaGCB_CTRL[$idxCtrl][$__gsTitle], $tRECT, BitOR($DT_VCENTER,$DT_LEFT,$DT_SINGLELINE))

	; Countdown / Time  (size [11], style [bold] and font [Microsoft Sans Serif] are fix)
	Local $sCounterTime = ''
	If $gaGCB_CTRL[$idxCtrl][$__giTimeCnt] = 1 And $gaGCB_CTRL[$idxCtrl][$__giTimeOut] > 0 Then ; show countdown (needs timeout > 0)
		$sCounterTime = __FormatSeconds($gaGCB_CTRL[$idxCtrl][$__giTimeOut]-$iDiffSec)
	ElseIf $gaGCB_CTRL[$idxCtrl][$__giTimeCnt] = 2 Then                   ; show time
		$sCounterTime = StringFormat('%02d:%02d:%02d', @HOUR, @MIN, @SEC)
	EndIf
	If $sCounterTime <> '' Then
		$tRECT = DllStructCreate($tagRect)
		DllStructSetData($tRECT, "Left", ($gaGCB_CTRL[$idxCtrl][$__giWidth]-($gaGCB_CTRL[$idxCtrl][$__giLenTime] + $GCB_U_TEXT_MARGIN)))   ; to show "2 d / 23:59:59 h"
		DllStructSetData($tRECT, "Top", 5)
		DllStructSetData($tRECT, "Right", ($gaGCB_CTRL[$idxCtrl][$__giWidth]-$GCB_U_TEXT_MARGIN))
		DllStructSetData($tRECT, "Bottom", 30)
		_WinAPI_DrawText($hDestDC, $sCounterTime, $tRECT, BitOR($DT_VCENTER,$DT_RIGHT,$DT_SINGLELINE))
	EndIf

	; Separating Line
	Local $hPen = _WinAPI_CreatePen($PS_SOLID, 1, $gaGCB_CTRL[$idxCtrl][$__gBGRTitle])
	_WinAPI_SelectObject($hDestDC, $hPen)
	_WinAPI_DrawLine($hDestDC, 3, 30, ($gaGCB_CTRL[$idxCtrl][$__giWidth]-6), 30)

	; Text   (alignement, size, style and font can be set by user)
	Local $iFontHeight = $gaGCB_CTRL[$idxCtrl][$__giFontHeight]
	Local $iStyle = $gaGCB_CTRL[$idxCtrl][$__giTxtStyle]       ; 0 / 1 / 2 / 4 / 8 = Normal weight / Bold / Italic / Underline / Strikethrough
	Local $iWeigth = BitAND($iStyle,1) ? 600 : 400
	Local $bItalic = BitAND($iStyle,2) ? True : False
	Local $bUnderline = BitAND($iStyle,4) ? True : False
	Local $bStrikethru = BitAND($iStyle,8) ? True : False
	Local $hFontText = _WinAPI_CreateFont($iFontHeight, 0, 0, 0, $iWeigth, $bItalic, $bUnderline, $bStrikethru, $DEFAULT_CHARSET, _
			$OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, $DEFAULT_PITCH, $gaGCB_CTRL[$idxCtrl][$__gsTxtFont])
	_WinAPI_SelectObject($hDestDC, $hFontText)
	_WinAPI_SetTextColor($hDestDC, $gaGCB_CTRL[$idxCtrl][$__gBGRTxt])
	$tRECT = DllStructCreate($tagRect)
	DllStructSetData($tRECT, "Left", $GCB_U_TEXT_MARGIN)
	DllStructSetData($tRECT, "Top", ($gaGCB_CTRL[$idxCtrl][$__giTxtTop]))
	DllStructSetData($tRECT, "Right", ($gaGCB_CTRL[$idxCtrl][$__giWidth] -$GCB_U_TEXT_MARGIN))
	DllStructSetData($tRECT, "Bottom", ($gaGCB_CTRL[$idxCtrl][$__giTxtBott]))
	Local $sText = StringRegExpReplace($gaGCB_CTRL[$idxCtrl][$__gsTxt], '\\n|\r\n|[\r\n]', @CRLF)
	Local $iReplaces = @extended
	Local $iAlign = $gaGCB_CTRL[$idxCtrl][$__giAlign] = 0 ? $DT_LEFT : ($gaGCB_CTRL[$idxCtrl][$__giAlign] = 1 ? $DT_RIGHT : $DT_CENTER)
	Local $iFlag = BitOR($DT_VCENTER, $iAlign, ($iReplaces = 0 ? $DT_SINGLELINE : $DT_WORDBREAK))
	If StringInStr($sText, '%C%') And $gaGCB_CTRL[$idxCtrl][$__giTimeOut] > 0 Then $sText = StringReplace($sText, '%C%', __FormatSeconds($gaGCB_CTRL[$idxCtrl][$__giTimeOut]-$iDiffSec))
 	_WinAPI_DrawText($hDestDC, $sText, $tRECT, $iFlag)

	_WinAPI_BitBlt($hDC, 0, 0, $gaGCB_CTRL[$idxCtrl][$__giWidth], $gaGCB_CTRL[$idxCtrl][$__giHeight], $hDestDC, 0, 0, $SRCCOPY)

	; clear ressources
	If $bIcon Then
		If $bDLL Then
			_WinAPI_DestroyIcon($hIcon)
		Else
			_WinAPI_DeleteObject($hIcon)
		EndIf
	EndIf
	_WinAPI_DeleteObject($hFontTitle)
	_WinAPI_DeleteObject($hFontText)
	_WinAPI_DeleteObject($hPen)
	_WinAPI_DeleteObject($hBitmap)
	_WinAPI_DeleteDC($hDestDC)
	_WinAPI_ReleaseDC($hWnd, $hDC)
	_WinAPI_DeleteObject($hRgn)

	$gaGCB_CTRL[$idxCtrl][$__gbRedraw] = False

	; set timer intervall
	If $iTimeStamp = 0 Then                                         ; first call - default value
		Local $iNewTimer = _Timer_SetTimer($hWnd, $GCB_U_CALLBACK_INTERVAL, '', $iIDTimer)
		_Timer_KillTimer($hWnd, $gaGCB_CTRL[$idxCtrl][$__giIDTimer])                  ; replace the "0"-time timer (from creation)
		$gaGCB_CTRL[$idxCtrl][$__giIDTimer] = $iNewTimer
	ElseIf $gaGCB_CTRL[$idxCtrl][$__giCBInter] <> Null Then  ; check for new frequency to set
		_Timer_SetTimer($hWnd, $gaGCB_CTRL[$idxCtrl][$__giCBInter], '', $iIDTimer)
		$gaGCB_CTRL[$idxCtrl][$__giCBInter] = Null
	EndIf
EndFunc  ;==>__CallbackDrawBusy


;===================================================================================================
; Function Name....: __CalcControlSize
; Description......: Calculates title and text dimensions
;===================================================================================================
Func __CalcControlSize($_bIcon, $_iTimeCount, ByRef $_iLenTime, $_sTitle, $_sText, ByRef $_iLenTitle, ByRef $_iHeigthTitleFont, ByRef $_iWidth, ByRef $_iHeight, _
	                   ByRef $_iTxtTop, ByRef $_iTxtBott, ByRef $_iFontHeight, $_iTxtSize, $_iTxtStyle, $_sTxtFont)
	$_sText = StringRegExpReplace($_sText, '\\n|\r\n|[\r\n]', @CRLF)
	Local $iLineBreak = @extended
	Local $aTitleSize = __GetTextMeasure($_sTitle, 11, 1)
	$_iLenTitle = $aTitleSize[0]
	$_iHeigthTitleFont = $aTitleSize[2]
	Local $aTextSize = __GetTextMeasure($_sText, $_iTxtSize, $_iTxtStyle, $_sTxtFont)
	$_iFontHeight = $aTextSize[2]
	Local $iHeightText = $aTextSize[1]
	Local $iLenText = $aTextSize[0]
	Local $iMargin = $GCB_U_TEXT_MARGIN < $GCB_TEXT_MARGIN ? $GCB_TEXT_MARGIN : $GCB_U_TEXT_MARGIN
	$_iLenTime = ($_iTimeCount = 0 ? 0 : ($_iTimeCount = 1 ? 125 : 70))
	Local $iSpace = $_iTimeCount = 0 ? 0 : 10
	If $_bIcon Then
		; Title line: 5px [Icon 24px] 5px [TITLE:$iLenTitle] [10px COUNTER/TIME:$_iLenTime] $iMargin
		$_iWidth = 5 +24 +5 + ( ($_iLenTitle +$iSpace +$_iLenTime +(34-$iMargin)) > $iLenText ? ($_iLenTitle +$iSpace +$_iLenTime +(34-$iMargin)) : $iLenText ) + $iMargin
	Else
		; Title line: $iMargin [TITLE:$iLenTitle] [10px COUNTER/TIME:$_iLenTime] $iMargin
		$_iWidth = $iMargin + ( ($_iLenTitle +$iSpace +$_iLenTime) > $iLenText ? ($_iLenTitle +$iSpace +$_iLenTime) : $iLenText ) + $iMargin
	EndIf
	; Text:  $iMargin [TEXT:$iLenText] $iMargin

	If $_iWidth < $GCB_U_MINWIDTH Then $_iWidth = $GCB_U_MINWIDTH
	$_iHeight = $GCB_U_MINHEIGHT
	$_iTxtTop = 31
	Local $iRefBott = 120
	$_iTxtBott = $iRefBott
	If $iLineBreak > 0 Then
		$_iTxtTop += $GCB_U_TEXT_MARGIN
		$_iTxtBott = $_iTxtTop + $iHeightText +$GCB_U_TEXT_MARGIN
		If $_iTxtBott < $iRefBott Then
			$_iTxtTop += ($iRefBott-$_iTxtBott)/2
			$_iTxtBott = $iRefBott
		Else
			$_iHeight += ($_iTxtBott-$iRefBott)
		EndIf
	EndIf
EndFunc  ;==>__CalcControlSize


;===================================================================================================
; Function Name....: __GetTextMeasure
; Description......: Calculates height and width for a textstring with given size, style and font
;===================================================================================================
Func __GetTextMeasure($_sText, $_iTxtSize, $_iTxtStyle=0, $_sTxtFont='Microsoft Sans Serif')
	Local Static $hGUI = GUICreate("", 800, 300), $iSetState = GUISetState(@SW_HIDE, $hGUI)
;~ 	_GDIPlus_Startup()
    Local $hFormat     = _GDIPlus_StringFormatCreate(0)
    Local $hFamily     = _GDIPlus_FontFamilyCreate($_sTxtFont)
    Local $hFont       = _GDIPlus_FontCreate($hFamily, $_iTxtSize, $_iTxtStyle, 3)
    Local $tLayout     = _GDIPlus_RectFCreate(0, 0, 0, 0)
	Local $hGraphic    = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    Local $aInfo       = _GDIPlus_GraphicsMeasureString($hGraphic, $_sText, $hFont, $tLayout, $hFormat)
	Local $iFontHeight = _GDIPlus_FontGetHeight($hFont, $hGraphic)
	_GDIPlus_StringFormatDispose($hFormat)
    _GDIPlus_FontDispose($hFont)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_GraphicsDispose($hGraphic)
;~     _GDIPlus_ShutDown()
;~ 	GUIDelete($hGUI)
	Local $aOut[3] = [Ceiling(DllStructGetData($aInfo[0], "Width")), _
	                  Ceiling(DllStructGetData($aInfo[0], "Height")), $iFontHeight] ;  ['width', 'height', 'font height']
	Return $aOut
EndFunc  ;==>__GetTextMeasure


;===================================================================================================
; Function Name....: __FormatSeconds
; Description......: Formats a count of seconds as string: "ss", "mm:ss", "hh:mm:ss", "d / hh:mm:ss"
;===================================================================================================
Func __FormatSeconds($_sec)
	Return ( $_sec < 60 ? StringFormat('%02u', $_sec) : _
             $_sec < 60*60 ? StringFormat('%02u', Floor($_sec/60)) & ':' & _
			        StringFormat('%02u', Mod($_sec,60)) : _
			 $_sec < 60*60*24 ? StringFormat('%02u', Floor($_sec/3600)) & ':' & _
                    StringFormat('%02u', Floor(Mod($_sec,3600)/60)) & ':' & _
                    StringFormat('%02u', Mod(Mod($_sec,3600),60)) : _
			 ( $_sec = 86400 ? "24:00:00" : Floor($_sec/86400) & ' d / ' & _
					StringFormat('%02u', Floor(Mod($_sec,86400)/3600)) & ':' & _
					StringFormat('%02u', Floor(Mod(Mod($_sec,86400),3600)/60)) & ':' & _
					StringFormat('%02u', Mod(Mod(Mod($_sec,86400),3600),60)) & ' h') )
EndFunc  ;==>__FormatSeconds


;===================================================================================================
; Function Name....: __OnExit
; Description......: Closes all ctrl, clear ressources
;===================================================================================================
Func __OnExit()
	_GuiCtrlBusy_Close()
	_GDIPlus_Shutdown()
	FileDelete($__sPathIcon)
EndFunc  ;==>__OnExit


;===================================================================================================
; Function Name....: __ManageCtrl
; Description......: Creates/deletes controls, get the ctrl index from management array
;                    $_aParam[31] = ['',sTitle,sIcoFile,sIcoName...like Global Enum index]
;                                   none used params has value "Null"
;===================================================================================================
Func __ManageCtrl($_hWnd=-1, $_sAction='get', $_aParam='')  ; with $_hWnd=Null --> new Ctrl
	Local $iIndex = -1
	If $gaGCB_CTRL[0][0] > 0 And $_hWnd <> Null Then  ; -1 or handle to kill all/one ctrl
		For $i = 1 To $gaGCB_CTRL[0][0]
			If $_hWnd <> -1 Then
				If $gaGCB_CTRL[$i][0] = $_hWnd Then
					$iIndex = $i
					ExitLoop
				EndIf
			Else
				_Timer_KillAllTimers($gaGCB_CTRL[$i][0])
				GUIDelete($gaGCB_CTRL[$i][0])
			EndIf
		Next
	EndIf

	Switch $_sAction
		Case 'del' ; deletes the ctrl from array
			$gbCALLBACK_LOCKED = True
			If $gaGCB_CTRL[0][0] > 0 Then
				For $i = 0 To $__iUbCtrl -1    ; copy the last ctrl to index of ctrl to delete
					$gaGCB_CTRL[$iIndex][$i] = $gaGCB_CTRL[$gaGCB_CTRL[0][0]][$i]
				Next
			EndIf
			$gaGCB_CTRL[0][0] -= 1
			ReDim $gaGCB_CTRL[$gaGCB_CTRL[0][0]+1][$__iUbCtrl]  ; trim the last item from array
			$gbCALLBACK_LOCKED = False

		Case 'get' ; returnes the array index of this ctrl
			If $iIndex = -1 Then Return SetError(1,0,0)
			Return $iIndex

		Case 'set' ; creates new ctrl /sets values
			$gbCALLBACK_LOCKED = True
			If $iIndex = -1 Then ; new Ctrl
				$gaGCB_CTRL[0][0] += 1
				ReDim $gaGCB_CTRL[$gaGCB_CTRL[0][0]+1][$__iUbCtrl]
				$_hWnd = GUICreate($GCB_U_TITLE_DEF, $GCB_U_MINWIDTH, $GCB_U_MINHEIGHT, -1, -1, $WS_POPUP, $WS_EX_CONTROLPARENT)
				GUISetIcon($__sPathIcon, Default, $_hWnd)

				; set values (defaults or from param array)
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__ghHWnd]         = $_hWnd
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__gsTitle]        = __Or($_aParam[$__gsTitle],       $GCB_U_TITLE_DEF)
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__gsIcoFile]      = __Or($_aParam[$__gsIcoFile],     Null)
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__giIcoID]        = __Or($_aParam[$__giIcoID],       Null)
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__gsTxt]          = __Or($_aParam[$__gsTxt],         $GCB_U_TEXT_DEF)
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__giTxtSize]      = __Or($_aParam[$__giTxtSize],     $GCB_U_TEXTSIZE)
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__giTxtStyle]     = __Or($_aParam[$__giTxtStyle],    $GCB_U_TEXTSTYLE)  ;  0 / 1 / 2 / 4 / 8 = Normal weight / Bold / Italic / Underline / Strikethrough
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__gsTxtFont]      = __Or($_aParam[$__gsTxtFont],     $GCB_U_TEXTFONT)
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__giAlign]        = __Or($_aParam[$__giAlign],       2)     ;  0 / 1 / 2 = left / right / center
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__giWidth]        = __Or($_aParam[$__giWidth],       $GCB_U_MINWIDTH)
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__giHeight]       = __Or($_aParam[$__giHeight],      $GCB_U_MINHEIGHT)
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__giX]            = __Or($_aParam[$__giX],           Int(@DesktopWidth/2 - $GCB_U_MINWIDTH/2))
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__giY]            = __Or($_aParam[$__giY],           Int(@DesktopHeight/2 - $GCB_U_MINHEIGHT/2))
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__giTimeOut]      = __Or($_aParam[$__giTimeOut],     $GCB_U_TIMEOUT_DEF)
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__giTimeCnt]      = __Or($_aParam[$__giTimeCnt],     $GCB_U_TIME_COUNTER)
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__gBGRTitle]      = __Or($_aParam[$__gBGRTitle],     $GCB_U_BGR_TITLE)
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__gBGRTxt]        = __Or($_aParam[$__gBGRTxt],       $GCB_U_BGR_TEXT)
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__gRGBTL]         = __Or($_aParam[$__gRGBTL],        $GCB_U_RGB_TOPLEFT)
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__gRGBBR]         = __Or($_aParam[$__gRGBBR],        $GCB_U_RGB_BOTTRIGHT)
				Local $aVertexTmp[2][3] = [[0, 0, $gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__gRGBTL]], [$GCB_U_MINWIDTH, $GCB_U_MINHEIGHT, $gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__gRGBBR]]]
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__gaVertex]       = __Or($_aParam[$__gaVertex],      $aVertexTmp)
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__gbRotate]       = __Or($_aParam[$__gbRotate],      $GCB_U_GRADIENT_L2R)
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__giLenTitle]     = __Or($_aParam[$__giLenTitle],    0)
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__giTxtTop]       = __Or($_aParam[$__giTxtTop],      0)
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__giTxtBott]      = __Or($_aParam[$__giTxtBott],     0)
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__gbPosNew]       = __Or($_aParam[$__gbPosNew],      True)
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__gbBreak]        = __Or($_aParam[$__gbBreak],       False)
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__gbRecalc]       = __Or($_aParam[$__gbRecalc],      True)
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__gbRedraw]       = __Or($_aParam[$__gbRedraw],      True)
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__giDiffSecLast]  = __Or($_aParam[$__giDiffSecLast], 0)
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__giTimestamp]    = __Or($_aParam[$__giTimestamp],   0)
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__giCBInter]      = Null
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__gbNoReCalc]     = False
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__giIDTimer]      = _Timer_SetTimer($_hWnd, 0, '__CallbackDrawBusy')
				$gaGCB_CTRL[$gaGCB_CTRL[0][0]][$__gbNewStamp]     = False

				$gbCALLBACK_LOCKED = False
				Return $_hWnd
			Else
				For $i = 1 To $__iUbCtrl -1
					If $_aParam[$i] <> Null Then $gaGCB_CTRL[$iIndex][$i] = $_aParam[$i]
				Next
				$gbCALLBACK_LOCKED = False
			EndIf
	EndSwitch
EndFunc  ;==>__ManageCtrl


;===================================================================================================
; Function Name....: __WinAPI_IconFromDll
; Description......: Returns the handle of selected icon
;===================================================================================================
Func __WinAPI_IconFromDll($_sDll, $_iIconID)
	Local $tIcons = DllStructCreate("ptr Data")
	Local $iIcons = _WinAPI_ExtractIconEx($_sDll, $_iIconID, 0, $tIcons, 1)
	If @error Then Return SetError(@error, @extended, 0)
	If $iIcons <= 0 Then Return SetError(10, 0, 0)
	Return DllStructGetData($tIcons, "Data")
EndFunc  ;==>__WinAPI_IconFromDll


;===================================================================================================
; Function Name....: __Or
; Description......: Returns the given value or if this is "Null", the default value
;===================================================================================================
Func __Or($_value, $_default)
	Return ($_value <> Null ? $_value : $_default)
EndFunc  ;==>__Or



;===================================================================================================
; Function Name....: __IconCreate
; Description......: Creates the GuiControlBusy-Icon as tmp-file
;===================================================================================================
Func __IconCreate()
	Local $bData
	$bData &= "0x0000010004002020000001002000A8100000460000002020000001000800A8080000EE10000010100000010020006804000096190000101000000100080068050000FE1D000028000000200000004000000001002000000000000020000000000000000000000000000000000000000000120000001B0000002E00000040000000520000005D00000061000000630000006300000063000000630000006300000063000000630000006300000063000000630000006300000063000000630000006300000063000000630000006300000063000000610000005D00000052000000400000002E0000001B000000120000001B1105002B1E06034C250705662B08067A2D0907862C0907892A09058A2A07058A2A07058A2A07058A2A07058A2A07058A2A07058A2A07058A2807058A2807058A2807058A2A07058A2A07058A2A07058A2A07058A2A07058A2A07058A2A07058A2A0705892B0705862906047A230505661A03034C1100002B0000001B0000002E1E06034C34090787400B0AB14F0F0CCA56100DD754100CD853100CD851100BD851100BD850100BD850100BD850100BD850100BD850100BD850100BD84F100BD8500F0BD8510F0BD8510F0BD8510F0AD8510E0AD8510E0AD8510C0AD8510C0AD8500C0AD8500D09D74A0C0ACA3C0808B12F0705871A03034C0000002E0000004028070566450E0BB152120DE15F130FF5661611FF651711FF631611FF601610FF5F1610FF5E1610FF5E1610FF5E1610FF5E1610FF5E1610FF5E1510FF5D1510FF5D140FFF5E140FFF5F130FFF5F130FFF60130FFF60130FFF60120EFF60120EFF5F110EFF5F110DFF590F0CF54D0C0BE13F0B08B1230505660000004000000052300A087A591510CA671812F56E1B15FC711D16FF6F1D16FF6C1D15FF681C14FF651C14FF641C14FF641C14FF651D14FF661D14FF651C14FF651B14FF641B14FF641A13FF651A13FF661913FF661913FF671913FF681813FF691812FF691711FF691611FF691611FF651410FC5D110DF5500F0CCA2D08067A000000520000005D350D0986631A12D7741F17FF7A231AFF7C251CFF79251CFF7C2F26FF84423AFF874B43FF854941FF84473FFF84473DFF84463CFF83453CFF82433BFF814139FF7E3C34FF7A352CFF762E26FF742920FF72241CFF712019FF711E17FF721E16FF731D16FF731C15FF701A14FF691711FF5B120ED72F0907860000005D0000006137100B896A1E16D87C261CFF852C20FF872F22FF842F22FF944D42FFB68882FFC4A39EFFBF9D97FFBC9891FFBC948DFFBA928AFFB99088FFB68D85FFB38881FFAB7B73FF9D645BFF915248FF884238FF81352BFF7C2B21FF7B261CFF7C261CFF7E251CFF7F251BFF7A2119FF701C15FF5E1610D8320B098900000061000000633B120C8A712319D8842C20FF8C3324FF90392AFF913F30FFA6665AFFD0ADA7FFE4D0CCFFE3CEC9FFE1CCC6FFE0C8C2FFDFC5BFFFDDC4BDFFDBC0B9FFD7BAB3FFCDACA4FFBE948CFFB28279FFAA746BFFA0645AFF955146FF8D4135FF873428FF852C21FF862B20FF81271DFF772118FF641914D8330C098A00000063000000633E160E8A782A1DD88A3223FF903727FF974333FF9F5647FFB47B6FFFD4B1A9FFE8D2CCFFEFDED7FFF2E3DCFFF2E1DBFFF1E0DAFFF1E1DBFFEFDED8FFEBD8D2FFE5CFC9FFDDC5BEFFDABFB9FFDABFBAFFD0B0A9FFBD9087FFA86D62FF934739FF883324FF893023FF852C20FF7D261CFF6B1E16D837100B8A00000063000000634218108A7E2F21D8913928FF963F2EFFA25444FFB4776BFFC89C92FFDEC1B9FFEEDAD4FFF7E9E3FFFBF0EAFFFBF0EAFFFBF0EBFFFCF1ECFFFAEFEAFFF7EAE5FFF4E6E1FFF1E2DDFFF1E3DEFFF5E9E5FFEDDCD8FFDABEB8FFC49A90FFAB6F62FF9A5142FF913E30FF8A3224FF842C20FF722419D83B120C8A0000006300000063441B128A833523D898402EFF9E4A39FFB06B5DFFCEA39AFFE2C9C3FFEEDCD8FFF6E9E5FFFAF0EBFFFCF3EEFFFCF3EFFFFCF4EFFFFCF4F0FFFCF3F0FFFBF1EEFFF9EFEBFFF8EDE9FFF8EDE9FFFAF0EDFFF6EAE7FFECDBD7FFE0C7C0FFCFACA3FFBA867BFF9F5546FF8F3929FF8A3324FF782A1DD83E160E8A0000006300000063481F148A8B3C29D8A14C38FFA95E4CFFBF8579FFE0C3BDFFF3E6E3FFF8EEEBFFFBF3F1FFFCF6F3FFFDF7F4FFFDF8F5FFFDF8F5FFFDF8F5FFFDF8F5FFFDF7F5FFFDF6F4FFFCF5F2FFFCF5F2FFFDF6F4FFFBF4F1FFF7EEEBFFF1E4E0FFE8D6D1FFD3B0A8FFB07265FF9B4C3CFF933D2DFF7E3021D84219108A00000063000000634D23188A93442FD8AD5C46FFBA7969FFCFA398FFEBD8D3FFFAF4F2FFFCF7F4FFFDF9F7FFFEFBFAFFFEFCFBFFFEFCFBFFFEFCFBFFFEFCFBFFFEFCFBFFFEFCFBFFFEFBFAFFFDFAF9FFFDFAF9FFFEFBFAFFFDFAF9FFFBF5F3FFF8F2EFFFF6EEECFFE5D0CBFFC5968BFFAD6A5BFF9D4D3BFF843724D8441B128A000000630000006351281B8A9A4B33D8B76851FFC68C7DFFD9B5ACFFF0E2DEFFFCF9F7FFFDFAF9FFFEFCFBFFFEFEFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFFFEFDFDFFFEFDFDFFFEFEFEFFFEFDFDFFFDFBF9FFFDFAF9FFFDFCFBFFF0E3E0FFD5B2A9FFBD8475FFA75A46FF8A3D29D8481F148A0000006300000063532A1D8AA15238D8BE7158FFCD9787FFDDBDB4FFF0E1DDFFFAF5F4FFFCF9F8FFFEFCFCFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFDFDFFFEFDFDFFFE"
	$bData &= "FEFDFFF4EBE8FFE1C5BDFFCA988BFFB06450FF90422CD84B21168A0000006300000063582E1F8AA7593ED8C57A5FFFD3A191FFE2C4BBFFF0E1DDFFF9F3F2FFFCF9F9FFFEFDFDFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFDFDFFFDFBFAFFF5EBE8FFE7CEC7FFD2A496FFB76C57FF954631D84D24198A00000063000000635A33238AAE6143D8CC8266FFD9AA99FFE6CAC2FFF1E3DFFFF9F3F1FFFCFAFAFFFEFEFEFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFAFFF9F3F1FFF2E3DFFFE7CCC4FFD5A698FFBB715BFF9A4B35D84F261B8A00000063000000635E35268AB46749D8D2896BFFDEB09DFFE9CEC5FFF3E5E1FFF9F4F2FFFDFBFAFFFEFEFEFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFAF9FFF7F0EDFFF2E3DFFFEBD4CDFFDBB1A4FFC27963FFA0523BD8532A1D8A00000063000000636039288AB96D4DD8D78E6FFFE2B29DFFECCFC4FFF5E8E3FFFBF6F5FFFDFBFAFFFEFDFDFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFAF9FFF8F1EFFFF5EAE7FFF4E6E2FFE6C5BAFFCB866FFFA75A40D8562E218A0000006300000063613B2A8ABC7251D8D9906EFFE2AB92FFEBC6B5FFF4E1D8FFFAF1EEFFFCF8F6FFFEFCFBFFFEFEFDFFFFFEFEFFFFFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFAF9FFF8F1EEFFF6EAE5FFF4E5DFFFE8C6B9FFD08B73FFAD6046D85A33248A0000006300000063633E2C8AC07754D8DB8E69FFDF9C7BFFE6B298FFF0D0C0FFF7E5DDFFFBF2EEFFFDFAF8FFFEFDFBFFFFFEFDFFFFFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF9F8FFF8EFEBFFF3E2DAFFEDD1C5FFE2B4A1FFD0896EFFB1654BD85C35268A000000630000006365402C8AC27A58D8DD8D66FFDE926CFFE3A180FFEBBBA3FFF2D2C1FFF7E5DBFFFBF2EDFFFDFAF8FFFFFEFDFFFFFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF8F6FFF7EAE4FFEFD5CAFFE5BAA7FFDB9F86FFD08567FFB36A4CD85E37288A000000630000006367402E8AC57E59D8DF8E65FFDF8E63FFE1956CFFE6A27FFFEBB69AFFF2CFBDFFF8E4DAFFFCF6F2FFFFFEFEFFFFFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF5F2FFF4E1D8FFEAC5B4FFDD9F84FFD48868FFD07F5EFFB56C4FD85E37288A000000630000006168433089C77F5CD8E18F65FFE18C60FFE28E61FFE4946AFFE8A27EFFEDB79BFFF3CDB8FFF8E1D5FFFBEEE7FFFCF3EEFFFDF7F3FFFDF9F7FFFDFAF8FFFDF9F7FFFDF9F7FFFDFAF8FFFDF9F7FFFCF7F4FFFBF2EEFFF9EDE7FFF4DFD5FFEDC8B7FFE3AD94FFD78C6BFFD17C57FFD07D5AFFB96E51D860392A89000000610000005D6C463186C9825CD7E39166FFE38D61FFE38C60FFE59063FFE6956BFFE99E76FFECAB88FFF0BDA1FFF3CEB9FFF7DCCDFFF9E7DDFFFBEEE7FFFBF0EAFFFAEEE7FFFAEEE8FFFBF1EBFFFAEEE8FFF8E7DEFFF4DACEFFEFC9B8FFE8B69EFFE09F81FFD98D6BFFD4805BFFD17B56FFD17D5AFFBA7051D7643C2B860000005D00000052744B357DCD855FD4E49469FFE59469FFE6956AFFE7966BFFE8986CFFE8986CFFE99F76FFECAD89FFEFBB9DFFF3C9B1FFF5D4C0FFF6D9C9FFF6DCCDFFF6DBCBFFF6DBCCFFF6DDCEFFF5DACBFFF3D2C1FFEFC6B1FFE9B49AFFE3A384FFDC926DFFD88761FFD6845FFFD4825DFFD3815DFFBE7352D46A412E7D000000520000004081543B70D28761CFE6986FFFE9A27AFFEBA780FFECA881FFECA881FFEBA77FFFECA982FFEDB08BFFEFB693FFF0BB9BFFF0BD9EFFEEBC9FFFEEBCA0FFEFBFA3FFEFBFA3FFEEBEA1FFEDBC9EFFECB99CFFEAB497FFE8AE8EFFE5A785FFE29F7CFFE09A77FFDE9775FFDA916EFFD58662FFC27754CF78483470000000400000002E8A583F5CCE865FB8E0956EECE7A17BF9EBA882FFEBA983FFEBA982FFEBA780FFEBA881FFECAA84FFECAC85FFECAC86FFEBAA85FFE9A782FFE8A682FFE9A985FFE9A985FFE8A782FFE7A580FFE6A581FFE5A481FFE4A37FFFE3A17EFFE29E7CFFE09C7AFFDF9A78FFDA9270F9D18462ECC07554B87F4D375C0000002E0000001B89563E41BE7A578ED28962C7DE946DECE59971FFE59A71FFE69A71FFE69A70FFE69A71FFE79B72FFE79C73FFE69C73FFE69C73FFE59A72FFE49972FFE49A73FFE49973FFE29871FFE19670FFE19670FFE0956FFFDF936EFFDD916DFFDC906BFFDA8E6AFFD98C68FFD28564ECC57958C7B36B4F8E814E3A410000001B0000000E89544127B372515BC8805C87DB8D65ADE19169BFE19169BFE29269BFE29269BFE49469BFE49469BFE49469BFE49469BFE29469BFE29469BFE19269BFE19169BFE19169BFDE9069BFDE8E68BFDE8D66BFDD8D65BFDC8A65BFDA8964BFD98862BFD68661BFD58560BFCE7E5BADBC735387A8644B5B824E3A270000000E00000005894E3A0DB26E551EC6825A2DDB8C653AE3936740E3936740E3936740E3936740E3936740E3936740E3936B40E3"
	$bData &= "936B40E3936B40E3936B40E3936B40E3936B40DF8F6740DF8F6740DF8F6740DF8F6740DF8B6740DB8B6340DB8B6340D7876340D7876340D7835F40CE7F5C3ABA71542DAA664C1E894E3A0D000000050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFF800001FC0000003C0000003C00000038000000180000001800000018000000180000001800000018000000180000001800000018000000180000001800000018000000180000001800000018000000180000001800000018000000180000001C0000003C0000003C0000003C0000003E0000007FFFFFFFFFFFFFFFF28000000200000004000000001000800000000000008000000000000000000000000000000000000090101FF140303FF190504FF1C0806FF1F0B08FF240605FF2C0706FF270806FF2E0807FF210D09FF340807FF340A08FF3A0C09FF25110BFF29150EFF2B1710FF2E1A13FF311D15FF322017FF362319FF382219FF3D281CFF420C0AFF4E0E0BFF500E0CFF44130EFF4D100CFF52110DFF5D120EFF4C1912FF561510FF5D1610FF521F16FF631611FF681611FF631A13FF6A1B14FF691E18FF721E16FF41281CFF522016FF562318FF5A271BFF5D2A1DFF692017FF6C241CFF73221AFF7B251BFF74291EFF7D281FFF462D20FF492D20FF4F3324FF543425FF5B3A2AFF6C2720FF612F21FF772C24FF7C2C21FF643223FF693626FF6D3B2AFF7B3123FF7A332BFF703F2EFF7E3B33FF71402CFF744431FF7A4A35FF7E5039FF842B1FFF842D21FF803525FF893325FF81352BFF8B3528FF843B2BFF8B382BFF903A2BFF863E35FF8F3E30FF8C4431FF8F4836FF83443CFF934232FF994534FF91473CFF964D3AFF9C4B3AFF83533BFF8C563EFF9B533FFF874A42FF8A4B42FF8B5047FF8E5C42FF8C524AFF905740FF995144FF925840FF9F5A45FF95554BFF9A594FFFA15444FFA45E44FFA35B4CFFAA5E4AFFA55F51FF996246FF9D6549FF9D665DFFA5614BFFAA664CFFAD694DFFB16B4EFFAE6655FFAD6950FFAF6C5BFFB46B56FFB57253FFBA7454FFBC7857FFBC755EFFA56B62FFA96D62FFA7766EFFB47262FFBC7965FFB0776CFFB57A6EFFBB7B6BFFAC7971FFC07556FFC27B59FFCC7D5BFFC37E66FFCC7F60FFAF8179FFB78176FFBD8476FFB3877FFFB98378FFC7815CFFCB835EFFD3805CFFCE8561FFC2826EFFCB866BFFD48461FFD88762FFD58A66FFDB8B65FFD68D6BFFDB8E69FFDD916CFFCC8B74FFC68C7CFFCD8F7AFFD78F70FFD39072FFDC9472FFDF9875FFE18E63FFE39065FFE2936AFFE5986EFFE89A6FFFE09672FFE59B74FFE89D74FFE19C7AFFEAA076FFE4A27FFFEAA47CFFB68C84FFBA8B82FFBA928CFFC28C80FFCB9687FFC6988DFFDB9F86FFC49A92FFCB9E93FFE09F80FFD4A08FFFDFA58BFFCAA59DFFCEA89FFFD4A597FFD9A896FFD0A399FFDEAD9AFFE5A584FFEAA681FFEAA985FFE5AA8CFFEAAC88FFE2A990FFE1AE99FFEDB393FFE0B09DFFE8B59CFFECB99DFFF0BA9BFFD2AEA6FFDAAEA1FFD5B1A7FFD1B3ACFFD9B4AAFFD6BAB3FFDBBCB3FFDABFB8FFE6BAA7FFECBCA3FFE2B9ACFFF0BEA1FFDCC1BBFFEFC0A5FFE9C1AFFFF0C0A6FFF1C2A8FFECC4B1FFE1C4BCFFE6C8BEFFEDCCBDFFF3CAB3FFF1CEBCFFF4D1BDFFE3CAC4FFEACCC0FFE6CFC8FFEFD3C6FFE5D0CBFFE9D2CCFFF5D6C5FFF5D9CBFFEAD7D2FFECDAD4FFEEDED9FFF2DBD0FFF0DED8FFF6E1D6FFF8E1D5FFF2E2DCFFF8E5DBFFFAE8DFFFF3E5E1FFF5E9E5FFF9ECE4FFF6EBE8FFF9EDE9FFF9F1EDFFFBF5F2FFFDF8F5FFFEFDFDFF000000FF0000000102020201010101010101010101010101010101010201020101000000000207080B0B0B0B0B0B0B0B0A0B0B0B0B0B0B0B0B0B0A0A0A0A0A080605010001070C191A1E1E1E1A1B1A1A1D1A1A1A1A1A171717171718181817170C0A0701010B191B21212121211F231F1F1F1F1F1F1F1F1F1C21211F1C211C1C17160801020C1C242426252E2D373737372D37372D2D2D2525252222222222211C1A0C0203191F2C2F2F3A4A5D606060605E5D5C5C53413F3A302E2E2E262626221C0C0103192C3146474B6583B0B0B0AFAEAE8C897D6E665D4F3F47312F2F2F261F0C02041D2E46494E587CB5D3D8D8D3D3D3D2CFBAB08C837B66564B48472F2E231903041D30494E586B8DCCE4EDF3F3F3EFEDECE4D8D2CFBAAF7B624D4B47312C190207283E4B556981B6DEECF8F8FAF8FAF8F6F3F0EEEDE8D1B58069544B472D1D0409284855677EB6D3ECF6FAFBFBFCFCFCFBFBF8FAFAF6ECD3BA8C6B5449391D090D2B4C5873B1D2EEF9FCFCFDFDFDFDFDFDFCFCFCFCFBF9EEE4BB8167503E29090D38516F82BEE6F9FCFCFEFEFEFEFEFEFEFEFEFEFEFEFCFBF6DEB375624C29090E3B5B769DD0EDF9FDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFDFCECCE8D704C2A0D0E3C5B7AB2D2EEFCFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFDF6DEB27356380D0F3D6887BCD3F0F9FDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFCF6DEB87E57380910427093BDE0F3FCFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFDFCF6E4BE7F613B0E1142719BBFE4F3FCFDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFAF6E9CD92683C0F1044779FBFE0F3FBFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFCFC"
	$bData &= "F9EFD69D6F3D0F1044779FC3DDEFFAFCFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFBF6EFD69D6F401012457897B7C9E2F0FAFCFEFEFEFEFEFEFEFEFEFEFEFEFEFCFAF1E5CD9E73431012457996A1C0CAE3F2FBFDFEFEFEFEFEFEFEFEFEFEFEFEFCF6E9D4B49372431013597996A3A8C2CBE3F2FBFDFDFEFEFEFEFEFEFEFEFEFCFAEFDDB99E86724311135985A2A2A3A8C1CBE1EBF5FBFDFCFDFDFDFDFCFBFAF4EFDAC5A0948672441113598597A3A3A3A9ADC7DCE3EBF4F8F8F8F8F8F8F3EFE0D5C3A0959086724412155F8E9AA5A5A9A9ABC2C7D7E1E3EBEBEBEBEBEAEADCD5C3AA9A96908F785914326C8FA4ABADADADADC1C4C7CBD7D7D5DBDBDBD5CAC9C4C0AAA09A9894786127356D919AAAADADADADADADC4C4C2C4C4C4C2C2C2C0C0C0AAAAAAA09E91786333356D8598A4A8ABA9A9A9A9A9ABA9A9ABA9AAAAA7A8A8A0A7A499989486766333366C79919AA4A4A4A6A6A5A6A4A6A8A4A7A4A4A4A499A4979996979185726135366D798F96A2A4A4A4A4A5A4A6A4A4A4A4A499A499A297979497909084716136366C778F97A4A4A4A4A4A4A4A4A4A4A4A4A4A499A29997979795948684716135FFFFFFFFF800001FC0000003C0000003C00000038000000180000001800000018000000180000001800000018000000180000001800000018000000180000001800000018000000180000001800000018000000180000001800000018000000180000001C0000003C0000003C0000003C0000003E0000007FFFFFFFFFFFFFFFF2800000010000000200000000100200000000000000800000000000000000000000000000000000000000012000000370000005B000000630000006300000063000000630000006300000063000000630000006300000063000000630000005B0000003700000012000000373D0C0ACA61130FFF60140FFF5C130EFF5B130EFF5B130EFF5B130EFF5A120EFF5C110EFF5C110DFF5D100DFF5B0F0DFF5B0F0CFF380807CA000000370000005B6D1B14FF782019FF732119FF6A1F16FF671F16FF6A2116FF691F16FF681E16FF691D15FF6B1C15FF6D1B15FF6E1A13FF6E1813FF64140FFF0000005B000000637C261CFF8F3526FF893425FFE6D4D1FFDAC3BEFFD7B9B3FFD3B5ADFFCBA9A2FFA56E64FF8C4539FF7F2B1FFF832A20FF86291EFF6E1B15FF00000063000000638C3324FF953C2BFFAD6F61FFE4CAC3FFFBEFE8FFFBEEE8FFFCF0EBFFF3E4DEFFECDBD5FFF5E9E6FFC59D94FF8A3827FF8B3224FF7E271CFF0000006300000063983F2BFFA55645FFEDDAD6FFFAF0EDFFFDF5F1FFFDF6F2FFFDF6F3FFFDF5F2FFFBF2EEFFFDF5F2FFF4E7E3FFDCC1BAFF94402FFF8C3324FF0000006300000063AC5339FFCA998DFFFEFCFAFFFEFBF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFDFCFFFFFFFFFFFCF8F6FFFEFCFBFFC18D80FF99422DFF0000006300000063BB6243FFD8B1A6FFF8F1EFFFFEFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFB6FFA74E36FF0000006300000063CA7350FFE3C3B8FFF7EFEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5EAE7FFE3C2B8FFB2593FFF0000006300000063D4805BFFE9C4B4FFFCF6F5FFFEFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7EEEBFFF9F0EDFFC26C4EFF0000006300000063DB8A62FFDF9875FFF3D8CAFFFDF8F5FFFFFEFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E9E3FFE6BDABFFCA7657FF0000006300000063E19068FFE08B5DFFE59A74FFF4D3C2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D2C4FFD27D58FFD07D5BFF000000630000005BE49469FFE48B5FFFE68F61FFE79264FFEEB494FFF7DBCBFFFBEDE6FFF9E8DEFFFAEEE8FFF5DACDFFE6AD92FFD68058FFD17953FFD2805DFF0000005B00000037E5946AFFEEB08BFFEFB28DFFEDAD87FFEFB48FFFEFB490FFEAAB88FFEDB391FFEAAD88FFE9AD8BFFE7AA88FFE5A583FFE1A080FFD4825DFF0000003700000012B976559BE29269FFE39369FFE49469FFE5946AFFE4956AFFE3946BFFE2926AFFDF9069FFDF8E67FFDC8B65FFD88863FFD68460FFAE694D9B0000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFF00008001000080010000800100008001000080010000800100008001000080010000800100008001000080010000800100008001000080010000FFFF000028000000100000002000000001000800000000000002000000000000000000000000000000000000000000FF390908FF3E0C0AFF5B0F0CFF5A120EFF5B130EFF5C110DFF5D100DFF5C130EFF61130FFF60140FFF64140FFF671F16FF6E1813FF6E1A13FF6D1B14FF6E1B15FF691D15FF6B1C15FF681E16FF691F16FF6A1F16FF6A2116FF732119FF782019FF7C261CFF7E271CFF7F2B1FFF86291EFF832A20FF8B3224FF8C3324FF893425FF8F3526FF8A3827FF953C2BFF983F2BFF94402FFF99422DFF8C4539FFA74E36FFAC5339FFB2593FFFA55645FFAF6A4EFFBB6243FFBA7756FFA56E64FFAD6F61FFC26C4EFFCA7350FFCA7657FFD17953FFD07D5BFFD27D58FFD4805BFFD68058FFD2805DFFD4825DFFE08B5DFFE48B5FFFD68460FFD88863FFDB8A62FFDC8B65FFDF8E67FFDF9069FFDF9875FFE68F61FFE79264FFE1"
	$bData &= "9068FFE29269FFE39369FFE3946BFFE49469FFE5946AFFE59A74FFC18D80FFCA998DFFC59D94FFE1A080FFE5A583FFEDAD87FFE7AA88FFEAAB88FFE9AD8BFFEAAD88FFEEB08BFFEFB28DFFEFB48FFFE6AD92FFEDB391FFEFB490FFEEB494FFCBA9A2FFD8B1A6FFD3B5ADFFD7B9B3FFDFBFB6FFE6BDABFFDCC1BAFFDAC3BEFFE9C4B4FFE3C2B8FFE4CAC3FFF4D3C2FFF0D2C4FFF3D8CAFFF7DBCBFFF5DACDFFE6D4D1FFECDBD5FFEDDAD6FFF3E4DEFFF9E8DEFFF4E7E3FFF6E9E3FFF5E9E6FFF5EAE7FFFBEDE6FFF7EEEBFFF7EFEDFFFAEEE8FFFBEEE8FFFCF0EBFFF8F1EFFFF9F0EDFFFAF0EDFFFBF2EEFFFDF5F1FFFDF6F2FFFCF6F5FFFCF8F6FFFDF8F5FFFEFBF9FFFEFCFAFFFEFCFCFFFFFEFEFF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000000000000000000000000000000002090A080505050406060603030100000F1817150C1614131112100E0D0B00001921206E6561605E2F271B1D1C1000001F2330687B7B7C716F754F221E1A0000242B707F8282858280827364251F0000294E878789898989898984884D2600002D5F7D88898989898989898962280000326779898989898989898976672A00003766838889898989898989787E3100003F436B85898989898989897463330000463B4C69898989898989896A363500004A3C44455D6C77727A6D5A38343900004B575852595C545B56555351503A00002E47484A4B4A49474241403E3D2C0000000000000000000000000000000000FFFF00008001000080010000800100008001000080010000800100008001000080010000800100008001000080010000800100008001000080010000FFFF0000"
	Local $hFileOut = FileOpen($__sPathIcon, 2+8+16)
	FileWrite($hFileOut, Binary($bData))
	FileClose($hFileOut)
EndFunc  ;==>__IconCreate


;===================================================================================================
; Function Name....: __RGB2BGR
; Description......: Converts a RGB color value to a BGR one
;===================================================================================================
Func __RGB2BGR($_RGB)
	Return '0x' & Hex(BitAND($_RGB, 0xFF), 2) _
				& Hex(BitAND(BitShift($_RGB, 8), 0xFF), 2) _
				& Hex(BitAND(BitShift($_RGB, 16), 0xFF), 2)
EndFunc  ;==>__RGB2BGR
#endregion