- Offizieller Beitrag
2017-10-26: FINAL v1.0
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-ID) 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.
Funktionsliste
_GuiCtrlBusy_Create([$_sTitle=''[, $_sText=''[, $_iAlign=2[, $_iX=-1[, $_iY=-1[, $_iTimeout=-1[, $_iTimeCounter=-1[, $_BGRtitle=-1[, $_BGRtext=-1[, $_RGBtopleft=-1[, $_RGBbottomright=-1[, $_bRotate=False]]]]]]]]]]]])
Ctrl erstellen
_GuiCtrlBusy_Close([$_hWnd=-1])
Ein/alle Ctrl beenden
_GuiCtrlBusy_SetTitle($_hWnd, $_sTitle=''[, $_iTimeCounter=''[, $_iTimeout=''[, $_BGRtitle=''[, $_bSetOnTop='']]]])
Einstellungen Titelzeile: Titel, Anzeige: nur Titel/Titel und Zeit/Titel und Countdown, Timeout, Farbe, ontop.
_GuiCtrlBusy_SetIcon($_hWnd, $_sIconFile=''[, $_iIconID])
Icon setzen aus *.dll/*.ico Datei. Mit Leerstring "shell32.dll".
_GuiCtrlBusy_SetText($_hWnd, $_sText=''[, $_BGRtext=''[, $_iSize=''[, $_iStyle=''[, $_sFontname=''[,$_iAlign=''[, $_bSetOnTop='']]]]]])
Setzen Text /~farbe /~größe /~stil /~font, opt. ontop
_GuiCtrlBusy_SetCBInterval($_hWnd[, $_iInterval=$GCB_U_CALLBACK_INTERVAL[, $_bNoReCalc=False]])
Setzen individuelles Callback Intervall, opt. stoppen Neuberechnung Ctrl-Größe.
_GuiCtrlBusy_StopRecalc($_hWnd[, $_bNoReCalc=True])
Stoppt (oder erlaubt) Neuberechnung Ctrl-Größe bei Änderung von Text oder Titel.
_GuiCtrlBusy_SetColors($_hWnd, $_BGRtitle=''[, $_BGRtext=''[, $_RGBtopleft=''[, $_RGBbottomright='']]])
Setzen Titel/Text/Farbverlauf Farben.
_GuiCtrlBusy_SetGradient($_hWnd, $_RGBtopleft=''[, $_RGBbottomright=''[, $_bRotate='']])
Setzen Farben Farbverlauf und Richtung
_GuiCtrlBusy_SetScheme($_hWnd[, $_sScheme=''[, $_bRotate=''[, $_bSetOnTop='']]])
Setzen von Farbschema / Richtung, optional ontop.
_GuiCtrlBusy_GetScheme($_sScheme='')
Rückgabe Array mit einem oder allen Farbschemata.
_GuiCtrlBusy_AddScheme($_sScheme, $_RGBtopleft, $_RGBbottomright, $_BGRtitle, $_BGRtext)
Hinzufügen neuer Farbschemata, nur gültig zur Laufzeit
_GuiCtrlBusy_SetPos($_hWnd, $_iX=''[, $_iY=''[, $_bSetOnTop='']])
Bewegen des Ctrl an x/y Position, optional ontop.
_GuiCtrlBusy_SetTimeout($_hWnd, $_iTimeout, $_iTimeCounter)
Setzen/Beenden des Timeout, switchen der Ansicht.
_GuiCtrlBusy_SetOnTop([$_hWnd=-1])
Setzt ein (Standard: alle) Ctrl ontop.
_GuiCtrlBusy_UserDefaults($_sParamValue[, $_sDelim='|'])
Ändern der Voreinstellungen (Standardwerte) für die Ctrl-Erstellung.
_GuiCtrlBusy_GetClosed()
Dummy-ID abfragen, die ausgelöst wird, wenn ein Ctrl geschlossen wird. Mit "GuiCtrlRead(Dummy)" ist das Ctrl-Handle des geschlossenen Ctrl auslesbar.
Testcode
#include "GuiCtrlBusy.au3"
#Region
; Creates an Busy control.
; _GuiCtrlBusy_Create ([$_sTitle = ''[, $_sText = ''[, $_iAlign=2[, $_iX = -1[, $_iY = -1[, $_iTimeout = -1[, $_iTimeCounter = -1[, $_BGRtitle = -1[, $_BGRtext = -1
; [, $_RGBtopleft = -1[, $_RGBbottomright = -1[, $_bRotate = False]]]]]]]]]]]])
; Close one/all controls.
; _GuiCtrlBusy_Close ([$_hWnd = -1])
; Für die Manipulation von Ctrl gilt einheitlich:
; optionale Parameter --> "Leerstring"="Wert wird beibehalten", "-1"="USER_DEFAULT" oder der übergebene Wert
; Sets for title line: title, show:nothing(0)/countdown(1)/clocktime(2), timeout, color.
; _GuiCtrlBusy_SetTitle ($_hWnd, $_sTitle = ''[, $_iTimeCounter = ''[, $_iTimeout = ''[, $_BGRtitle = ''[, $_bSetOnTop = '']]]])
; Sets icon from any *.dll/*.ico file.
; _GuiCtrlBusy_SetIcon ($_hWnd, $_sIconFile=''[, $_iIconID])
; Sets text /~color /~size /~style /~font.
; _GuiCtrlBusy_SetText ($_hWnd, $_sText = ''[, $_BGRtext = ''[, $_iSize=''[, $_iStyle=''[, $_sFontname=''[, $_bSetOnTop = '']]]]])
; Sets an individual callback interval, opt. stops recalculation of ctrl size.
; _GuiCtrlBusy_SetCBInterval($_hWnd[, $_iInterval=$GCB_U_CALLBACK_INTERVAL[, $_bNoReCalc=False]])
; Stops (or allows) recalculation of control size while text or title is changed.
; _GuiCtrlBusy_StopRecalc ($_hWnd[, $_bNoReCalc=True])
;Sets title/text/gradient colors.
; _GuiCtrlBusy_SetColors ($_hWnd, $_BGRtitle = ''[, $_BGRtext = ''[, $_RGBtopleft = ''[, $_RGBbottomright = '']]])
; Sets gradient colors and direction.
; _GuiCtrlBusy_SetGradient ($_hWnd, $_RGBtopleft = ''[, $_RGBbottomright = ''[, $_bRotate = '']])
; Sets color-scheme/gradient-direction/optional ontop.
; _GuiCtrlBusy_SetScheme ($_hWnd[, $_sScheme = ''[, $_bRotate = ''[, $_bSetOnTop = '']]])
; Gets array of one or all color schemes.
; _GuiCtrlBusy_GetScheme ($_sScheme='')
; Adds a new color scheme, only valid at runtime.
; _GuiCtrlBusy_AddScheme ($_sScheme, $_RGBtopleft, $_RGBbottomright, $_BGRtitle, $_BGRtext)
; Moves the control to x/y position, optional set ontop.
; _GuiCtrlBusy_SetPos ($_hWnd, $_iX = ''[, $_iY = ''[, $_bSetOnTop = '']])
; Sets/Stops the control timeout.
; _GuiCtrlBusy_SetTimeout ($_hWnd, $_iTimeout, $_iTimeCounter)
; Sets one (default: all) control on top.
; _GuiCtrlBusy_SetOnTop ([$_hWnd = -1])
; Changes the default values for control creation.
; _GuiCtrlBusy_UserDefaults($_sParamValue[, $_sDelim = '|'])
; Gets a Dummy-ID, that will fired by closing ctrl. Use "GuiCtrlRead(Dummy)" to get Ctrl-hWnd.
; _GuiCtrlBusy_GetClosed ()
#endregion
Opt('GUIOnEventMode', 1)
Global $gClicked = False
$hGui = GUICreate('Test', 300, 250, 100, 100)
GUISetOnEvent(-3, '_close')
GUICtrlCreateLabel('Mit Schliessen dieses Fensters' & @LF & @LF & 'werden alle BusyCtrl beendet.', 30, 30)
$bt1 = GUICtrlCreateButton('Intervall Nr 6', 10, 100, 120, 20)
GUICtrlSetOnEvent(-1, '_onButton')
$bt2 = GUICtrlCreateButton('Font/Style Nr 7', 10, 130, 120, 20)
GUICtrlSetOnEvent(-1, '_onButton')
$bt3 = GUICtrlCreateButton('Countdown Nr 6', 10, 160, 120, 20)
GUICtrlSetOnEvent(-1, '_onButton')
$bt4 = GUICtrlCreateButton('New Scheme Nr 7', 10, 190, 120, 20)
GUICtrlSetOnEvent(-1, '_onButton')
GUISetState()
; Icon List: http://help4windows.com/windows_7_shell32_dll.shtml
$hBusy0 = _GuiCtrlBusy_Create() ; all params as default
$hBusy1 = _GuiCtrlBusy_Create('Nr 1 und der Titel muss jetzt lang sein', 'Titel && Countdown: %C%\nScheme: Clouds', 2, 420, 50, 50, 0) ; the default color scheme
$hBusy2 = _GuiCtrlBusy_Create('Nr 2', 'Titel && Countdown\nCountdown: %C%\nScheme: Coffee', 2, 800, 50, 10, -1, 'coffee')
$hBusy3 = _GuiCtrlBusy_Create('Nr 3', 'Titel && Zeit\nMal etwas in die Breite gezogen Scheme: Darkness', 2, 420, 200, 0, 2, 'darkness', True)
$hBusy4 = _GuiCtrlBusy_Create('Der Titel ist mal deutlich länger und länger', 'Nur Titel\nScheme: Silver\nlinks', 0, 800, 200, 0, 0, 'silver', True)
$hBusy5 = _GuiCtrlBusy_Create('Nr 5', 'Titel && Zeit\nScheme: Fire\nrechts\nIntervall 2s', 1, 100, 400, 0, 2, 'fire')
_GuiCtrlBusy_SetCBInterval($hBusy5, 2000) ; alle 2s aktualisieren
_GuiCtrlBusy_SetIcon($hBusy5, 'moricons.dll', 7)
$hBusy6 = _GuiCtrlBusy_Create('Nr 6', 'Titel && Zeit\nScheme: Sys_invers\nmitte\nIntervall 3s', 2, 420, 400, 0, 2, 'sys_invers')
_GuiCtrlBusy_SetCBInterval($hBusy6, 3000) ; alle 3s aktualisieren
_GuiCtrlBusy_StopRecalc($hBusy6)
$hBusy7 = _GuiCtrlBusy_Create('Nr 7', 'Titel && Zeit\nScheme: Orange\nund eine Zeile #3\nund auch noch eine Zeile #4',-1, 100, 550, 0, 2, 'orange', True)
; Dummy-Ctrl, das befeuert wird wenn ein Busy-Ctrl geschlossen wird. Das Ctrl-Handle ist mit "GuiCtrlRead(Dummy)" auslesbar
$cClosed = _GuiCtrlBusy_GetClosed()
GUICtrlSetOnEvent(-1, '_onButton')
While 1
Sleep(50)
WEnd
Func _onButton()
Switch @GUI_CtrlId
Case $bt1 ; $_hWnd, $_sTitle='', $_iTimeCounter='', $_iTimeout='', $_BGRtitle='', $_bSetOnTop=''
_GuiCtrlBusy_SetCBInterval($hBusy6, 1000)
_GuiCtrlBusy_SetText ($hBusy6, 'Intervall geändert\n1 Sekunde')
Case $bt2 ; $_hWnd, $_sText='', $_BGRtext='', $_iSize='', $_iStyle='', $_sFontname='', $_bSetOnTop=''
_GuiCtrlBusy_SetText ($hBusy7, '', '', 16, 1+4, 'Comic Sans MS')
Case $bt3 ; $_hWnd, $_iTimeout, $_iTimeCounter=1
If $gClicked Then
_GuiCtrlBusy_SetTimeout($hBusy6, 0, 2)
GUICtrlSetData($bt3, 'Countdown Nr 6')
Else
_GuiCtrlBusy_SetTimeout($hBusy6, 20, 1)
GUICtrlSetData($bt3, 'Stop Countdown 6')
EndIf
$gClicked = Not $gClicked
Case $bt4 ; $_hWnd, $_sScheme='', $_bRotate='', $_bSetOnTop=''
_GuiCtrlBusy_SetScheme($hBusy7, 'forest')
_GuiCtrlBusy_SetText($hBusy7, 'New Scheme\n"Forest"')
Case $cClosed
Switch GUICtrlRead($cClosed)
Case $hBusy0
ConsoleWrite('Busy-Ctrl "$hBusy0" beendet' & @CRLF)
Case $hBusy1
ConsoleWrite('Busy-Ctrl "$hBusy1" beendet' & @CRLF)
Case $hBusy2
ConsoleWrite('Busy-Ctrl "$hBusy2" beendet' & @CRLF)
Case $hBusy6
ConsoleWrite('Busy-Ctrl "$hBusy6" beendet' & @CRLF)
EndSwitch
EndSwitch
EndFunc
Func _close()
Exit
EndFunc
Alles anzeigen
Mit dem Standardintervall von 500 ms habe ich auch bei 10 zeitgleich offenen Ctrl und Neuberechnung der Ctrl-Größe bei jedem Aufruf (normalerweise erforderlich bei jeder Änderung von Text oder Titel) keine spürbare Belastung der CPU.
Viel Spaß damit.
alter Inhalt
Das Skript liegt bei mir nun schon seit Jan. 2016, jetzt poste ich es mal.
Ich betrachte es aber noch als Beta-Status. Einige Ideen zur Erweiterung habe ich noch. Vorerst möchte ich aber erst mal Folgendes abklären:
Bei mir tritt manchmal folgender Fehler auf. Wenn die Ctrl über lange Zeit stehen, werden diese plötzlich nicht mehr gezeichnet - werden weiß - und/oder das Programm friert ein.
Ich kann das an keiner Ursache festmachen. zumal es nicht immer auftritt.
Vielleicht kann das mal jemand austesten und berichten.
Achja, was macht das Ctrl:
- Ähnlich wie ein Tooltip, aber es können mehrere zeitgleich verwendet werden.
- Es kann als Countdown oder reine Anzeige genutzt werden.
- Verschieden Farbschemata sind vordefiniert (Farbverlauf, passende Textfarben).
- Schließt das Ctrl wird eine Msg an ein Fenster eigener Wahl (Standard das aktive Fenster) gesendet.
- Zur Laufzeit sind alle Einstellungen (Text/Titel/Farben) änderbar.
NEU
- Es kann ein ein Dummy-Ctrl erstellt werden, das beim Schließen der Ctrl befeuert wird (.._GetClosed() ). Das jeweilige Ctrl-Handle ist mit "GuiCtrlRead(Dummy)" auslesbar (s. Bsp)
FARBSCHEMA:
- Das Farbschema kann kpl. mit .._SetScheme() geändert werden
- Zur Laufzeit lassen sich eigene Farbschemata mit .._AddScheme() hinzufügen (keine dauerhafte Speicherung)
- Die Farbschemata lassen sich einzeln/alle als Array ausgeben mit .._GetScheme()
TEXT:
- Text kann links/rechts/zentriert angezeigt werden, Parameter Align bei Erstellung
- Änderung von Textgröße, Darstellung(und/oder): Normal,Fett/Kursiv/Unterstrichen/Durchgestrichen, Schriftart
ACHTUNG: Bei einigen Kombinationen von Schriftarten/ -größe und -darstellung ist die Größenberechnung fehlerhaft!
- Es kann geswitcht werden zwischen Anzeige Titel(und Zeit) oder Countdown - hin und her
- Die Textausrichtung ist auch nachträglich änderbar.
[EDIT 2017-10-20]
Ich habe das Skript kpl. überarbeitet. Die Erstellung und Verwaltung der Ctrl ist jetzt deutlich beschleunigt. Zugriffe erfolgen, da wo es möglich ist, ByRef. Integriert habe ich noch einen Kollisionsschutz, damit die Callbackfunktion nicht ausgeführt werden kann, während durch Nutzereingriff gerade Parameter geändert werden.
Aber ich habe noch folgendes Problem:
Speicherlecks treten nicht mehr auf, der genutzte Arbeitsspeicher während der Ausführung ist nahezu konstant. Aber obwohl das Skript fehlerfrei läuft (Countdown läuft runter, Uhrzeiten werden angezeigt) kann ich nach etwa zwei Minuten das Bsp-Skript nicht mehr schliessen. Keine erhöhte CPU-Nutzung, RAM auch OK. Es reagiert nur nicht.
Könnt ihr das bitte mal nachtesten?
[Edit im Edit] Nach Rechnerneustart tritt das Problem nicht mehr auf, da hatte wohl was anderes blockiert. - Für Rückmeldungen bin ich trotzdem dankbar.
P.S. Icon Integration ist vorgesehen, dazu muß aber erst mal alles konfliktfrei laufen.
[EDIT FARBSCHEMATA]
Ich habe noch 3 weitere Schema erstellt: 'fire', 'system' und 'sys_invers'
Ersetzt einfach die vorhandene Arraydeklaration mit der folgenden und kopiert noch die Funktion __RGB2BGR() in die UDF.
Integriert in aktueller Version
[EDIT 2]
Danke an Zeitriss für das Aufspüren eines Fehlers. Die Ctrl mit Uhrzeit wurden neugezeichnet, auch wenn keine Zeitänderung stattfand. Ist jetzt in v0.10 gefixed.
Der Code der UDF nur im Anhang (überschreitet die 100.000 Zeichen Grenze )