GUI-Referenz - GUI-Konzepte

AutoIt bietet die Möglichkeit, einfache grafische Benutzeroberflächen (Graphical User Interfaces, GUIs) zu erzeugen, die aus Fenstern und Controls (Steuerelementen) bestehen.

GUI-Konzepte

Ein GUI besteht aus einem oder mehreren Fenstern und jedes Fenster enthält ein oder mehrere Controls. GUIs sind "ereignisbasiert", d.h., sie reagieren auf Ereignisse - z.B. auf den Klick auf einen Button. Die meiste Zeit verbringt man damit, auf Ereignisse zu warten - anders als in normalen Skripten, in denen man selbst kontrolliert, was passiert und wann es passiert. Man stellt sich, wie wenn man an der Türe auf den Briefträger wartet - man sitzt da, bis ein Brief in den Briefkasten geworfen wird, holt ihn heraus und entscheidet dann, was man damit machen will. Genauso funktioniert ein GUI prinzipiell - man wartet darauf, dass der Briefträger zu einem kommt.

Natürlich kann man während das GUI läuft auch andere Aufgaben durchführen. Man könnte z. B. eine Fortschrittsanzeige in dem GUI realisieren, die den Fortschritt komplexer Skriptaktionen darstellt.

GUI-Controls

Alle Computer-Nutzer sind mit Controls vertraut. Alles, was man anklickt oder mit dem man interagiert, ist eine Art von einem Control. Alle in AutoIt verfügbaren Controls (die meisten kennt man aus anderen Windowsprogrammen) sind hier aufgelistet:

Funktion Erklärung Bild
  • Avi
Zeigt einen Videoclip im AVI-Format an.
  • Button
Eine einfache Schaltfläche. Durch Anklicken dieser Schaltfläche kann zum Beispiel ein Programm gestartet werden.
  • Checkbox
Ein Kontrollkästchen, das markiert sein kann oder nicht.
Sind mehrere Kontrollkästchen vorhanden, so können diese standardmäßig unabhängig voneinander an- oder abgehakt sein.
  • Combo
  • ComboBox
Ein Control (übersetzt heißt es Kombinationsfeld) mit einem Eingabefeld und einem ausklappbaren Auswahlmenü.
Durch einen Klick auf den Pfeil wird eine Liste mit dem Inhalt ausgeklappt.
Durch einen Klick auf einen Eintrag wird die Liste wieder zugeklappt und der Inhalt erscheint in dem Eingabefeld.
  • ContextMenu
Ein Menü, das erscheint, wenn man innerhalb des Fensters die rechte Maustaste betätigt.
  • Date
  • DTP (Date Time Picker)
Eine Datumsauswahl. Es kann zum Beispiel eingestellt werden, dass das Datum aus einem klassischen Kalender ausgewählt werden kann.
  • Dummy
Eine Control-Atrappe die benutzerdefiniert verwendet werden kann.
Ein Dummy-Control wird nur sehr selten verwendet.
Damit können zum Beispielen von mehreren Checkboxen auf einmal der Status geändert werden

  • Edit
  • RichEdit
Ein (mehrzeiliges) Eingabefeld, in das man Text eingeben kann.
  • Graphic
Ein Control welches Grafiken anzeigt.
  • Header
Dies sind einzelne Spaltenüberschriften. Man kann es auch als eine Art Überschrift bezeichnen.
  • Imagelist
Diese Bilderliste enthält mehrere Bilder die einem anderen Control zugewiesen werden können.
  • IP-Address
Durch dieses Control kann die IP-Adresse im gewöhnten Format eingegeben und dargestellt werden.
  • Icon
Ein statisches Control, welches ein Icon darstellt.
  • Input
Ein einzeiliges Eingabefeld, in das man Text eingeben kann.
Damit kann zum Beispiel die Eingabe von einem Benutzername und Passwort erfolgen. Das Passwort läßt sich dann auch mit Sternchen "verstecken".
  • Label
Ein statisches Control, welches eine einfache Beschriftungsfläche darstellt.
Diese kann zu Beginn auch leer sein und erst im Laufe des Skripts mit Text gefüllt werden.
  • List
  • Listbox
Eine Liste mit Inhalt. Dieses Listenfenster ähnelt sehr einem Edit-Control.
  • ListView
