;-- TIME_STAMP   2017-09-22 11:56:34   v 0.6
#include-once
#include <WinAPI.au3>
#include <WinAPIGdi.au3>
#include <Timers.au3>
#include <GDIPlus.au3>
#include <WindowsConstants.au3>
#include <FontConstants.au3>
#include <StaticConstants.au3>
#include <SendMessage.au3>

OnAutoItExitRegister('__OnExit')

; #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_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_BOTRIGHT = 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_GRADIENT_L2R = False      ; Gradient Left-To-Right, Default: Top-To-Bottom
Global Const $GCB_TIME_COUNTER = 1          ; '0' - don't show Time or Countdown, '1' - shows Countdown (Timeout required), '2' - shows Time
Global Const $GCB_TIMEOUT_DEF  = 5          ; Default Timeout to close the control
Global Const $GCB_TIMEOUT_ZERO = 60 * 60    ; With Timeout=0 (close with _GuiCtrlBusy_Close) sets $__TIMEOUT_ZERO an safety timeout (in s)
Global Const $GCB_CALLBACK_FRQ = 500        ; Callback Intervall (ms)
Global Const $GCB_CLOSED       = -1         ; iCode that is sent to WM_NOTIFY when an control was closed

; 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_TEXT_MARGIN  = $GCB_TEXT_MARGIN
Global $GCB_U_RGB_TOPLEFT  = $GCB_RGB_TOPLEFT
Global $GCB_U_RGB_BOTRIGHT = $GCB_RGB_BOTRIGHT
Global $GCB_U_BGR_TITLE    = $GCB_BGR_TITLE
Global $GCB_U_BGR_TEXT     = $GCB_BGR_TEXT
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_FRQ = $GCB_CALLBACK_FRQ

Global $GCB_RECEIVE_HWND   = 0              ; Handle from window, that should receive the $GCB_CLOSED message. If not set, the current [ACTIVE] will used.
                                            ; Can be set with _GuiCtrlBusy_SetReceiver
; ===============================================================================================================================

; #CURRENT# =====================================================================================================================
; _GuiCtrlBusy_Create
; _GuiCtrlBusy_Close
; _GuiCtrlBusy_SetTitle
; _GuiCtrlBusy_SetText
; _GuiCtrlBusy_SetColors
; _GuiCtrlBusy_SetPos
; _GuiCtrlBusy_SetTimeout
; _GuiCtrlBusy_SetOnTop
; _GuiCtrlBusy_SetGradient
; _GuiCtrlBusy_UserDefaults
; _GuiCtrlBusy_SetReceiver
; ===============================================================================================================================

