- Offizieller Beitrag
Am Anfang wollte ich eigentlich nur das Splashtext-Ctrl aufhübschen. Aber dann störte mich z.B., dass es nur in einer Instanz laufen kann. Es ist aber ganz nützlich die Möglichkeit zu haben, Werte aus verschachtelten Schleifen unabhängig parallel anzuzeigen.
Und so bastelte ich dann ein neues Control, GuiControlBusy. Mit den folgenden Eigenschaften:
- mehrere Control gleichzeitig
- das Control besteht bis zum Beenden per Skript oder Ablauf des Timeouts (wenn gesetzt) oder Ablauf des Sicherheitstimeouts
- Titelleiste (Titel und optional Countdown oder Zeitanzeige), Countdownanzeige erfordert gesetzten Timeout (in Sekunden, Anzeige wird formatiert "1 d / 23:59:59 h")
- Trennlinie in derselben Farbe wie Titelleiste
- Text in eigener Farbe. Wenn Timeout gesetzt, kann Countdown im Text mit Platzhalter %C% angezeigt werden. Zeilenumbruch kann mit \n im Text dargestellt werden
- Font und Größe sind fix
- Größe des Controls passt sich dem Titel/Text an
- Hintergrund wird mit Farbverlauf von oben nach unten (Standard) oder von links nach rechts gefärbt
- alle Ctrl-Parameter können zur Laufzeit verändert werden (Titel, Text, Timeout, Countdown, Farben, Position, OnTop)
- Wenn das Ctrl geschlossen wird, wird WM_NOTIFY mit eigenem iCode gesendet (nicht wenn alle Ctrl geschlossen werden z.B. bei Skriptende)
Eigentlich bin ich mit dem Ergebnis recht zufrieden. Aber ein Wermutstropfen:
Ich kann es nich gewollt reproduzieren, aber ab und an werden offene Ctrl plötzlich nicht weiter gezeichnet und sind nur noch weiße Rechtecke.
Da es nur sporadisch auftritt, habe ich bisher keine echte Möglichkeit gefunden nach der Ursache zu suchen. Vielleicht findet ihr beim Probieren des Übels Wurzel.
Bis dahin gilt für dieses Ctrl leider nur: bedingt tauglich - aber vorenthalten will ich es euch trotzdem nicht.
So sieht es aus:
control-busy.png
Hier mal die zur Verfügung stehenden Funktionen:
Spoiler anzeigen
; 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).
; Name ..........: _GuiCtrlBusy_Close
; Description ...: Beendet ein/alle Busy-Ctrl
; Name ..........: _GuiCtrlBusy_SetTitle
; Description ...: Für ein existierendes Ctrl Ändern von Titel, Countdown, Timeout, Titelfarbe
; Name ..........: _GuiCtrlBusy_SetText
; Description ...: Für ein existierendes Ctrl Ändern von Text, Textfarbe
; Name ..........: _GuiCtrlBusy_SetColors
; Description ...: Für ein existierendes Ctrl Ändern aller Farbwerte
; Name ..........: _GuiCtrlBusy_SetPos
; Description ...: Für ein existierendes Ctrl Ändern der Position (X, Y)
; Name ..........: _GuiCtrlBusy_SetTimeout
; Description ...: Für ein existierendes Ctrl Setzen des Timeout
; Name ..........: _GuiCtrlBusy_SetOnTop
; Description ...: Setzt ein existierendes Ctrl OnTop
; Name ..........: _GuiCtrlBusy_SetGradient
; Description ...: Für ein existierendes Ctrl Ändern der Farbverlaufeinstellungen
; Name ..........: _GuiCtrlBusy_UserDefaults
; Description ...: Setzen von benutzerdefinierten Standardwerten oder Zurücksetzen auf Programmstandards
; 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.
Alles anzeigen
Und hier ein Mini-Testskript.
Spoiler anzeigen
#include 'GuiCtrlBusy.au3'
$hWnd = GUICreate('Test', 300, 250, -1, 400)
GUICtrlCreateLabel('Mit Schliessen des Fensters' & @LF & @LF & 'werden alle BusyCtrl beendet.', 30, 30)
GUISetState()
; $_sTitle, $_sText, $_iX, $_iY, $_iTimeout, $_iTimeCounter, $_BGRtitle, $_BGRtext, $_RGBtopleft, $_RGBbottomright, $_fRotate
$hBusy1 = _GuiCtrlBusy_Create('Nr 1', 'Titel && Countdown\nScheme: Clouds', 100, 50, 15) ; the default color scheme
$hBusy2 = _GuiCtrlBusy_Create('Nr 2', 'Titel && Countdown\nScheme: Coffee', 480, 50, 10, -1, 0xE9F1FF, 0xE9F1FF, 0x000000, 0xFDEADF)
$hBusy3 = _GuiCtrlBusy_Create('Nr 3', 'Nur Titel\nScheme: Darkness', 860, 50, 0, 1, 0xD4D4DE, 0xD4D4DE, 0x000000, 0x666666, True)
$hBusy4 = _GuiCtrlBusy_Create('Nr 4', 'Nur Titel\nScheme: Silver', 1240, 50, 0, 1, 0xF6F6F6, 0x0A0A0B, 0x666666, 0xDDDDDD, True)
$hBusy5 = _GuiCtrlBusy_Create('Nr 5', 'Titel && Zeit\nScheme: Cacao', 100, 200, 0, 2, 0xE6E6FF, 0x0092FF, 0x460000, 0xC06565)
$hBusy6 = _GuiCtrlBusy_Create('Nr 6', 'Titel && Zeit\nScheme: Midnight', 480, 200, 0, 2, 0xF6DCE1, 0x180508, 0x1C0E5D, 0xDFD8FE)
$hBusy7 = _GuiCtrlBusy_Create('Nr 7', 'Titel && Zeit\nScheme: Forest', 860, 200, 0, 2, 0xEFFBE8, 0x0C1F01, 0x005C1F, 0xC5E0CE)
$hBusy8 = _GuiCtrlBusy_Create('Nr 8', 'Titel && Zeit\nScheme: Orange', 1240, 200, 0, 2, 0xDCEEFA, 0x000F80, 0xE28304, 0xFFDBAB)
GuiRegisterMsg($WM_NOTIFY, '_WM_NOTIFY')
While 1
Switch GUIGetMsg()
Case -3
Exit
EndSwitch
WEnd
Func _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
Local $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
Local $hWndFrom = DllStructGetData($tNMHDR, "hWndFrom")
Local $iCode = DllStructGetData($tNMHDR, "Code")
If $iCode = $GCB_CLOSED Then
Switch $hWndFrom
Case $hBusy1
ConsoleWrite('$hBusy1 - CLOSED' & @CRLF)
Case $hBusy2
ConsoleWrite('$hBusy2 - CLOSED' & @CRLF)
EndSwitch
EndIf
EndFunc
Alles anzeigen