Ein Control, das Informationen in Spalten anzeigt. Die einzelnen Einträge (Elemente) heißen im englischen Items.
  • Menu
Ein Menü an der oberen Kante des Fensters (Hauptmenü) wie man es bei jedem Windows-Programm kennt.
  • Pic
Ein statisches Control, welches ein Bild darstellt.
Es kann zum Beispiel als Hintergrundbild der GUI dienen.
  • Progress
  • Progressbar
Ein Fortschrittsbalken, der zum Beispiel den Fortschritt einer Installation darstellen kann.
  • Radio
Ein Optionsfeld, das markiert sein kann oder nicht.
Sind mehrere Kontrollkästchen vorhanden, so kann standardmäßig nur eines davon markiert oder nicht markiert sein.
So kann zum Beispiel durch das markieren eines Optionsfeldes ein anderes die Markierung verlieren.
Werden Optionsfelder zu Gruppen zusammengefasst, so können in einer GUI mehrere Optionsfelder gleichzeitig markiert sein.
  • Rebar
Dies sind einzelne Gruppen (englisches Wort: band). Es können z. B. Buttons zusammengefasst werden und miteinander verschoben werden.
Jedoch können auch andere Controls wie zum Beispiel ein Edit-Control angelegt werden.
  • Scrollbar
Eine Bildlaufleiste mit der die GUI gescrollt werden kann und somit die GUI möglichst klein gehalten werden kann.
  • Slider
Ein Schieberegler, der der Lautstärkeregelung von Windows ähnelt.
Im englischen heißt der Bereich des Sliders Range.
  • Statusbar
Eine Statusleiste in der aktuelle Infos eingetragen werden können.
Im Explorer wird dort zum Beispiel angezeigt wie viele Objekte sich in dem aktuellen Ordner befinden.
Die einzelnen Abschnitte heißen im englischen "parts".
  • Tab
Ein Control mit Unterelementen, die auf Registerkarten platziert sind.
Dies ist sehr hilfreich, falls viele Controls vorhanden sind und die Größe der GUI begrenzt ist.
  • Toolbar
Ein Toolbar ist eine Werkzeugleiste mit verschiedenen Buttons.
  • ToolTip
Dies ist ein Hinweistext der erscheint, wenn man mit dem Cursor über dem gewünschten Control fährt.
Dadurch kann zum Beispiel die Funktion eines Buttons näher erläutert werden.
  • TreeView
Eine Strukturansicht, die der Baumdarstellung im Windows Explorer ähnelt. Die einzelnen Einträge heißen im englischen Items.
In diesem Zusammenhang tauchen auch folgende Wörter auf: parent = Eltern, child = Kind
  • UpDown
Pfeiltasten, die zu Textfeldern hinzugefügt werden können, um den Wert bequem zu vergrößern oder verkleinern.

Hier ein Beispiel eines einzigen GUI-Fensters, das viele der verfügbaren Controls enthält. Man sieht, dass selbst komplexe und detaillierte GUIs möglich sind!

Controls werden mit der GUICtrlCreate...-Funktionsgruppe erzeugt. Wenn ein Control erzeugt wird, wird eine Control-ID (Identifizierer des Controls) zurückgegeben. Das wichtigste, was man über diese Control-ID wissen muss:

Basis-GUI-Funktionen

Es folgenden die Funktionen, die man am häufigsten zum Entwurf einer GUI benötigt. Es sind nur die einfachen Funktionen, es gibt noch viele weitere, die es erlauben, detaillierte GUIs zu erzeugen.

Funktion Erklärung
GUICreate Erzeugt ein Fenster.
GUICtrlCreate... Erzeugt verschiedene Controls in einem Fenster.
GUISetState Zeigt oder versteckt ein Fenster.
GUIGetMsg Findet heraus, ob ein GUI-Ereignis aufgetreten ist (nur im MessageLoop-Modus).
GUICtrlRead Liest Daten aus einem Control.
GUICtrlSetData Setzt/verändert Daten in einem Control.
GUICtrlUpdate... Verändert verschiedene Eigenschaften von Controls (Farbe, Stil, etc.).