; #au3.user.calltips.api# =======================================================================================================
; _GuiCtrlBusy_Create([$_sTitle = ''[, $_sText = ''[, $_iX = -1[, $_iY = -1[, $_iTimeout = -1[, $_iTimeCounter = -1[, $_BGRtitleScheme = -1[, $_BGRtextOrRotate = -1[, $_RGBtopleft = -1[, $_RGBbottomright = -1[, $_fRotate = 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 = '']]]) Sets for title line: title, show:nothing/countdown/time, timeout, color. (Requires: #include "GuiCtrlBusy.au3")
; _GuiCtrlBusy_SetText($_hWnd, $_sText = ''[, $_BGRtext = '']) Sets text / text color for the control. (Requires: #include "GuiCtrlBusy.au3")
; _GuiCtrlBusy_SetColors($_hWnd, $_BGRtitle = ''[, $_BGRtext = ''[, $_RGBtopleft = ''[, $_RGBbottomright = '']]]) Sets title/text/gradient colors. (Requires: #include "GuiCtrlBusy.au3")
; _GuiCtrlBusy_SetPos($_hWnd, $_iX = ''[, $_iY = '']) Moves the control to x/y position. (Requires: #include "GuiCtrlBusy.au3")
; _GuiCtrlBusy_SetTimeout($_hWnd, $_iTimeout) Sets the control timeout. (Requires: #include "GuiCtrlBusy.au3")
; _GuiCtrlBusy_SetOnTop($_hWnd) Sets the control on top. (Requires: #include "GuiCtrlBusy.au3")
; _GuiCtrlBusy_SetGradient($_hWnd, $_RGBtopleft = ''[, $_RGBbottomright = ''[, $_fRotate = '']]) Sets gradient colors and direction. (Requires: #include "GuiCtrlBusy.au3")
; _GuiCtrlBusy_UserDefaults($_sParamValue[, $_sDelim = '|']) Changes the default values for control creation. (Requires: #include "GuiCtrlBusy.au3")
; _GuiCtrlBusy_SetReceiver($_hWnd = 0) Sets the window handle to receive the $GCB_CLOSED message. Default (0) the current active window. (Requires: #include "GuiCtrlBusy.au3")
; ===============================================================================================================================

; #INTERNAL_USE_ONLY# ===========================================================================================================
; __IconCreate
; __DelTempIconFile
; __OnExit
; __GuiCreate
; __GuiCtrlBusy_Set
; __ManageCtrl
; __CallbackDrawBusy
; __GetTextMeasure
; __FormatSeconds
; ===============================================================================================================================

; #ICON# ========================================================================================================================
OnAutoItExitRegister("__DelTempIconFile")
Global $__sPathIcon = @TempDir & "\busy.ico"
__IconCreate()

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

Func __DelTempIconFile()
    FileDelete($__sPathIcon)
EndFunc  ;==>__DelTempIconFile
; ===============================================================================================================================

; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_Create
; 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.
;                  Es können zeitgleich mehrere Ctrl erstellt werden. Standardmäßig wird alle 100 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.
;                  Wenn ein Control geschlossen wird, wird WM_NOTIFY mit dem Code $GCB_CLOSED gesendet (ausgenommen das gleichzeitige Schließen aller offenen Ctrl).
;                  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 = ''[, $_iX = -1[, $_iY = -1[, $_iTimeout = -1[, $_iTimeCounter = -1[,
;                                     $_BGRtitleScheme = -1[, $_BGRtextOrRotate = -1[, $_RGBtopleft = -1[, $_RGBbottomright = -1[, $_fRotate = 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
;                                         Ist Counter aktiviert, kann im Text mit Platzhalter "%C%" die Restlaufzeit angezeigt werden.
;                  $_iX                 - [optional] X-Position. Standard (-1) = zentriert.
;                  $_iY                 - [optional] Y-Position. Standard (-1) = zentriert
;                  $_iTimeout           - [optional] Zeit in s nach der das Ctrl beendet wird. Standard (-1) = 5 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)
;                                         !! In diesem Fall werden die anderen Farbparameter nicht benötigt und $_fRotate darf als Folgeparameter angegeben werden.
;                  $_BGRtextOrRotate    - [optional] BGR-Farbe Text. Standard (-1) = Wert von $GCB_U_BGR_TEXT. Wird als $_fRotate 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_BOTRIGHT.
;                  $_fRotate            - [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='', $_iX=-1, $_iY=-1, $_iTimeout=-1, $_iTimeCounter=-1, $_BGRtitleScheme=-1, $_BGRtextOrRotate=-1, $_RGBtopleft=-1, $_RGBbottomright=-1, $_fRotate=$GCB_U_GRADIENT_L2R)
    Local Static $fFirstRun = True, $iTimeLastCall
    ; Gradient schemes template
    Local $aColorScheme[8][5] = [ _  ; ['Name_Schema', RGB_Gradient_Start, RGB_Gradient_End, BGR_Titel, BGR_Text]
        ['cacao',   0x460000,0xC06565,0xE6E6FF,0x0092FF], _
        ['clouds',  0x800000,0x400000,0xA7BED7,0xF7F7F7], _
        ['coffee',  0x000000,0xFDEADF,0xE9F1FF,0xE9F1FF], _
        ['darkness',0x000000,0x666666,0xD4D4DE,0xD4D4DE], _
        ['forest',  0x005C1F,0xC5E0CE,0xEFFBE8,0x0C1F01], _
        ['midnight',0x1C0E5D,0xDFD8FE,0xF6DCE1,0x180508], _
        ['orange',  0xE28304,0xFFDBAB,0xDCEEFA,0x000F80], _
        ['silver',  0x666666,0xDDDDDD,0xF6F6F6,0x0A0A0B]]
    If $fFirstRun 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) < 10 Then Sleep(10)
        $iTimeLastCall = _Timer_Init()
    EndIf
    If IsString($_BGRtitleScheme) Then
        Local $iIndexScheme = -1
        If IsBool($_BGRtextORRotate) Then $_fRotate = $_BGRtextORRotate
        For $i = 0 To 7
            If $_BGRtitleScheme = $aColorScheme[$i][0] Then
                $_RGBtopleft      = $aColorScheme[$i][1]
                $_RGBbottomright  = $aColorScheme[$i][2]
                $_BGRtitleScheme  = $aColorScheme[$i][3]
                $_BGRtextORRotate = $aColorScheme[$i][4]
                $iIndexScheme = $i
                ExitLoop
            EndIf
        Next
        If $iIndexScheme = -1 Then $_BGRtitleScheme = -1 ; wenn Name des Schemas nicht gefunden
    EndIf
    Local $hWnd = __GUICreate($_sTitle, $_sText, $_iX, $_iY, $_iTimeout, $_RGBtopleft, $_RGBbottomright, $_BGRtitleScheme, $_BGRtextOrRotate, $_iTimeCounter, $_fRotate)
    _Timer_SetTimer($hWnd, 0, '__CallbackDrawBusy')
    Return $hWnd
EndFunc  ;==>_GuiCtrlBusy_Create

; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_Close
; Description ...: Beendet ein/alle Busy-Ctrl
; 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 kein Busy-Ctrl
; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlBusy_Close($_hWnd=-1)
    If $_hWnd = -1 Then Return __ManageCtrl()  ; kill all
    Local $aBusyCtrl = __ManageCtrl($_hWnd)
    If @error Then Return SetError(1,0,0)
    $aBusyCtrl[18] = True ; fBrake
    __ManageCtrl($_hWnd, 'set', $aBusyCtrl)
EndFunc  ;==>_GuiCtrlBusy_Close

; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_SetTitle
; Description ...: Für ein existierendes Ctrl ändern von Titel, Countdown, Timeout, Titelfarbe
; Syntax ........: _GuiCtrlBusy_SetTitle($_hWnd, $_sTitle = ''[, $_iTimeCounter = ''[, $_iTimeout = ''[, $_BGRtitle = ''[, $_fSetOnTop = '']]]])
; 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
;                  $_fSetOnTop          - [optional] Bringt das Ctrl in den Vordergrund
; Return values .: Fehler     0 - set Error = 1  Kein Parameter übergeben
; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlBusy_SetTitle($_hWnd, $_sTitle='', $_iTimeCounter='', $_iTimeout='', $_BGRtitle='', $_fSetOnTop='')
    Local $sParam = ''
    $sParam &= $_sTitle <> '' ? 'sTitle=' & ($_sTitle = -1 ? $GCB_U_TITLE_DEF : $_sTitle) : ''
    $sParam &= $_iTimeCounter <> '' ? ($sParam = '' ? 'iTimeCounter=' : '|iTimeCounter=') & $_iTimeCounter : ''
    $sParam &= $_iTimeout <> '' ? ($sParam = '' ? 'iTimeout=' : '|iTimeout=') & ($_iTimeout = -1 ? $GCB_U_TEXT_DEF : $_iTimeout) : ''
    $sParam &= $_BGRtitle <> '' ? ($sParam = '' ? 'BGRtitle=' : '|BGRtitle=') & ($_BGRtitle = -1 ? $GCB_U_BGR_TITLE : $_BGRtitle) : ''
    If $_fSetOnTop Then _WinAPI_SetWindowPos($_hWnd, $HWND_TOP, 0, 0, 0, 0, BitOR($SWP_NOMOVE,$SWP_NOSIZE))
    If $sParam = '' And Not $_fSetOnTop Then Return SetError(1,0,0)
    __GuiCtrlBusy_Set($_hWnd, $sParam)
EndFunc  ;==>_GuiCtrlBusy_SetTitle

; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_SetText
; Description ...: Für ein existierendes Ctrl ändern von Text, Textfarbe
; Syntax ........: _GuiCtrlBusy_SetText($_hWnd, $_sText = ''[, $_BGRtext = ''[, $_fSetOnTop = '']])
; Parameters ....: $_hWnd               - Das Handle des Ctrl.
;                  $_sText              - [optional] Der neue Text oder '' für Beibehalten bisheriger Wert.
;                  $_BGRtext            - [optional] Neue BGR-Textfarbe oder '' für Beibehalten bisheriger Wert.
;                  $_fSetOnTop          - [optional] Bringt das Ctrl in den Vordergrund
; Return values .: Fehler     0 - set Error = 1  Kein Parameter übergeben
; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlBusy_SetText($_hWnd, $_sText='', $_BGRtext='', $_fSetOnTop='')
    Local $sParam = ''
    $sParam &= $_sText <> '' ? 'sText=' & ($_sText = -1 ? $GCB_U_TEXT_DEF : $_sText) : ''
    $sParam &= $_BGRtext <> '' ? ($sParam = '' ? 'BGRtext=' : '|BGRtext=') & ($_BGRtext = -1 ? $GCB_U_BGR_TEXT : $_BGRtext) : ''
    If $_fSetOnTop Then _WinAPI_SetWindowPos($_hWnd, $HWND_TOP, 0, 0, 0, 0, BitOR($SWP_NOMOVE,$SWP_NOSIZE))
    If $sParam = '' And Not $_fSetOnTop Then Return SetError(1,0,0)
    __GuiCtrlBusy_Set($_hWnd, $sParam)
EndFunc  ;==>_GuiCtrlBusy_SetText

; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_SetColors
; Description ...: Für ein existierendes Ctrl ändern aller Farbwerte
; Syntax ........: _GuiCtrlBusy_SetColors($_hWnd, $_sText = ''[, $_BGRtext = ''])
; 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-Gradientfarbe (-1 für Default-Farbe) oder '' für Beibehalten bisheriger Wert.
;                  $_RGBbottomright     - [optional] Die RGB-Gradientfarbe (-1 für Default-Farbe) oder '' für Beibehalten bisheriger Wert.
; Return values .: Fehler     0 - set Error = 1  Kein Parameter übergeben
; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlBusy_SetColors($_hWnd, $_BGRtitle='', $_BGRtext='', $_RGBtopleft='', $_RGBbottomright='')
    Local $sParam = ''
    $sParam &= $_BGRtitle <> '' ? 'BGRtitle=' & ($_BGRtitle = -1 ? $GCB_U_BGR_TITLE : $_BGRtitle) : ''
    $sParam &= $_BGRtext <> '' ? ($sParam = '' ? 'BGRtext=' : '|BGRtext=') & ($_BGRtext = -1 ? $GCB_U_BGR_TEXT : $_BGRtext) : ''
    $sParam &= $_RGBtopleft <> '' ? ($sParam = '' ? 'RGBtopleft=' : '|RGBtopleft=') & ($_RGBtopleft = -1 ? $GCB_U_RGB_TOPLEFT : $_RGBtopleft) : ''
    $sParam &= $_RGBbottomright <> '' ? ($sParam = '' ? 'RGBbottomright=' : '|RGBbottomright=') & ($_RGBbottomright = -1 ? $GCB_U_RGB_BOTRIGHT : $_RGBbottomright) : ''
    If $sParam = '' Then Return SetError(1,0,0)
    __GuiCtrlBusy_Set($_hWnd, $sParam)
EndFunc  ;==>_GuiCtrlBusy_SetColors

; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_SetPos
; Description ...: Für ein existierendes Ctrl ändern der Position (X, Y), optional set OnTop
; Syntax ........: _GuiCtrlBusy_SetPos($_hWnd, $_iX = ''[, $_iY = ''[, $_fSetOnTop = '']])
; 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
;                  $_fSetOnTop          - [optional] 'True' bringt das Ctrl in den Vordergrund
; Return values .: Fehler     0 - set Error = 1  Kein Parameter übergeben
; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlBusy_SetPos($_hWnd, $_iX, $_iY='', $_fSetOnTop='')
    Local $sParam = ''
    $sParam &= $_iX <> '' ? 'iX=' & $_iX : ''
    $sParam &= $_iY <> '' ? ($sParam = '' ? 'iY=' : '|iY=') & $_iY : ''
    If $_fSetOnTop Then _WinAPI_SetWindowPos($_hWnd, $HWND_TOP, 0, 0, 0, 0, BitOR($SWP_NOMOVE,$SWP_NOSIZE))
    If $sParam = '' And Not $_fSetOnTop Then Return SetError(1,0,0)
    __GuiCtrlBusy_Set($_hWnd, $sParam)
EndFunc  ;==>_GuiCtrlBusy_SetPos

; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_SetTimeout
; Description ...: Für ein existierendes Ctrl Setzen des Timeout
; Syntax ........: _GuiCtrlBusy_SetTimeout($_hWnd, $_iTimeout)
; 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.
; Return values .: None
; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlBusy_SetTimeout($_hWnd, $_iTimeout)
    __GuiCtrlBusy_Set($_hWnd, 'iTimeout=' & ($_iTimeout = -1 ? $GCB_U_TEXT_DEF : $_iTimeout))
EndFunc  ;==>_GuiCtrlBusy_SetTimeout

; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_SetOnTop
; Description ...: Setzt ein existierendes Ctrl OnTop
; Syntax ........: _GuiCtrlBusy_SetOnTop($_hWnd)
; Parameters ....: $_hWnd               - Das Handle des Ctrl.
; Return values .: None
; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlBusy_SetOnTop($_hWnd)
    _WinAPI_SetWindowPos($_hWnd, $HWND_TOP, 0, 0, 0, 0, BitOR($SWP_NOMOVE,$SWP_NOSIZE))
EndFunc  ;==>_GuiCtrlBusy_SetOnTop

; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_SetGradient
; Description ...: Für ein existierendes Ctrl ändern der Farbverlaufeinstellungen
; Syntax ........: _GuiCtrlBusy_SetGradient($_hWnd, $_RGBtopleft = ''[, $_RGBbottomright = ''[, $_fRotate = '']])
; Parameters ....: $_hWnd               - Das Handle des Ctrl.
;                  $_RGBtopleft         - [optional] Neue RGB-Farbe Gradient top od. left oder '' für Beibehalten bisheriger Wert.
;                  $_RGBbottomright     - [optional] Neue RGB-Farbe Gradient bottom od. right oder '' für Beibehalten bisheriger Wert.
;                  $_fRotate            - [optional] Gradientverlauf "False" von oben nach unten, "True" von links nach rechts.
;                                                    Oder '' für Beibehalten bisheriger Wert.
;                  $_fSetOnTop          - [optional] 'True' Bringt das Ctrl in den Vordergrund
; Return values .: Fehler     0 - set Error = 1  Kein Parameter übergeben
; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlBusy_SetGradient($_hWnd, $_RGBtopleft, $_RGBbottomright='', $_fRotate='', $_fSetOnTop='')
    Local $sParam = ''
    $sParam &= $_RGBtopleft <> '' ? 'RGBtopleft=' & ($_RGBtopleft = -1 ? $GCB_U_RGB_TOPLEFT : $_RGBtopleft) : ''
    $sParam &= $_RGBbottomright <> '' ? ($sParam = '' ? 'RGBbottomright=' : '|RGBbottomright=') & ($_RGBbottomright = -1 ? $GCB_U_RGB_BOTRIGHT : $_RGBbottomright) : ''
    $sParam &= String($_fRotate) <> '' ? ($sParam = '' ? 'fRotate=' : '|fRotate=') & ($_fRotate = -1 ? $GCB_U_GRADIENT_L2R : $_fRotate) : ''
    If $_fSetOnTop Then _WinAPI_SetWindowPos($_hWnd, $HWND_TOP, 0, 0, 0, 0, BitOR($SWP_NOMOVE,$SWP_NOSIZE))
    If $sParam = '' And Not $_fSetOnTop Then Return SetError(1,0,0)
    __GuiCtrlBusy_Set($_hWnd, $sParam)
EndFunc  ;==>_GuiCtrlBusy_SetGradient

; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_UserDefaults
; 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, iMargin, RGBtopleft, RGBbotright, BGRtitle, BGRtext, fGradient_l2r, 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     Parameter/Wert-String mit den vorherigen Werten
;                  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%ssText=%s%siMargin=%s%sRGBtopleft=%s%sRGBbotright=%s%sBGRtitle=%s%s' & _
            'BGRtext=%s%sfGradient_l2r=%s%siTimeCounter=%s%siTimeout=%s%siTimeoutZero=%s%siCallback=%s%s', _
            $GCB_U_TITLE_DEF,$_sDelim,$GCB_U_TEXT_DEF,$_sDelim,$GCB_U_TEXT_MARGIN,$_sDelim,$GCB_U_RGB_TOPLEFT,$_sDelim, _
            $GCB_U_RGB_BOTRIGHT,$_sDelim,$GCB_U_BGR_TITLE,$_sDelim,$GCB_U_BGR_TEXT,$_sDelim,$GCB_U_GRADIENT_L2R,$_sDelim, _
            $GCB_U_TIME_COUNTER,$_sDelim,$GCB_U_TIMEOUT_DEF,$_sDelim,$GCB_U_TIMEOUT_ZERO,$_sDelim,$GCB_U_CALLBACK_FRQ,$_sDelim)
        $GCB_U_TITLE_DEF    = $GCB_TITLE_DEF
        $GCB_U_TEXT_DEF     = $GCB_TEXT_DEF
        $GCB_U_TEXT_MARGIN  = $GCB_TEXT_MARGIN
        $GCB_U_RGB_TOPLEFT  = $GCB_RGB_TOPLEFT
        $GCB_U_RGB_BOTRIGHT = $GCB_RGB_BOTRIGHT
        $GCB_U_BGR_TITLE    = $GCB_BGR_TITLE
        $GCB_U_BGR_TEXT     = $GCB_BGR_TEXT
        $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_FRQ = $GCB_CALLBACK_FRQ
    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', $GCB_U_TITLE_DEF, $_sDelim)
                    $GCB_U_TITLE_DEF = ($aKeyVal[2] = 'system' ? $GCB_TITLE_DEF : $aKeyVal[2])
                Case 'sText'
                    $sOldValues &= $SF('sText=%s%s', $GCB_U_TEXT_DEF, $_sDelim)
                    $GCB_U_TEXT_DEF = ($aKeyVal[2] = 'system' ? $GCB_TEXT_DEF : $aKeyVal[2])
                Case 'iMargin'
                    $sOldValues &= $SF('iMargin=%s%s', $GCB_U_TEXT_MARGIN, $_sDelim)
                    $GCB_U_TEXT_MARGIN = ($aKeyVal[2] = 'system' ? $GCB_TEXT_MARGIN : $aKeyVal[2])
                Case 'RGBtopleft'
                    $sOldValues &= $SF('RGBtopleft=%s%s', $GCB_U_RGB_TOPLEFT, $_sDelim)
                    $GCB_U_RGB_TOPLEFT = ($aKeyVal[2] = 'system' ? $GCB_RGB_TOPLEFT : $aKeyVal[2])
                Case 'RGBbotright'
                    $sOldValues &= $SF('RGBbotright=%s%s', $GCB_U_RGB_BOTRIGHT, $_sDelim)
                    $GCB_U_RGB_BOTRIGHT = ($aKeyVal[2] = 'system' ? $GCB_RGB_BOTRIGHT : $aKeyVal[2])
                Case 'BGRtitle'
                    $sOldValues &= $SF('BGRtitle=%s%s', $GCB_U_BGR_TITLE, $_sDelim)
                    $GCB_U_BGR_TITLE = ($aKeyVal[2] = 'system' ? $GCB_BGR_TITLE : $aKeyVal[2])
                Case 'BGRtext'
                    $sOldValues &= $SF('BGRtext=%s%s', $GCB_U_BGR_TEXT, $_sDelim)
                    $GCB_U_BGR_TEXT = ($aKeyVal[2] = 'system' ? $GCB_BGR_TEXT : $aKeyVal[2])
                Case 'fGradient_l2r'
                    $sOldValues &= $SF('fGradient_l2r=%s%s', $GCB_U_GRADIENT_L2R, $_sDelim)
                    $GCB_U_GRADIENT_L2R = ($aKeyVal[2] = 'system' ? $GCB_GRADIENT_L2R : $aKeyVal[2])
                Case 'iTimeCounter'
                    $sOldValues &= $SF('iTimeCounter=%s%s', $GCB_U_TIME_COUNTER, $_sDelim)
                    $GCB_U_TIME_COUNTER = ($aKeyVal[2] = 'system' ? $GCB_TIME_COUNTER : $aKeyVal[2])
                Case 'iTimeout'
                    $sOldValues &= $SF('iTimeout=%s%s', $GCB_U_TIMEOUT_DEF, $_sDelim)
                    $GCB_U_TIMEOUT_DEF = ($aKeyVal[2] = 'system' ? $GCB_TIMEOUT_DEF : $aKeyVal[2])
                Case 'iTimeoutZero'
                    $sOldValues &= $SF('iTimeoutZero=%s%s', $GCB_U_TIMEOUT_ZERO, $_sDelim)
                    $GCB_U_TIMEOUT_ZERO = ($aKeyVal[2] = 'system' ? $GCB_TIMEOUT_ZERO : $aKeyVal[2])
                Case 'iCallback'
                    $sOldValues &= $SF('iCallback=%s%s', $GCB_U_CALLBACK_FRQ, $_sDelim)
                    $GCB_U_CALLBACK_FRQ = ($aKeyVal[2] = 'system' ? $GCB_CALLBACK_FRQ : $aKeyVal[2])
            EndSwitch
        Next
        If $sOldValues <> '' Then Return StringTrimRight($sOldValues, StringLen($_sDelim))
        Return SetError(1,0,'')
    EndIf
EndFunc  ;==>_GuiCtrlBusy_UserDefaults


; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlBusy_SetReceiver
; Description ...: Legt fest, welches Fenster die WM_NOTIFY Message empfängt, wenn ein BusyCtrl geschlossen wird.
;                  Ist kein Fenster festgelegt, wird an das aktive (zum Zeitpunkt, wenn das Control schließt) Fenster gesendet.
; Parameters ....: $_hWnd  Das Empfänger Fenster (Default = 0, das aktive Fenster)
; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlBusy_SetReceiver($_hWnd=0)
    If IsHWnd($_hWnd) Then $GCB_RECEIVE_HWND = $_hWnd
EndFunc  ;==>_GuiCtrlBusy_SetReceiver





#region - internal functions

Func __OnExit()
    _GuiCtrlBusy_Close()
    _GDIPlus_Shutdown()
EndFunc  ;==>__OnExit

#include <Array.au3>
Func __GUICreate($_sTitle='None', $_sText='None', $_iX='None', $_iY='None', $_iTimeout='None', $_RGBtopleft='None', _
    $_RGBbottomright='None', $_BGRtitle='None', $_BGRtext='None', $_iTimeCounter='None', $_fRotate='None', $_hWnd='None')
    ;    0     1      2      3     4  5     6        7         8          9           10       11       12         13         14         15          16        17       18         19
    ; [Title, Text, Width, Height, X, Y, Timeout, BGRtitle, BGRtext, iTimeCounter, fRotate, aVertex, LenTitle, iLineBreak, iTextTop, iTextBottom, TimeStamp, fBrake, fNewText, iDiffSecLast]
    Local $aBusyCtrl, $iWidth, $iHeight, $iLenTitle, $iLineBreak, $aTextSize, $iHeightText, $iLenText, $iTextTop, $iTextBottom, $hForm, $fSetOnTop = False, $iDiffSecLast = 0
    If $_hWnd <> 'None' Then   ; called from: __GuiCtrlBusy_Set
        $aBusyCtrl = __ManageCtrl($_hWnd)
        $_sTitle = $_sTitle = 'None' ? $aBusyCtrl[0] : $_sTitle
        $_sText = $_sText = 'None' ? $aBusyCtrl[1] : $_sText
        $_iX = $_iX = 'None' ? $aBusyCtrl[4] : $_iX
        $_iY = $_iY = 'None' ? $aBusyCtrl[5] : $_iY
        $_iTimeout = $_iTimeout = 'None' ? $aBusyCtrl[6] : $_iTimeout
        $_BGRtitle = $_BGRtitle = 'None' ? $aBusyCtrl[7] : $_BGRtitle
        $_BGRtext = $_BGRtext = 'None' ? $aBusyCtrl[8] : $_BGRtext
        $_iTimeCounter = $_iTimeCounter = 'None' ? $aBusyCtrl[9] : $_iTimeCounter
        $_fRotate = String($_fRotate) = 'None' ? $aBusyCtrl[10] : $_fRotate
        $iDiffSecLast = $aBusyCtrl[19]
    EndIf

    If $_sTitle = '' Then $_sTitle = $GCB_U_TITLE_DEF
    If $_sText = '' Then $_sText = $GCB_U_TEXT_DEF
    $_sText = StringRegExpReplace($_sText, '\\n|\r\n|[\r\n]', @LF)
    $iLineBreak = @extended
    $iLenTitle = (__GetTextMeasure($_sTitle, 10, 1))[1]
    $aTextSize = __GetTextMeasure($_sText, 11, 0)
    $iHeightText = $aTextSize[0]
    $iLenText = $aTextSize[1]
    Local $iMargin = $GCB_U_TEXT_MARGIN < $GCB_TEXT_MARGIN ? $GCB_TEXT_MARGIN : $GCB_U_TEXT_MARGIN
    ; Titel line: $iMargin [TITLE:$iLenTitle] 20px [COUNTER/TIME:105px] $iMargin
    ; Text line:  $iMargin [TEXT:$iLenText] $iMargin
    $iWidth = $iMargin + (  ($iLenTitle + 125) > $iLenText ? ($iLenTitle + 125) : $iLenText  ) + $iMargin

    If $iWidth < 250 Then $iWidth = 250
    $iHeight = 120
    $iTextTop = 31
    $iTextBottom = 100
    If $iLineBreak > 0 Then
        $iTextTop += 15
        $iTextBottom = $iTextTop + $iHeightText +15
        If $iTextBottom < 100 Then
            $iTextTop += (100-$iTextBottom)/2
            $iTextBottom = 100
        Else
            $iHeight += ($iTextBottom-100)
        EndIf
    EndIf
    $_iTimeout = $_iTimeout < 0 ? $GCB_U_TIMEOUT_DEF : $_iTimeout
    $_BGRtitle = $_BGRtitle = -1 ? $GCB_U_BGR_TITLE : $_BGRtitle
    $_BGRtext = $_BGRtext = -1 ? $GCB_U_BGR_TEXT : $_BGRtext
    $_iTimeCounter = $_iTimeCounter = -1 ? $GCB_U_TIME_COUNTER : $_iTimeCounter
    $_fRotate = (String($_fRotate) = 'True' Or String($_fRotate) = 1) ? True : False
    If $_hWnd <> 'None' Then
        Local $aV = $aBusyCtrl[11]
        Local $aVertex[2][3] = [[0, 0, ($_RGBtopleft = 'None' ? $aV[0][2] : ($_RGBtopleft = -1 ? $GCB_U_RGB_TOPLEFT : $_RGBtopleft))], _
                          [$iWidth, $iHeight, ($_RGBbottomright = 'None' ? $aV[1][2] : ($_RGBbottomright = -1 ? $GCB_U_RGB_BOTRIGHT : $_RGBbottomright))]]
    Else
        Local $aVertex[2][3] = [[0, 0, ($_RGBtopleft = -1 ? $GCB_U_RGB_TOPLEFT : $_RGBtopleft)], _
                                [$iWidth, $iHeight, ($_RGBbottomright = -1 ? $GCB_U_RGB_BOTRIGHT : $_RGBbottomright)]]
    EndIf

    ; Create GUI
    If $_iX = -1 Then $_iX = Int(@DesktopWidth/2 - $iWidth/2)
    If $_iY = -1 Then $_iY = Int(@DesktopHeight/2 - $iHeight/2)
    If $_hWnd <> 'None' Then
        If $_sTitle <> 'None' Then WinSetTitle($_hWnd, '', $_sTitle)
        If ($iWidth <> $aBusyCtrl[2] Or $iHeight <> $aBusyCtrl[3] Or $_iX <> 'None' Or $_iY <> 'None') Then
            WinMove($_hWnd, '', ($_iX <> 'None' ? $_iX : $aBusyCtrl[4]), ($_iY <> 'None' ? $_iY : $aBusyCtrl[5]), $iWidth, $iHeight)
        EndIf
        $hForm = $_hWnd
    Else
        $hForm = GUICreate($_sTitle, $iWidth, $iHeight, $_iX, $_iY, $WS_POPUP, $WS_EX_CONTROLPARENT)
        GUISetIcon($__sPathIcon, Default, $hForm)
    EndIf

    ;    0     1      2      3     4  5     6        7         8          9           10       11       12         13         14         15          16        17       18        19
    ; [Title, Text, Width, Height, X, Y, Timeout, BGRtitle, BGRtext, iTimeCounter, fRotate, aVertex, LenTitle, iLineBreak, iTextTop, iTextBottom, TimeStamp, fBrake, fNewText, iDiffSecLast]
    Local $aTmp[20] = [$_sTitle, $_sText, $iWidth, $iHeight, $_iX, $_iY, $_iTimeout, $_BGRtitle, $_BGRtext, $_iTimeCounter, $_fRotate, $aVertex, $iLenTitle, $iLineBreak, $iTextTop, $iTextBottom, 0, False, False, $iDiffSecLast]
    If $_hWnd <> 'None' Then
        $aTmp[16] = $aBusyCtrl[16]
        $aTmp[18] = True   ; new stuff to draw
    EndIf
    __ManageCtrl($hForm, 'set', $aTmp)
    Return $hForm
EndFunc  ;==>__GUICreate

; #FUNCTION# ====================================================================================================================
; Name ..........: __GuiCtrlBusy_Set
; Description ...: Wird aufgerufen durch alle _Set-Funktionen
; Syntax ........: __GuiCtrlBusy_Set($_hWnd, $_sParamValue[, $_sDelim = '|'])
; Parameters ....: $_hWnd               - Das Handle des Ctrl.
;                  $_sParamValue        - Parameterstring. "Parameter1=Wert|Parameter2=Wert|.."
;                        mögliche Parameter:
;                        sTitle, sText, iX, iY, iTimeout, RGBtopleft, RGBbottomright, BGRtitle, BGRtext, iTimeCounter, fRotate
;                  $_sDelim             - [optional] Trennzeichen zwischen den Parametern. Standard ist '|'.
; Return values .: None
; Author ........: BugFix
; ===============================================================================================================================
Func __GuiCtrlBusy_Set($_hWnd, $_sParamValue, $_sDelim='|')
    Local Static $aAllParam[11] = ['sTitle', 'sText', 'iX', 'iY', 'iTimeout', 'RGBtopleft', 'RGBbottomright', 'BGRtitle', 'BGRtext', 'iTimeCounter', 'fRotate']
    Local $aCall[11]
    Local $aParamSet = StringSplit($_sParamValue, $_sDelim), $aKeyVal
    For $i = 0 To 10
        For $j = 1 To $aParamSet[0]
            $aKeyVal = StringSplit($aParamSet[$j], '=')
            If $aKeyVal[0] = 1 Then ContinueLoop
            If $aKeyVal[1] = $aAllParam[$i] Then
                $aCall[$i] = $aKeyVal[2]
                If $aKeyVal[1] = 'iTimeout' Then    ; timeout to set is > safety timeout --> increase safety timeout
                    If Int($aKeyVal[2]) > $GCB_U_TIMEOUT_ZERO Then $GCB_U_TIMEOUT_ZERO = Int($aKeyVal[2])
                EndIf
                ExitLoop
            Else
                $aCall[$i] = 'None'
            EndIf
        Next
    Next
    If StringInStr($_sParamValue, 'iTimeout=') Or StringInStr($_sParamValue, 'iTimeCounter=') Then
        Local $aBusyCtrl = __ManageCtrl($_hWnd)
        $aBusyCtrl[16] = 0
        __ManageCtrl($_hWnd, 'set', $aBusyCtrl)
    EndIf
    __GUICreate($aCall[0], $aCall[1], $aCall[2], $aCall[3], $aCall[4], $aCall[5], $aCall[6], $aCall[7], $aCall[8], $aCall[9], $aCall[10], $_hWnd)
EndFunc  ;==>__GuiCtrlBusy_Set

Func __ManageCtrl($_hWnd=-1, $_sAction='get', $_aValue='')
    Local Static $aCtrl[1][2] = [[0]]
    Local $iIndex = -1
    If $aCtrl[0][0] > 0 Then
        For $i = 1 To $aCtrl[0][0]
            If $_hWnd = -1 Then
                _Timer_KillAllTimers($aCtrl[$i][0])
                GUIDelete($aCtrl[$i][0])
            Else
                If $aCtrl[$i][0] = $_hWnd Then
                    $iIndex = $i
                    ExitLoop
                EndIf
            EndIf
        Next
    EndIf
    Switch $_sAction
        Case 'del'
            If $aCtrl[0][0] > 0 Then
                $aCtrl[$iIndex][0] = $aCtrl[$aCtrl[0][0]][0]
                $aCtrl[$iIndex][1] = $aCtrl[$aCtrl[0][0]][1]
            EndIf
            $aCtrl[0][0] -= 1
            ReDim $aCtrl[$aCtrl[0][0]+1][2]
        Case 'get'
            If $iIndex = -1 Then Return SetError(1,0,0)
            Return $aCtrl[$iIndex][1]
        Case 'set'
            If $iIndex = -1 Then
                $aCtrl[0][0] += 1
                ReDim $aCtrl[$aCtrl[0][0]+1][2]
                $aCtrl[$aCtrl[0][0]][0] = $_hWnd
                $aCtrl[$aCtrl[0][0]][1] = $_aValue
            Else
                $aCtrl[$iIndex][1] = $_aValue
            EndIf
    EndSwitch
EndFunc  ;==>__ManageCtrl

Func __CallbackDrawBusy($hWnd, $iMsg, $iIDTimer, $iTime)
    #forceref $hWnd, $iMsg, $iIDTimer, $iTime
    ;    0     1      2      3     4  5     6        7         8          9          10       11      12          13         14         15          16        17       18          19
    ; [Title, Text, Width, Height, X, Y, Timeout, BGRtitle, BGRtext, iTimeCounter, fRotate, aVertex, LenTitle, iLineBreak, iTextTop, iTextBottom, TimeStamp, fBrake, $fNewText, iDiffSecLast]
    Local $aBusyCtrl = __ManageCtrl($hWnd)
    If @error Then Return
    Local $iTimeStamp = $aBusyCtrl[16]
    If $iTimeStamp = 0 Then
        $aBusyCtrl[16] = $iTime
        GUISetState(@SW_SHOW, $hWnd)
    EndIf
    If $aBusyCtrl[17] Or $iTime - $aBusyCtrl[16] >= ($aBusyCtrl[6] = 0 ? $GCB_U_TIMEOUT_ZERO : $aBusyCtrl[6])*1000 Then ; brake by script OR timeout/safety timeout ended
        _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)
        Local $tNMHDR = DllStructCreate($tagNMHDR)
        DllStructSetData($tNMHDR, "hWndFrom", $hWnd)
        DllStructSetData($tNMHDR, "Code", $GCB_CLOSED)
        Local $hWndRCV = $GCB_RECEIVE_HWND = 0 ? WinGetHandle('[ACTIVE]') : $GCB_RECEIVE_HWND
        Return _SendMessage($hWndRCV, $WM_NOTIFY, $hWnd, DllStructGetPtr($tNMHDR))
    EndIf

    Local $iDiffSec = Int(($iTime-$aBusyCtrl[16])/1000)
    Local $fRedraw = False, $fStore = False

    If $iTimeStamp = 0 Then   ; 1st draw
        $fRedraw = True
    Else
        ; must counted countdown (and/or shown in text) - only if different seconds
        If $aBusyCtrl[9] = 1 Or StringInStr($aBusyCtrl[1], '%C%') Then
            If $iDiffSec <> $aBusyCtrl[19] Then
                $fRedraw = True
                $aBusyCtrl[19] = $iDiffSec
                $fStore = True
            EndIf
        EndIf
        ; must show time OR some changes in text
        If $aBusyCtrl[9] = 2  Or $aBusyCtrl[18] Then $fRedraw = True
    EndIf
    If Not $fRedraw Then Return  ; no redraw required

    Local $hRgn = _WinAPI_CreateRoundRectRgn(0, 0, $aBusyCtrl[2], $aBusyCtrl[3], 15, 15)
    _WinAPI_SetWindowRgn($hWnd, $hRgn)

    ; Create gradient
    Local $hDC = _WinAPI_GetDC($hWnd)
    Local $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $aBusyCtrl[2], $aBusyCtrl[3])
    Local $hDestDC = _WinAPI_CreateCompatibleDC($hDC)
    Local $hDestSv = _WinAPI_SelectObject($hDestDC, $hBitmap)
    _WinAPI_GradientFill($hDestDC, $aBusyCtrl[11], 0, 1, $aBusyCtrl[10])

    ; Draw Title (& Countdown/Time) & Line & Text
    ; Title
    Local $hFontTitle = _WinAPI_CreateFont(16, 0, 0, 0, 600, False, False, False, $DEFAULT_CHARSET, _; <-- Edit:Zeitriss
            $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, 'Microsoft Sans Serif')
    Local $hOldFont = _WinAPI_SelectObject($hDestDC, $hFontTitle); <-- Edit:Zeitriss
    _WinAPI_SetTextColor($hDestDC, $aBusyCtrl[7])
    _WinAPI_SetBkMode($hDestDC, $TRANSPARENT)
    Local $tRECT = DllStructCreate($tagRect)
    DllStructSetData($tRECT, "Left", $GCB_U_TEXT_MARGIN)
    DllStructSetData($tRECT, "Top", 5)
    DllStructSetData($tRECT, "Right", $aBusyCtrl[12]+20)
    DllStructSetData($tRECT, "Bottom", 30)
    _WinAPI_DrawText($hDestDC, $aBusyCtrl[0], $tRECT, BitOR($DT_VCENTER,$DT_LEFT,$DT_SINGLELINE))

    ; Countdown / Time
    Local $sCounterTime = ''
    If $aBusyCtrl[9] = 1 And $aBusyCtrl[6] > 0 Then ; show countdown (needs timeout > 0)
;~         $sCounterTime = $aBusyCtrl[6]-$iDiffSec
        $sCounterTime = __FormatSeconds($aBusyCtrl[6]-$iDiffSec)
    ElseIf $aBusyCtrl[9] = 2 Then                   ; show time
        $sCounterTime = StringFormat('%02d:%02d:%02d', @HOUR, @MIN, @SEC)
    EndIf
    If $sCounterTime <> '' Then
        $tRECT = DllStructCreate($tagRect)
        DllStructSetData($tRECT, "Left", $aBusyCtrl[2]-(105 + $GCB_U_TEXT_MARGIN))   ; to show "2 d / 23:59:59 h"
        DllStructSetData($tRECT, "Top", 5)
        DllStructSetData($tRECT, "Right", $aBusyCtrl[2]-$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, $aBusyCtrl[7])
    Local $oOld = _WinAPI_SelectObject($hDestDC, $hPen)
    _WinAPI_DrawLine($hDestDC, 3, 30, $aBusyCtrl[2]-6, 30)

    ; Text
    Local $hFontText = _WinAPI_CreateFont(19, 0, 0, 0, 400, False, False, False, $DEFAULT_CHARSET, _; <-- Edit:Zeitriss
            $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, 'Microsoft Sans Serif')
    _WinAPI_SelectObject($hDestDC, $hFontText); <-- Edit:Zeitriss
    _WinAPI_SetTextColor($hDestDC, $aBusyCtrl[8])
    $tRECT = DllStructCreate($tagRect)
    DllStructSetData($tRECT, "Left", 0)
    DllStructSetData($tRECT, "Top", $aBusyCtrl[14])
    DllStructSetData($tRECT, "Right", $aBusyCtrl[2])
    DllStructSetData($tRECT, "Bottom", $aBusyCtrl[15])
    Local $iFlag = $aBusyCtrl[13] = 0 ? BitOR($DT_VCENTER,$DT_CENTER,$DT_SINGLELINE) : $DT_CENTER
    Local $sText = $aBusyCtrl[1]
    If StringInStr($sText, '%C%') And $aBusyCtrl[6] > 0 Then $sText = StringReplace($sText, '%C%', __FormatSeconds($aBusyCtrl[6]-$iDiffSec))
    _WinAPI_DrawText($hDestDC, $sText, $tRECT, $iFlag)

    _WinAPI_BitBlt($hDC, 0, 0, $aBusyCtrl[2], $aBusyCtrl[3], $hDestDC, 0, 0, $SRCCOPY)

    _WinAPI_SelectObject($hDestDC, $hOldFont)
    _WinAPI_SelectObject($hDestDC, $oOld)
    _WinAPI_DeleteObject($hFontTitle); <-- Edit:Zeitriss
    _WinAPI_DeleteObject($hFontText); <-- Edit:Zeitriss
    _WinAPI_DeleteObject($hPen)
    _WinAPI_SelectObject($hDestDC, $hDestSv)
    _WinAPI_DeleteDC($hDestDC)
	_WinAPI_ReleaseDC($hWnd, $hDC); <-- Edit:Zeitriss
	_WinAPI_DeleteObject($hBitmap); <-- Edit:Zeitriss
	_WinAPI_DeleteObject($oOld); <-- Edit:Zeitris
    _WinAPI_DeleteObject($hRgn)

    ; 1st call: set timer intervall
    If $iTimeStamp = 0 Then _Timer_SetTimer($hWnd, $GCB_U_CALLBACK_FRQ, '__CallbackDrawBusy', $iIDTimer)

    ; 1st call OR user-set OR setOnTop: rewrite Ctrl-Array
    If $iTimeStamp = 0 Or $aBusyCtrl[18] Or $fStore Then
        $aBusyCtrl[18] = False
        __ManageCtrl($hWnd, 'set', $aBusyCtrl)
    EndIf
EndFunc  ;==>__CallbackDrawBusy

Func __GetTextMeasure($sText, $iSize=8.5, $iStyle=0, $sFont='Microsoft Sans Serif')
;~     _GDIPlus_Startup()
    Local $hGUI = GUICreate("", 800, 300)
    GUISetState(@SW_HIDE, $hGUI)
    Local $hFormat = _GDIPlus_StringFormatCreate(0)
    Local $hFamily = _GDIPlus_FontFamilyCreate($sFont)
    Local $hFont = _GDIPlus_FontCreate($hFamily, $iSize, $iStyle, 3)
    Local $tLayout = _GDIPlus_RectFCreate(0, 0, 0, 0)
    Local $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    Local $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $sText, $hFont, $tLayout, $hFormat)
    Local $iWidth = Ceiling(DllStructGetData($aInfo[0], "Width"))
    Local $iHeight = Ceiling(DllStructGetData($aInfo[0], "Height"))
    _GDIPlus_StringFormatDispose($hFormat)
    _GDIPlus_FontDispose($hFont)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_GraphicsDispose($hGraphic)
;~     _GDIPlus_ShutDown()
    GUIDelete($hGUI)
    Local $aOut[2] = [$iHeight,$iWidth]
    Return $aOut
EndFunc  ;==>__GetTextMeasure

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

#endregion