Man muss #include für die Standard-GUI notwendigen Konstanten in sein Skript einfügen. Es gibt auch andere Dateien die Konstanten enthalten je nachdem welche Controls man in seiner GUI erzeugt.

Erzeugen wir zunächst ein Fenster mit dem Titel "Hallo Welt" und setzen die Größe auf 200 mal 100 Pixel. Wenn ein neues Fenster erzeugt wird, ist es zunächst versteckt - wir müssen es also noch anzeigen ("show"):

@@SyntaxHighlighting@@ #include GUICreate("Hallo Welt", 200, 100) GUISetState(@SW_SHOW) Sleep(2000) @@End@@

 

Wenn man das obige Skript ausführt, sieht man wie sich das Fenster öffnet und nach 2 Sekunden wieder schließt - nicht gerade interessant... Fügen wir ein bisschen Text und einen Ok-Button hinzu! Der Text wird an der Position 30, 10 und der Button bei 70, 50 erscheinen. Der Button wird 60 Pixel breit sein:

@@SyntaxHighlighting@@ #include GUICreate("Hallo Welt", 200, 100) GUICtrlCreateLabel("Hallo Welt! Wie geht es dir?", 30, 10) GUICtrlCreateButton("OK", 70, 50, 60) GUISetState(@SW_SHOW) Sleep(2000) @@End@@

 

Das sieht doch schon ganz gut aus. Aber wie lassen wir das GUI auf unseren Klick auf den Button reagieren? Nun, das ist der Punkt, an dem wir eine Entscheidung darüber treffen müssen, wie wir Ereignisse verarbeiten wollen - entweder via einer Nachrichtenschleife (MessageLoop) oder via Ereignisfunktionen (OnEvent).

GUI-Ereignis-Modi

Wie oben erwähnt gibt es zwei grundlegende GUI-Modi: den MessageLoopModus und den OnEvent Modus. Die Modi sind einfach zwei verschiedene Wege, um auf GUI-Ereignisse zu reagieren. Welchen Modus man wählt, hängt von der persönlichen Vorliebe ab und bis zu einem gewissen Grad davon, welchen GUI-Typ man erzeugen will. Mit beiden Modi kann man jedes gewünschte GUI erzeugen, aber manchmal ist ein Modus passender für eine Aufgabe als der andere.

Der übliche (Standard) Modus ist der MessageLoop Modus. Um auf den OnEvent Modus umzuschalten ist Opt("GUIOnEventMode", 1) zu verwenden.

MessageLoop Modus (Standard)

Im MessageLoop Modus wird das Skript die meiste Zeit in einer engen Schleife verbringen. Diese Schleife wird einfach ständig das GUI mit der GUIGetMsg Funktion abfragen. Wenn ein Ereignis aufgetreten ist, zeigt der Rückgabewert der GUIGetMsg Funktion die Details an (ein Button wurde angeklickt, das GUI wurde geschlossen, etc.).

In diesem Modus wird man nur von Ereignissen erfahren solange man aktiv immer wieder die GUIGetMsg Funktion aufruft; deshalb muss man sicherstellen, dass man sie viele Male pro Sekunde aufruft, sonst wird das GUI nicht reagieren.

Dieser Modus ist am besten für GUIs geeignet, wenn das GUI der "König" ist und man nur auf Benutzeraktionen wartet.

Auf dieser Seite findet man eine detailliertere Erklärung des MessageLoop Modus.

OnEvent Modus

Anstatt das GUI ständig abzufragen, um herauszufinden ob etwas passiert ist, lässt man im OnEvent Modus das GUI zeitweise das Skript anhalten und eine vordefinierte Funktion aufrufen, um das Ereignis zu behandeln. Wenn zum Beispiel ein Nutzer auf Button1 klickt, hält das GUI dein Hauptskript an und ruft eine vorher von dir definierte Funktion auf, die für Button1 zuständig ist. Wenn diese Funktion abgearbeitet ist, wird das Hauptskript fortgesetzt. Dieser Modus ist ähnlich wie die Visual Basic Formular-Methode.

Dieser Modus ist am besten für GUIs geeignet, wenn das GUI weniger wichtig ist und dein Skript zusätzlich zum GUI andere Aufgaben zu erfüllen hat.

Auf dieser Seite findet man eine detailliertere Erklärung des OnEvent Modus.