GUI


Erstellt und verwaltet Fenster und deren Controls (Steuerelemente). Fenster können zur Dateneingabe oder als individuelle Benutzerschnittstelle verwendet werden.

GUI, sub-command [, Param2, Param3, Param4]

Inhaltsverzeichnis

Gui, Add, ControlType [, Options, Text]

Fügt einem GUI-Fenster ein Control (Steuerelement) hinzu. Falls erforderlich wird dabei zuerst das Fenster selbst erstellt.

ControlType muss einer der folgenden Begriffe sein:

Beispiel:

Gui, Add, Text,, Bitte geben Sie ihren Namen ein:
Gui, Add, Edit, vName
Gui, Show

Gui, Show [, Options, Title]

Wenn nicht anders in den Optionen angegeben, zeigt dieser Befehl das Fenster an (auch wenn es vorher minimiert wurde), aktiviert es und setzt den Titel. Wird kein Titel angegeben, wird der zuletzt vorher angegebene bzw. der Dateinahme des Skripts als Titel verwendet.

Wenn die X , Y, W und H Optionen weggelassen werden, wird das Fenster mit der vorherigen Größe und Position angezeigt. Bei der ersten Anzeige wird die Fensterposition automatisch in der jeweiligen Dimension zentriert, wenn die X und/oder Y Option fehlt. Die Fenstergröße wird in diesem Fall automatisch so angepasst, dass alle enthaltenen Controls sichtbar sind.

Folgende Optionen können angegeben werden:

Wn: Mit der Zahl n (Pixel) wird die Breite der inneren Fensterfläche der GUI festgelegt. Der Fensterrahmen, die Titel- und die Menüleiste werden dabei nicht berücksichtigt.

Hn: Mit der Zahl n (Pixel) wird die Höhe der inneren Fensterfläche der GUI festgelegt.

Xn: Mit der Zahl n (Pixel) wird die X-Position (horizontale Position) des Fenster festgelegt. Die Postion 0 entspricht dem linken Bildschirmrand.

Yn: Mit der Zahl n (Pixel) wird die Y-Position (vertikale Position) des Fenster festgelegt. Die Postion 0 entspricht dem oberen Bildschirmrand.

Center: Zentriert das Fenster horizontal und vertikal auf dem Bildschirm.

xCenter: Zentriert das Fenster horizontal auf dem Bildschirm. Beispiel: Gui, Show, xCenter y0

yCenter: Zentriert das Fenster vertikal auf dem Bildschirm.

AutoSize: Passt die Größe des GUI-Fensters so an, dass alle aktuell sichtbaren Controls angezeigt werden. Die Fenstergröße kann damit angepasst werden, nachdem neue Controls hinzugefügt oder existierende Controls in der Größe geändert, verborgen oder wieder angezeigt wurden. Beispiel: Gui, Show, AutoSize Center

Außerdem kann eine der folgenden Optionen angegeben werden:

Minimize: Minimiert die GUI und aktiviert das darunterliegende Fenster.

Maximize: Maximiert und aktiviert die GUI.

Restore: Zeigt die GUI mit ihrer ursprünglichen Position und Größe an, wenn sie minimiert oder maximiert wurde. Die GUI wird dabei aktiviert.

NoActivate: Wie Restore, die GUI wird aber nicht aktiviert.

NA: Zeigt die GUI an, ohne sie zu aktivieren. Wenn die GUI minimiert ist, bleibt sie minimiert, steigt aber in der Z-Reihenfolge (die Reihenfolge, in der die Fenster in der Alt-Tab-Auswahlleiste angezeigt werden) auf. Wenn die GUI vorher verborgen war, wird sie normalerweise über dem zuletzt aktiven Fenster angezeigt, ohne dieses zu deaktivieren.

Hide: Versteckt die GUI und aktiviert das darunterliegende Fenster. Das entspricht der Funktion von Gui Cancel, ermöglicht aber, die verborgene GUI zu verschieben oder ihre Größe und/oder ihren Titel zu ändern, ohne dass es sichtbar wird. Z.B.: Gui, Show, Hide x55 y66 w300 h200, Neuer Titel

Gui, Submit [, NoHide]

Speichert den Inhalt aller Controls in die jeweils zugewiesene Variable und verbirgt die GUI, sofern nicht die Option NoHide angegeben wurde. Bei Controls mit mehreren Ausgabefeldern, wie z.B. der ListBox mit Mehrfachauswahl, wird das aktuelle Trennzeichen der GUI als Trennzeichen verwendet. Wenn die GUI nicht existiert, weil sie z.B. vorher mit Gui Destroy zerstört wurde, wird der Befehl ignoriert.

Gui, Cancel

Verbirgt die GUI, ohne Inhalt der Controls in den zugewiesenen Variablen zu speichern. Wenn die GUI nicht existiert, weil sie z.B. vorher mit Gui Destroy zerstört wurde, wird der Befehl ignoriert.

Gui, Destroy

Zerstört die GUI, sofern sie existiert, mit allen Controls und gibt den von der GUI verwendeten Speicherplatz und die übrigen Systemressourcen frei. Wenn die GUI später wieder neu erstellt wird, gelten für alle Eigenschaften wie Farbe und Zeichensatz wieder die Standardeinstellungen, als ob die GUI vorher nie existiert hätte. Wenn das Skript beendet wird, werden alle noch existierenden GUI's automatisch zerstört.

Gui, Font [, Options, FontName]

Bestimmt Zeichensatz, -größe, -schnitt und/oder -farbe für die nachfolgend erstellten Controls. Beispiel:

gui, font, s10, Verdana ; Setzt 10-Punkt Verdana.

Wenn die letzten beiden Parameter weggelassen werden, werden die Einstellungen auf den Systemstandard für Zeichensatz, -größe und -farbe zurückgesetzt.

FontName kann der Name eines beliebigen Zeichensatzes sein, wie z.B. einer aus der Zeichensatztabelle. Wenn FontName weggelassen wird oder der Zeichensatz auf dem akuellen System nicht existiert, wird der zuletzt davor angegebene Zeichensatz bzw. der Standardzeichensatz des Systems verwendet. Damit kann man einer GUI einen ähnlichen Font auf vielen Systemen zuweisen, auch wenn auf manchen der bevorzugte Zeichensatz fehlt. Bei Verwendung der folgenden Anweisungen in der angegebenen Reihenfolge wird z.B. "Verdana" der Vorzug vor "Arial" und "Arial" wiederum der Vorzug vor "MS Sans Serif" gegeben:

gui, font,, MS sans serif
gui, font,, Arial
gui, font,, Verdana ; bevorzugter Zeichensatz.

Wenn der Options Parameter leer gelassen wird, werden die zuletzt angegebenen Attribute weiter verwendet. Folgende Optionen können angegeben werden:

C: Farbname (siehe Farbkarte), RGB-Wert oder das Wort Default, um den Systemstandard wiederherzustellen (schwarz auf den meisten Systemen). Beispiele: cRed, cFFFFAA, cDefault.

Hinweis: Buttons ignorieren Farbvorgaben. Einzelne Controls können mit einer anderen als der voreingestellten Zeichenfarbe erstellt werden, indem man die C Option ihren Optionen hinzufügt, z.B.: Gui, Add, Text, cRed, Mein Text

S: Zeichengröße in Punkten, z.B.: s12

W: Zeichenstärke als Zahl zwischen 1 und 1000 (400 entspricht normal und 700 entspricht fett), z.B.: w600

Die folgenden Angaben werden ebenfalls unterstützt: bold, italic, strike, underline und norm. Norm setzt die normale Zeichenstärke, schaltet ggf. die Eigenschaften kursiv (italic), durchgestrichen (strike) und unterstrichen (underline) ab, behält aber die aktuelle Zeichenfarbe und -größe bei. Es ist möglich, in Kombination mit norm alle Attribute ab- und einzelne anzuschalten. norm italic z.B. setzt die Zeichenattribute zunächst auf "normal" und dann auf "kursiv" (italic).

Mehrere Optionen werden durch ein Leerzeichen gertrennt, z.B. : cBlue s12 bold

Wenn ein Skript mehrere GUI-Fenster erstellt, verwaltet jedes Fenster seine eigenen Fonteinstellungen für den Fall, dass später noch Controls hinzugefügt werden.

Ergänzender Hinweis: Das Betriebsystem bietet Standarddialoge für die Zeichensatz-, Farb- oder Iconauswahl. Diese Dialoge können per DllCall() genutzt werden, wie hier gezeigt wird: http://www.autohotkey.com/forum/topic17230.html.

Gui, Color [, WindowColor, ControlColor]

Bestimmt die Hintergrundfarbe des GUI-Fensters und/oder seiner Controls. WindowColor wird als Hintergrundfarbe für das GUI-Fenster selbst, ControlColor als Hintergrundfarbe für alle bestehenden und später erstellten Controls verwendet (mit Ausnahme der Controls, deren Hintergrundfarbe nicht verändert werden kann). Obwohl ControlColor bei der Erstellung von ListViews und TreeViews angewendet wird, wirken sich spätere Änderungen von ControlColor auf diese nicht aus. In diesen Fällen verwendet man GuiControl +BackgroundFF9977, MeinListView, um die Hintergrundfarbe explizit zu verändern.

Wird einer der Parameter leer gelassen, verbleibt es bei der aktuellen Einstellung. Anderenfalls kann einer der 16 primären HTML-Farbnamen, ein 6-stelliger hexadizimaler RGB-Farbwert (das Präfix 0x ist optional) oder das Wort "Default" angegeben werden, um auf die Standardfarbe des Systems zurückzusetzen. Beispiele: Silver, FFFFAA, 0xFFFFAA, Default

Der Standardwert für WindowColor ist die Standardfarbe des Systems für Buttons, für ControlColor die Standardfarbe des Systems für Fenster (normalerweise weiß).

Die Farbe der Menüleiste und ihrer Submenüs kann wie folgt geändert werden: Menu, MyMenuBar, Color, White

Mit WinSet TransColor kann ein Fenster unter Windows 2000/XP oder späteren Versionen transparent gemacht werden. Wenn aber zuvor nicht mit "Gui, Color" eine eigene Farbe bestimmt wurde, werden auch die Buttons transparent. Um das zu verhindern, bestimmt man für das Fenster zunächst eine eigene Hintergrundfarbe und macht diese dann transparent. Beispiel:

Gui, Color, EEAA99
Gui +LastFound ; Macht das GUI-Fenster zum LastFoundWindow zur Verwendung in der folgenden Zeile.
WinSet, TransColor, EEAA99

Um zusätzlich die Ränder und die Titelleiste eines transparenten Fenster zu entfernen, verwendet man die folgende Anweisung nachdem das Fenster transparent gemacht wurde:

Gui -Caption ; Oder Gui, 2:-Caption für das zweite Fenster, etc.

Das wird am Beispiel eines On-Screen-Displays (OSD) am Ende dieser Seite detaillierter dargestellt.

Gui, Margin [, X, Y]

X und Y bestimmen die Anzahl von Pixeln, die bei der Autopositionierung eines Controls ohne explizite X- oder Y-Koordinaten als Standardabstand zu den Rändern eines GUI-Fensters verwendet werden. Ebenso bestimmen sie den vertikalen und horizontalen Standardabstand zwischen autopositionierten Controls. Letztlich werden die Ränder auch für die automatische Berechnung der Fenstergröße bei der ersten Gui Show Anweisung berücksichtigt, wenn keine explizite Größe angegeben ist.

Wenn diese Anweisung nicht verwendet wird, bevor das erste Control für ein Fenster erzeugt wird, werden an allen Seiten Standardabstände proportional zur Größe des aktuellen Zeichensatzes (0,75 * Zeichenhöhe für den oberen und unteren und 1,25 * Zeichenhöhe für den linken und rechten Rand) verwendet.

Die Randeinstellung kann jederzeit verändert werden, die Änderung wirkt sich aber nur auf danach neu erzeugte Controls aus. Letztlich können X oder Y leer gelassen werden, um die zugehörige Einstellung unverändert zu lassen.

Gui, +/-Option1 +/-Option2 ...

Eine oder mehrere Optionen können direkt hinter der GUI Anweisung angegeben werden. Für eine höhere Ausführungsgeschwindigkeit sollte man alle Optionen in einer einzigen Zeile angeben, bevor das GUI-Fenster erzeugt wird, d.h. bevor ein sub-command wie Gui Add ausgeführt wird.

Die Optionen wirken kumulativ, d.h., sie verändern nur die explizit betroffenen Eigenschaften. Die übrigen Eigenschaften bleiben unverändert.

Durch Voranstellen eines Pluszeichens (+) wird die Eigenschaft hinzugefügt, mit einem Minuszeichen (-) entfernt. Beispiel:

Gui +Resize -MaximizeBox ; Ändert die Eigenschaften des voreingestellten GUI-Fensters.
Gui 2:+Resize -MaximizeBox ; Ändert die Eigenschaften des zweiten GUI-Fensters.

AlwaysOnTop: Das GUI-Fenster bleibt über allen anderen Fenstern. Dieselbe Wirkung kann mit WinSet AlwaysOnTop erzielt werden.

Border: Erzeugt einen Fensterrahmen in Form einer dünne Linie. Das ist eher unüblich.

Caption (Standard): Erzeugt eine Titelleiste und einen normalen Fensterrahmen. Wenn für ein Fenster die Anweisung WinSet TransColor verwendet wird, darf die Eigenschaft Caption erst nach dem Setzen von TransColor entfernt werden.

Delimiter: Bestimmt für das Fenster ein anderes Trennzeichen als das Pipezeichen (|). Dieses Trennzeichen wird immer dann verwendet, wenn der Inhalt von Controls mit Gui Add hinzugefügt, mit GuiControl verändert oder mit Gui Submit oder GuiControlGet gespeichert wird. Direkt nach dem Wort Delimiter wird ein einzelnes Zeichen angegeben. Mit Gui +Delimiter`n würde z.B. der Zeilenvorschub (LF) als Trennzeichen gesetzt, was besonders für Fortsetzungssektionen geeignet sein kann. Mit Gui +Delimiter| wird zum Standardtrennzeichen zurückgekehrt. Mit Gui +DelimiterSpace bzw. Gui +DelimiterTab können das Leerzeichen bzw. der Tabulator als Trennzeichen gesetzt werden. Wenn das Trennzeichen verändert wird, betrifft das alle existierenden und auch späteren Threads dieses Fensters.

Disabled: Sperrt das Fenster und verhindert, dass der Benutzer die Controls des Fensters bedienen kann. Diese Option wird oft für Fenster verwendet, die als Besitzer anderer Fenster bestimmt wurden (siehe Owner).

Label [v1.0.44.09+]: Bestimmt einen eigenen Namen für die speziellen Label (Sprungmarken) dieses Fensters. Gui 2:+LabelMeineGui verwendet z.B. die Label MeineGuiClose und MeineGuiSize (falls sie existieren) anstelle von 2GuiClose und 2GuiSize, d.h., die Zeichenfolge "2Gui" wird in den Namen aller speziellen Label durch "MeineGui" ersetzt. Man kann damit auch erreichen, dass mehrere Fenster dieselben Label verwenden. In diesem Fall kann durch Abfrage der internen Variable A_Gui festgestellt werden, welches Fenster die Subroutine aufgerufen hat.

LastFound: Macht das Fenster zum LastFoundWindow (bei Aufruf eines Gui-Threads geschieht das automatisch), womit Anweisungen wie WinSet das Fenster auch dann bearbeiten können, wenn es verborgen ist (d.h., DetectHiddenWindows wird nicht benötigt). Man kann so auch die Eigenschaften eines Fensters verändern, bevor es angezeigt wird. Beispiel:

Gui +LastFound
WinSet, TransColor, %MeineFarbe% 150
Gui Show

LastFoundExist [v1.0.43.09+]: Im Gegensatz zu den anderen Optionen muss LastFoundExist als einzige Option einer Zeile angegeben werden. +LastFoundExist entspricht +LastFound, das Fenster wird jedoch nicht erzeugt, wenn es noch nicht existiert. Der Hauptzweck dieser Option dient der Feststellung, ob ein bestimmtes GUI-Fenster existiert. Beispiel:

Gui 2:+LastFoundExist
IfWinExist
MsgBox GUI #2 existiert bereits.

MaximizeBox: Aktiviert den Maximierungsbutton der Titelleiste. Das geschieht auch bei Resize (s.u.).

MinimizeBox (Standard): Aktiviert den Minimierungsbutton der Titelleiste.

MinSize und MaxSize [v1.0.44.13+]: Bestimmen die minimale und/oder maximale Größe des Fensters, die nicht unter- bzw. überschritten werden kann, wenn der Benutzer am Rahmen zieht. Die Worte MinSize und/oder MaxSize ohne Zusatz legen die aktuelle Größe des Fensters als Grenzwert fest (wenn das Fenster keine aktuelle Größe hat, wird die Größe bei der ersten Gui Show Anweisung verwendet). Anderenfalls werden die Breite gefolgt vom Buchstaben "x" und die Höhe angegeben. Beispiel: Gui +Resize +MinSize640x480. Die Angaben sind in Pixeln und beziehen sich auf die Größe der Innenfläche des Fensters, der Fensterrahmen, die Titel- und die Menüleiste werden dabei nicht berücksichtigt.

Sowohl die Breite als auch die Höhe können weggelassen werden, um sie unverändert zu belassen (z.B.. +MinSize640x oder +MinSizex480). Außerdem kann Min/MaxSize mehrfach angegeben werden, um die aktuelle Größe des Fensters für eine und eine explizite Größenangabe für die andere Dimension zu setzen. +MinSize +MinSize640x verwendet z.B. die aktuelle Größe des Fensters für die Höhe und 640 Pixel für die Breite.

Wenn MinSize und MaxSize nicht verwendet werden, gelten die Standardwerte des Betriebssystems. Mit Gui -MinSize -MaxSize kann jederzeit zu diesen Standardwerten zurückgekehrt werden. Hinweis: Das Fenster muss die Option +Resize haben, wenn eine Größenänderung durch den Benutzer möglich sein soll.

OwnDialogs: Gui +OwnDialogs sollte in jedem Gui-Thread (wie z.B. einer ButtonOK-Subroutine) angegeben werden, in dem nachfolgend ein Dialog wie MsgBox, InputBox, FileSelectFile oder FileSelectFolder angezeigt wird, dessen Besitzer das Fenster sein soll. Die Dialoge werden dann modal, d.h. der Benutzer kann nicht mit dem Fenster interagieren, bevor er den Dialog beendet hat. Im Gegensatz dazu werden ToolTip, Progress und SplashImage Fenster auch dann nicht modal, wenn sie dem GUI-Fenster gehören. Sie bleiben lediglich immer über ihrem Besitzer. In jedem Fall wird ein im Besitz eines GUI-Fensters befindlicher Dialog oder Fenster automatisch zusammen mit dem GUI-Fenster zerstört.

Normalerweise braucht man diese Option nicht wieder auszuschalten, weil sie sich nicht auf andere Threads auswirkt. Wenn aber die Notwendigkeit besteht, sowohl dem Fenster gehörende auch auch nicht gehörende Dialoge anzuzeigen, kann die Einstellung mit Gui -OwnDialogs innerhalb des Threads wieder zurückgesetzt werden.

Wenn keine GUI-Nummer angegeben wird (Gui +OwnDialogs anstelle von Gui 2:+OwnDialogs) wird die Standard-GUI des Threads zum Besitzer der Dialoge.

Owner: Die Option +Owner bringt das Fenster in den Besitz eines anderen Fensters. Nachdem es erzeugt worden ist, hat die Option -Owner keine Wirkung. Ein besessenes Fenster wird per Voreinstellung nicht in der Taskleiste angezeigt und liegt über dem Besitzerfenster, wenn es sichtbar ist. Es wird außerdem automatisch zerstört, wenn sein Besitzer zerstört wird. +Owner muss verwendet werden, nachdem das Besitzerfenster erzeugt wurde, aber bevor das besessene mit Anweisungen wie Gui Add erzeugt wird. +Owner kann auf zwei Arten verwendet werden, wie das folgende Beispiel zeigt:

gui, 2:+owner1 ; Macht das Fenster #2 zum Besitz von Fenster #1.
gui, 2:+owner ; Macht das Fenster #2 zum Besitz des Haupfensters des Skripts, um die Anzeige in der Taskleiste zu verhindern.

Wenn verhindert werden soll, dass der Benutzer mit dem Besitzerfenster interagiert, während eines der ihm gehörenden Fenster sichtbar ist, muss das Besitzerfenster mit Gui +Disabled gesperrt werden. Wenn das besessene Fenster später verborgen oder zerstört wird (Cancel/Destroy), muss das Besitzerfenster mit Gui -Disabled wieder entsperrt werden. Wenn das vor der Cancel/Destroy Anweisung geschieht, wird das Besitzerfenster automatisch reaktiviert.

Resize: Ermöglicht es, die Größe des Fensters zu verändern und aktiviert den Maximierungsbutton der Titelleiste. Wenn der Button nicht aktiviert werden soll, verwendet man +Resize -MaximizeBox.

SysMenu (Standard): Die Option -SysMenu (Minus SysMenu) verhindert die Anzeige des Systemmenüs und seines Icons in der oberen linken Ecke des Fensters. Außerdem werden die Buttons für Minimieren, Maximieren und Schließen der Titelleiste nicht angezeigt.

Theme: Die Option -Theme bewirkt, dass alle nachfolgend erzeugten Controls unter Windows XP oder späteren Versionen mit dem "klassischen" Erscheinungsbild dargestellt werden. Um später wieder Controls mit dem aktuell eingestellten Thema erzeugen zu können, kann dieses mit +Theme wieder eingeschaltet werden. Hinweis: Diese Option hat keine Wirkung unter älteren Systemen als Windows XP und auch nicht unter XP selbst, wenn das "klassische" Thema voreingestellt ist. Letztlich kann diese Einstellung auch für einzelne Controls individuell geändert werden, wenn man +Theme oder -Theme in deren Optionen angibt.

ToolWindow: Erzeugt eine niedrigere Titelleiste und verhindert die Anzeige des Fensters in der Taskleiste.

(Unbenannter Style): Ein Plus- oder Minuszeichen, direkt gefolgt vom dezimalen oder hexadezimalen Wert einer Gestaltungseigenschaft (Style).

(Unbenannter ExStyle): Ein Plus- oder Minuszeichen, direkt gefolgt vom Buchstaben E und dem dezimalen oder hexadezimalen Wert einer erweiterten Gestaltungseigenschaft (Extended Style). +E0x40000 z.B. würde dem Fenster die WS_EX_APPWINDOW Eigenschaft hinzufügen, mit der die Anzeige eines Fensters in der Taskleiste auch dann erzwungen wird, wenn andere Optionen es verhindern würden. Die übrigen erweiteren Gestaltungseigenschaften sind hier nicht beschrieben, weil sie selten benutzt werden. Beschreibungen lassen sich aber über die Suche nach WS_EX_APPWINDOW auf www.microsoft.com finden.

Gui, Menu [, MenuName]

Fügt eine Menüleiste in das GUI-Fensters ein. Die Menüleiste wird vorher mit der Menu Anweisung erzeugt. Beispiel:

Menu, FileMenu, Add, &Öffnen Ctrl+O, MenuFileOpen ; Siehe u.a. Anmerkungen zu Ctrl+O.
Menu, FileMenu, Add, &Ende, MenuHandler
Menu, HelpMenu, Add, &Über, MenuHandler
Menu, MyMenuBar, Add, &Datei, :FileMenu ; Ordnet die zwei zuvor erzeugten Submenüs zu.
Menu, MyMenuBar, Add, &Hilfe, :HelpMenu
Gui, Menu, MyMenuBar

In der ersten Zeile des Beispiels folgt auf &Öffnen Ctrl+O, getrennt mit einem Tabulatorsprung. Damit wird ein Tastaturkürzel angezeigt, mit dem der Benutzer den Menüeintrag auswählen kann. Um ein solches Kürzel im Skript zu aktivieren, verwendet man einen kontextsensitiven Hotkey:

#IfWinActive Titel des GUI-Fensters ahk_class AutoHotkeyGUI
^o:: ; Der Ctrl+O Hotkey.
MenuFileOpen:
Gui +OwnDialogs ; Zwingt den Benutzer, den FileSelectFile Dialog zu beenden, bevor er zu Hauptfenster zurückkehren kann.
FileSelectFile, SelectedFile
MsgBox, Sie haben die Datei %SelectedFile% ausgewählt.
return

; Der folgende Teil wird nur unter Windows 95/98/Me benötigt:
#IfWinActive
$^o::Send ^o

Mit Gui, Menu ohne den letzten Parameter wird die Menüleiste des Fensters ausgeblendet.

Wenn ein Menü einmal in einer Menüleiste verwendet wurde, kann es nicht mehr als Popupmenü oder Submenü verwendet werden, weil Menüleisten ein anderes internes Format erfordern. Das gilt aber nur für den Menüleisteneintrag selbst und nicht für die Submenüs. Wenn Beides benötigt wird, erzeugt man ein Menü für die Menüleiste und ein weiteres mit identischem Aufbau für alle anderen Zwecke.

Die Anwendung bestimmter destruktiver Menü Subkommandos wie Delete und DeleteAll auf ein Menü, das gerade in einer Menüleiste verwendet wird (in manchen Fällen auch auf die Submenüs) wird nicht unterstützt und führt zu einem Fehlerdialog, wenn nicht UseErrorLevel angegeben wurde. Solche Änderungen müssen deshalb wie folgt durchgeführt werden: 1) Die Verbindung zur Menüleiste mit Gui Menu (ohne MenuName) lösen, 2) Durchführen der Änderungen, 3) Menüleiste mit Gui, Menu, MyMenuBar wieder hinzufügen.

Gui, Hide / Minimize / Maximize / Restore

Gui Hide entspricht Gui Cancel. Die anderen drei Anweisungen machen das Fenster erforderlichenfalls sichtbar und führen dann die entsprechende Aktion aus. Wenn das Fenster nicht existiert, weil es z.B. vorher mit Gui Destroy zerstört wurde, haben die Anweisungen keine Wirkung.

Gui, Flash [, Off]

Lässt das Fenster "blinken", indem die Farbe der Titelleiste und ggf. des zugehörigen Taskleisteneintrags invertiert wird. Durch Angabe des optionalen Wortes OFF wird die Originalfarbe wiederhergestellt. Unterschiedliche Betriebssystemversionen mögen sich aber unterschiedlich verhalten. Im u.a. Beispiel "blinkt" das Fenster drei Mal, weil mit jeweils zwei Anweisungen die Farbe invertiert und wiederhergestellt wird:

Loop 6
{
Gui Flash
Sleep 500 ; Das Verhalten ist von diesem Wert stark abhängig. Änderungen können zu unerwünschten Ergebnissen führen.
}

Gui, 2:Default

Ändert die Standardfensternummer des aktuellen Threads, die immer dann benutzt wird, wenn in den Anweisungen GuiControl, GuiControlGet und Gui keine Fensternummer angegeben wird. Im folgenden Beispiel wird die Standardfensternummer auf zwei gesetzt: Gui 2:Default. Siehe auch das Standardfenster des Threads für weitere Informationen.

Positionierung und Layout mit dem SmartGUI Creator

Mit den im folgenden Absatz beschriebenen Optionen kann das Layout eines GUI-Fensters recht bequem festgelegt werden. Man kann GUI's aber auch sehr einfach mit Rajat's SmartGUI Creator erstellen, der eine grafische Benutzeroberfläche für das Erstellen der GUI bereitstellt. SmartGUI Creator ist kostenlos und kann unter http://www.autohotkey.com/docs/SmartGUI/ heruntergeladen werden.

Positionierung und Größenbestimmung der Controls

Wenn Dimensions- und/oder Koordinatenangaben in Options weggelassen werden, wird das Control seiner Art und seinem Inhalt entsprechend automatisch relativ zum vorherigen Control positioniert und/oder dimensioniert.

Folgende Optionen werden unterstützt:

Rn: n bestimmt die Anzahl der Textzeilen (kann auch als Gleitpunktzahl angegeben werden wie z.B. R2.5). Die Option R ist normalerweise für Elemente mit Texten der Option H (Höhe) vorzuziehen. Wenn sowohl R als auch H angegeben sind, wird H ignoriert. Bei einer Groupbox legt R die Anzahl von Controls fest, für die innerhalb der Box Platz reserviert werden soll. Für DropDownList, Combobox und Listbox bestimmt R die Anzahl der gleichzeitig sichtbaren Einträge im Listenbereich des Controls. Unter Windows XP oder späteren Versionen kann es aber vorteilhaft sein, sowohl R als auch H für DropDownList und ComboBox wegzulassen, weil sich die maximale Höhe der aufklappenden Liste dann automatisch an die verfügbare Höhe des Desktops anpasst. Für andere Controls ist R die Anzahl der innerhalb des Controls sichtbaren Textzeilen.

Wn: n bestimmt die Breite in Pixeln. Wenn nicht angegeben, wird die Breite einiger Controls automatisch ihrem Inhalt entsprechend bestimmt. Andere Controls haben folgende Standardbreiten:
Tab-Controls: 30 * aktuelle Fontgröße zuzüglich 3 * X-Margin.
Vertikale Progressbar: 2 * aktuelle Fontgröße.
Horizontale Progressbar, horizontaler Slider, Dropdownlist, Combobox, Listbox, Groupbox, Edit und Hotkey-Control: 15 * aktuelle Fontgröße.
Groupbox, 18 * aktuelle Fontgröße für zusätzliche innere Ränder.

Hn: n bestimmt die Höhe in Pixeln. Wenn sowohl H als auch R weggelassen werden, werden Dropdownlist, Combobox, Listbox und leere mehrzeilige Editfelder mit einer Höhe von 3 Zeilen dargestellt, Groupbox mit 2 Zeilen, vertikale Slider und Progressbar mit 5 Zeilen, horizontale Slider mit 30 Pixeln (wenn keine Stärke (thickness) vorgegeben wurde), die horizontale Progressbar mit der zweifachen aktuellen Fontgröße, das Hotkey-Control mit 1 Zeile und das Tab-Control mit 10 Zeilen. Für andere Controls wird die Höhe automatisch an den Inhalt angepasst. Für Dropdownlist und Combobox bestimmt H die Gesamthöhe des immer sichtbaren Teils und des Listenteils, wenn H zu klein ist, wird aber trotzdem zumindest ein Listeneintrag angezeigt. Für alle Controls mit zeilen- oder listenartigem Aufbau ist die Vorgabe der Zeilenzahl mit der R Option normalerweise der Höhenvorgabe mit H vorzuziehen, weil dadurch die Anzeige unvollständiger Zeilen verhindert wird.

WP und HP entsprechen der Breite bzw. Höhe des zuletzt zuvor erzeugten Controls. Beiden kann auch ein Plus- oder Minuszeichen und eine Zahl für einen positiven bzw. negativen Versatz in Pixeln folgen. Sie können verwendet werden, um die Breite und/oder Höhe eines Controls gemäß der Breite und/oder Höhe des zuvor erstellten Controls mit einer optionalen positiven oder negativen Anpassung zu bestimmen. WP z.B. bestimmt für die Breite des Controls die Breite des vorherigen und WP-50 die um 50 verminderte Breite des vorherigen Controls.

Xn: n bestimmt die X-Position in Pixeln, relativ zum linken Rand der Fensterinnenfläche (ohne Titelleiste, Menüleiste und Fensterrahmen). x0 y0 z.B. würde das Control in der oberen linken Ecke der Fensterinnenfläche positionieren. Wenn Y aber nicht X angegeben wird, wird das Control rechts von allen zuvor erzeugten Controls positioniert, was dem Beginn einer neuen "Spalte" entspricht

Yn: n bestimmt die Y-Position relativ zum oberen Rand der Innenfläche des Fensters (vgl X). Wenn X aber nicht Y angegeben wird, wird das Control unter allen zuvor erzeugten positioniert, was dem Beginn einer neuen "Zeile" entspricht.

Durch das Weglassen von X, Y oder beiden kann erreicht werden, dass sich das Layout der GUI bei späteren Änderungen der Größe von Controls oder der Schrift automatisch anpasst. Im Gegensatz dazu kann es bei Angabe absoluter Positionen für alle Controls erforderlich werden, nach Änderung der Größe eines Controls die Position der Controls, die darunter oder rechts davon liegen, manuell anzupassen.

Wenn sowohl X als auch Y weggelassen werden, wird das Control mit dem aktuellen Standardabstand unterhalb des vorherigen Controls positioniert.

In X und Y kann auch optional ein Plus- oder Minuszeichen enthalten sein. Damit wird das Control relativ zum rechten bzw. unteren Rand des vorherigen Controls positioniert. Y+10 z.B. würde das Control 10 Pixel unter dem unteren Rand des vorherigen Controls positionieren und den eingestellten Standardabstand ignorieren. Entsprechend würde X+10 das Control 10 Pixel rechts vom rechten Rand des vorherigen Controls positionieren. Weil negative Zahlen wie X-10 als absolute Positionsangaben gelten, muss einem negativen relativen Abstand ein Pluszeichen vorangestellt werden. Beispiel: X+-10

XP und YP entsprechen der X- bzw. Y-Position der oberen linken Ecke des zuletzt zuvor erzeugten Controls. Ihnen kann auch ein Plus- oder Minuszeichen und eine Zahl für einen positiven bzw. negativen Versatz in Pixeln folgen, z.B.: XP+10, YP-20. Sie können verwendet werden, um Controls relativ zur oberen linken Ecke des vorherigen Controls zu positionieren, z.B. für die Positionierung von Controls innerhalb einer GroupBox.

XM und YM können verwendet werden, um Controls am vorgegebenen linken bzw. oberen Rand der Fensters (vgl. Margins) zu positionieren. Beiden kann auch ein Plus- oder Minuszeichen und eine Zahl für einen positiven bzw. negativen Versatz in Pixeln folgen, z.B.: XM+10, YM-20. Wenn YM aber keine X-Position angegeben wird, wird das Control am oberen Rand rechts von allen zuvor erzeugten Controls positioniert, was dem Beginn einer neuen "Spalte" entspricht. Umgekehrt gilt Entsprechendes (vgl. Y).

XS und YS: Diese verhalten sich ähnlich wie XM und YM, beziehen sich aber auf Koordinaten, die zuvor für ein Control mit der Option Section gespeichert wurden. Das erste Control eines GUI-Fensters bildet immer eine Section, auch wenn diese Option nicht explizit angegeben wurde. Die Angabe von YS ohne eine X-Position führt dazu, dass das Control auf der gesicherten Y-Position aber rechts von allen Controls, die seit der letzten Verwendung der Option Section erstellt wurden, positioniert wird, was dem Beginn einer neuen "Spalte" entspricht. Beispiel:

gui, add, edit, w600 ; Erzeuge ein ziemlich breites Editfeld oben im Fenster.
gui, add, text, section, First Name: ; Sichere die Position dieses Controls als Beginn einer neuen Sektion.
gui, add, text,, Last Name:
gui, add, edit, ys ; Beginne eine neue Spalte in dieser Sektion.
gui, add, edit
gui, show

Wenn XS ohne eine Y-Position angegeben wird, entspricht das dem Beginn einer neuen "Zeile" (vgl. X).

XS und YS kann auch ein Plus- oder Minuszeichen und eine Zahl für einen positiven bzw. negativen Versatz in Pixeln folgen, z.B.: XS+10, YS-20. Weiterhin ist es möglich, XS/YS zusammen mit der Option Section anzugeben. XS/YS verwenden dann die Werte der vorherigen Sektion und Section startet eine neue für die folgenden Controls.

Benutzereingaben speichern und verarbeiten

V: Variable. Weist einem Control eine Variable zu. Unmittelbar nach dem Buchstaben V muss der Name einer globalen Variablen, einer funktionslokalen ByRef Variablen, die auf die globale Variable zeigt, oder einer statischen Funktionsvariablen in v1.0.46.01+ angegeben werden. Die Angabe von vMeinEdit z.B. würde z.B. den Inhalt des Controls immer dann in der Variablen MeinEdit speichern, wenn die Anweisung Gui Submit verwendet wird. Wenn ein Control keine Benutzereingaben entgegenehmen kann, wie z.B. ein Textfeld oder eine Groupbox, kann die Zuweisung einer Variablen trotzdem nützlich sein, weil dadurch eine eindeutige Control-ID für die Anweisungen GuiControl, GuiControlGet und A_GuiControl erzeugt wird. Hinweis: Gui Submit ändert nicht den Inhalt von Variablen für Controls, die keine Benutzereingaben empfangen können, wie z.B. Textfelder und Groupboxen oder andere, für die es in ihren Abschnitten wie z.B für ListView und TreeView beschrieben ist.
 

G: Gosub (G-Label). Ruft automatisch die angegeben Subroutine auf, wenn der Benutzer auf ein Control klickt oder seinen Inhalt verändert. Unmittelbar nach dem Buchstaben G muss der Name der auszuführenden Subroutine angegeben werden. gCancel kann für die implizite Ausführung der Anweisung Gui Cancel angegeben werden. Wenn aber eine Subroutine "Cancel" im Skript existiert, wird diese ausgeführt. In der Subroutine können die folgenden internen Variablen abgefragt werden: A_Gui, A_GuiControl, A_GuiEvent und A_EventInfo.

Controls: Übliche Gestaltungseigenschaften und Optionen

Hinweis: Ohne ein vorangestelltes Vorzeichen wird ein Pluszeichen angenommen. Beispiel: Wrap entspricht +Wrap und schaltet den Umbruch an Wortgrenzen ein. Im Gegensatz dazu bewirkt -Wrap, dass die Eigenschaft des Umbruches an Wortgrenzen entfernt wird.

AltSubmit: Verwendet eine alternative Submit-Methode. Für Dropdownlist, Combobox und Listbox wird damit bei der Gui Submit Anweisung die Position des ausgewählten Eintrags anstelle des Textes gespeichert. Wenn kein Eintrag ausgewählt ist, speichert eine Combobox den Inhalt ihres Editfeldes, Dropdownlist und Listbox leeren dagegen ihre Ausgabevariable. Hinweis: AltSubmit wirkt entsprechend auch auf GuiControlGet, wenn damit der Inhalt eines solchen Controls abgefragt wird.

C: Textfarbe (wirkt nicht auf Buttons). Dem Buchstaben C können direkt einer der 16 primären HTML-Farbnamen, ein 6-stelliger hexadizimaler RGB-Farbwert (das Präfix 0x ist optional) oder das Wort "Default" (Standardfarbe des Systems) folgen. Beispiele: cRed, cFF2211, c0xFF2211, cDefault

Disabled: Sperrt ein eingabefähiges Controls und verhindert damit, dass das Control den Eingabefokus erhalten oder der Benutzer den Inhalt verändern kann. Mit GuiControl Enable kann es später wieder entsperrt werden. Hinweis: Um ein Editfeld gegen Veränderungen zu schützen, wird stattdessen die Option ReadOnly verwendet. Dem Wort Disabled kann optional auch eine 0 oder 1 als Statusangabe angehängt werden (0 = falsch und 1 = wahr). Disabled und Disabled%VarMitInhaltEins% sind damit gleichbedeutend.

Hidden: Das Control ist am Anfang unsichtbar. Mit GuiControl Show kann es später sichtbar gemacht werden. Dem Wort Hidden kann optional auch eine 0 oder 1 als Statusangabe angehängt werden (0 = falsch und 1 = wahr). Hidden und Hidden%VarMitInhaltEins% sind damit gleichbedeutend.

Left: Formatiert den Text des Controls linksbündig in der verfügbaren Breite.

Right: Formatiert den Text des Controls rechtsbündig in der verfügbaren Breite. Bei Checkboxen und Radiobuttons wird auch die Box selbst auf der rechten Seite angezeigt, nicht auf der linken.

Center: Formatiert den Text des Controls zentriert innerhalb der verfügbaren Breite.

Section: Beginnt eine neue Sektion und speichert die Position des Controls für die spätere Verwendung mit den Optionen XS und YS (siehe oben).

Tabstop: -Tabstop (Minus Tabstop) bewirkt, dass ein eingabefähiges Control übersprungen wird, wenn sich der Benutzer mit der Tabulatortaste im Fenster bewegt.

Wrap: Bewirkt den automatischen Zeilenumbruch an Wortgrenzen für den Inhalt des Controls. Für fast alle Controls ist diese Option voreingestellt. Mit -Wrap (Minus Wrap) kann dieses Verhalten abgeschaltet werden.

VScroll: Erzeugt in geeigneten Controls eine vertikale Scrollleiste.

HScroll: Erzeugt in geeigneten Controls eine horizontale Scrollleiste. Der Rest dieses Absatzes gilt nur für die ListBox. Der horizontale Scrollbereich entspricht per Voreinstellung der 3-fachen Breite der Listbox. Für einen anderen Scrollbereich hängt man der Option HScroll direkt eine Zahl (Pixel) an. HScroll500 z.B. legt den Scrollbereich auf eine Breite von 500 Pixeln fest. Wenn die angegebene Breite kleiner als die Breite der Listbox ist, wird keine Scrollleiste angezeigt. Wegen der Angabe der Option HScroll  ist es aber möglich, später eine Scrollleiste mit GuiControl, +HScroll500, MyScrollBar hinzuzufügen, was sonst unmöglich ist.

Controls: Unübliche Gestaltungseigenschaften und Optionen

BackgroundTrans: Verwendet für Text-, Picture- und Groupboxcontrols einen transparenten Hintergrund, sodass darunterliegende Controls durchscheinen. Ein transparentes Textfeld über einem Picture-Control lässt z.B. den Text als Bestandteil des Bildes erscheinen. Mit GuiControl +background kann später der controlspezifische Hintergrund wieder eingeschaltet werden. Der Abschnitt Picture-Control AltSubmit enthält weitere Informationen zu transparenten Bildern. Bekannte Einschränkungen: BackgroundTrans kann für bei Controls innerhalb eines Tab-Controls, das einen ListView beinhaltet, ein unerwartetes Verhalten erzeugen.

-Background (Minus Background): Verwendet statt der mit Gui, Color eingestellten Farbe die Standardhintergrundfarbe des Controls. Das wird meist für Tab-Controls verwendet. Mit GuiControl +background kann diese Option später wieder entfernt werden.

Border: Erzeugt einen dünnen linienförmigen Rahmen um das Control. Die meisten Controls haben einen spezifischen Rahmen und benötigen diese Option deshalb nicht. Wenn ein solcher Rahmen einem Control nachträglich hinzugefügt wird, müssen dessen Breite und Höhe evtl. um ein Pixel vergrößert werden.

HwndOutputVar [v1.0.46.01+]: In Verbindung mit Gui Add bewirkt diese Option, dass die Identifikationsnummer (HWND) des neu erzeugten Controls in OutputVar gespeichert wird. Beispiel: Gui, Add, Edit, vMeinEdit HwndMeinEditHwnd (innerhalb einer Funktion ist MeinEditHwnd eine dynamische Funktionsvariable). Diese wird oft für PostMessage, SendMessage und DllCall benötigt. Sie kann ebenfalls direkt als ahk_id WinTitle verwendet werden (das funktioniert auch für verborgene Controls, selbst wenn DetectHiddenWindows OFF ist). Ergänzender Hinweis: Die HWND des Fensters des Controls kann mit Gui 2:+LastFoundExist gefolgt von WinExist() ermittelt werden.

Theme: Mit dieser Option kann das aktuelle Windowsthema für ein einzelnes Control abgeschaltet werden. Siehe auch Gui +/-Theme.

(Unnamed Style): Ein Plus- oder Minuszeichen, direkt gefolgt von einem dezimalen oder hexadezimalen Wert einer Gestaltungseigenschaft (Style). Wenn das Vorzeichen weggelassen wird, wird ein Pluszeichen verwendet.

(Unnamed ExStyle): Ein Plus- oder Minuszeichen, direkt gefolgt vom Buchstaben E und einem dezimalen oder hexadezimalen Wert einer erweiterten Gestaltungseigenschaft (Extended Style). Wenn das Vorzeichen weggelassen wird, wird ein Pluszeichen verwendet. E0x200 z.B. würde dem Control die WS_EX_CLIENTEDGE Eigenschaft hinzufügen, die einen Rahmen mit einer eingesunkenen Kante erzeugt, der gut zu Picture- oder anderen Controls passt. Die übrigen erweiteren Gestaltungseigenschaften sind hier nicht beschrieben, weil sie selten benutzt werden. Beschreibungen lassen sich aber über die Suche nach WS_EX_CLIENTEDGE auf www.microsoft.com finden.

Fensterereignisse

Die folgenden Sprungmarken (Subroutinen) werden einem GUI-Fenster automatisch zugeordnet, wenn sie im Skript existieren:

GuiClose: Wird aufgerufen, wenn das Fenster auf eine der folgenden Arten geschlossen wird: Drücken des X-Button in der Titelleiste, Auswahl von "Schließen" im Systemmenü oder mit der Anweisung WinClose. Wenn diese Sprungmarke fehlt, wird das Fenster beim Schließen lediglich verborgen, wie sonst mit der Anweisung Gui, Cancel. Eine der meistgebrauchten Reaktionen auf das Schließen des Fensters innerhalb von GuiClose ist ExitApp. Beispiel:

GuiClose:
ExitApp

GuiEscape: Wird aufgerufen, wenn der Benutzer die Escapetaste drückt, während das GUI-Fenster aktiv ist. Wenn diese Sprungmarke fehlt, hat das Drücken der Escapetaste keinen Wirkung. Bekannte Einschränkung: Wenn das erste Control des Fensters gesperrt (disabled) ist, wird (möglicherweise abhängig von der Art des Controls) die GuiEscape-Sprungmarke nicht aufgerufen. Es mag noch weitere Umstände geben, die diese Wirkung haben.

GuiSize: Wird aufgerufen, wenn die Größe des Fensters geändert oder das Fenster minimiert, maximiert oder wiederhergestellt wird. Die internen Variablen A_GuiWidth und A_GuiHeight enthalten die neue Breite und Höhe der Fensterinnenfläche (ohne Titelleiste, Menüleiste und Rahmen). Zusätzlich enthalten A_EventInfo und ErrorLevel beide eine der folgenden Ziffern:

0: Das Fenster wurde wiederhergestellt oder die Größe wurde normal durch Ziehen an den Außenkanten geändert.
1: Das Fenster wurde minimiert.
2: Das Fenster wurde maximiert.

Ein Skript kann GuiSize dafür nutzen, die Positionen und Dimensionen der Controls nach einer Größenänderung des Fensters anzupassen. Das kann aber viel einfacher durch Einbinden von Titan's "Anchor" SKript per #Include gemacht werden.

GuiContextMenu: Wird aufgerufen, wenn der Benutzer irgendwo im Fenster mit Ausnahme der Titel- und der Menüleiste einen Rechtsklick macht, außerdem bei Drücken der Menütaste oder von Shift-F10. Anders als die meisten anderen GUI-Label kann GuiContextMenu in mehreren gleichzeitigen Threads ausgeführt werden. Die folgenden internen Variablen stehen innerhalb von GuiContextMenu zur Verfügung:

  1. A_GuiControl enthält den Text oder Variablennamen des Controls, auf dem der Rechtsklick erfolgte, anderenfalls ist sie leer.
  2. A_EventInfo: Wenn eine Listbox, ein Listview oder Treeview angeklickt wurde (wie über A_GuiControl ermittelt werden kann) bestimmt A_EventInfo, welches Element betroffen ist:
    ListBox oder ListView: A_EventInfo enthält die Nummer der aktuell fokussierten Reihe, anderenfalls 0.
    TreeView: Bei Rechtsklicks enthält A_EventInfo die ID-Nummer des angeklickten Elements oder 0, wenn kein Element angeklickt wurde. Bei der Menütaste und Shift-F10 die ID_Nummer des aktuell ausgewählten Elements.
  3. A_GuiX und A_GuiY enthalten die X- und Y-Koordinaten, auf denen das Skript das Menü anzeigen sollte (z.B. Menu, MyContext, Show, %A_GuiX%, %A_GuiY%), relativ zur oberen linken Ecke des Fensters.
  4. A_GuiEvent enthält das Wort "RightClick" bei einem Rechtklick, sonst das Wort "Normal" (Menütaste oder Shift-F10).

Hinweis: Weil Edit und MonthCal eigene Kontextmenüs haben, wird bei einem Rechtklick innerhalb dieser Controls GuiContextMenu nicht aufgerufen.

GuiDropFiles: Wird aufgerufen, wenn Dateien/Ordner auf das Fenster gezogen und dort fallengelassen werden (drag-and-drop). Wenn die Subroutine aber gerade läuft, wird das Ereignis ignoriert. Die folgenden internen Variablen stehen in GuiDropFiles zur Verfügung:

  1. A_GuiControl enthält den Text oder Variablennamen des Controls, auf das die Dateien fallengelassen wurden, anderenfalls ist sie leer.
  2. A_EventInfo und ErrorLevel enthalten beide die Anzahl der Dateien.
  3. A_GuiX und A_GuiY enthalten die X- und Y-Koordinaten, auf die die Dateien fallengelassen wurden, relativ zur oberen linken Ecke des Fensters.
  4. A_GuiEvent enthält die Namen der Dateien. Jeder Name mit Ausnahme des letzten ist mit einem Zeilenvorschub (`n) abgeschlossen.

Die einzelnen Dateinamen können in einer parsing Loop wie unten gezeigt verarbeitet werden:

; BEISPIEL #1:
Loop, parse, A_GuiEvent, `n
{
MsgBox, 4,, Datei Nummer %A_Index% ist:`n%A_LoopField%.`n`nWeiter?
IfMsgBox, No, Break
}
; BEISPIEL #2: Nur die erste Datei ermitteln:
Loop, parse, A_GuiEvent, `n
{
FirstFile = %A_LoopField%
Break
}
; BEISPIEL #3: Verarbeitung der Dateinamen in alphabetischer Reihenfolge:
FileList = %A_GuiEvent%
Sort, FileList
Loop, parse, FileList, `n
MsgBox Datei Nummer %A_Index% ist:`n%A_LoopField%.

Drag-and-drop kann für ein Fenster temporär Gui -E0x10 (WS_EX_ACCEPTFILES) deaktiviert und später mit Gui +E0x10 wieder aktiviert werden.

Erkennen und Verarbeiten anderer Ereignisse: Weitere GUI-Ereignisse können mit OnMessage() erkannt und verarbeitet werden. Ein Skript kann z.B. eine kontextsensitive Hilfe per ToolTip anzeigen, wenn der Benutzer die Maus über ein Control bewegt. Das wird im GUI ToolTip Beispiel gezeigt.

Mehrere GUI-Fenster erstellen

Für andere als das erste Fenster wird die Fensternummer als Präfix für die o.a. speziellen Fensterroutinen verwendet. 2GuiEscape und 2GuiClose sind z.B. die Sprungmarken für das zweite Fenster. Mit Gui +Label können die Namen individuell gestaltet werden.

Jedes Skript kann gleichzeitig 99 GUI-Fenster verwalten. Um ein anderes als das Standardfenster zu bearbeiten, muss dem Subkommando die Fensternummer gefolgt von einem Doppelpunkt wie im folgenden Beispiel vorangestellt werden:

Gui, 2:Add, Text,, Das ist mein Text.
Gui, 2:Show

Gui 2:Default setzt das Fenster Nummer 2 als Standardfenster und macht das Präfix "2:" überflüssig.

Die Ausführungsgeschwindigkeit kann für niedrige Fensternummern etwas schneller als für höhere Fensternummern sein.

GUI-Ereignisse, -Threads und -Subroutinen

Ein GUI-Thread ist jeder Thread, der als Reaktion auf eine GUI-Aktion aufgerufen wird. Die GUI-Aktionen umfassen die Auswahl eines Meüeintrags in der Menüleiste eines GUI-Fensters oder den Aufruf eines seiner G-Label (wie durch Klick auf einen Button).

Die Standardfensternummer eines GUI-Threads ist die des Fensters, das den Thread gestartet hat. Andere Threads verwenden immer 1.

Wann immer ein GUI-Thread gestartet wird, ist dessen LastFoundWindow die startende GUI selbst. Damit können in den Anweisungen für Fenster und Controls wie WinMove, WinHide, WinSet, WinSetTitle und ControlGetFocus die Parameter WinTitle und WinText weggelassen werden, wenn sich die Anweisungen auf das GUI-Fenster selbst beziehen, auch wenn es verborgen ist.

Wenn man auf ein Control klickt, dessen G-Label wegen eines früheren Klicks noch ausgeführt wird, hat das keine Wirkung und das Ereignis wird verworfen. Das kann durch Angabe von Critical in der ersten Zeile der Subroutine verhindert werden, führt dann aber zu einer Pufferung bzw. Verzögerung anderer Threads wie z.B. Hotkeys.

Die internen Variablen A_Gui und A_GuiControl enthalten die Fensternummer und die Control-ID, die den aktuellen Thread gestartet haben. Unter ihren Links finden sich weitere Details.

Um mehrere Ereignisse mit derselben Subroutine zu verarbeiten, werden ihre Sprungmarken aufeinanderfolgend über die Routine geschrieben. Beispiel:

GuiEscape:
GuiClose:
ButtonCancel:
ExitApp ; Alle obenstehenden Label führen diese Zeile und die folgenden aus.
return

Alle GUI-Threads starten immer wieder mit den Standardeinstellungen wie z.B. für SendMode. Diese Standardeinstellungen können aber für alle Threads in der Auto-Execute Section überschrieben werden.

Tastaturnavigation

Innerhalb eines GUI-Fensters kann man sich mit der Tabulatortaste von einem eingabefähigen Control nächsten bewegen. Controls, für die die Tabstop Eigenschaft entfernt wurde, werden dabei übersprungen. Die Bewegung erfolgt in der Reihenfolge, in der die Controls ursprünglich erstellt wurden. Wenn das Fenster zum ersten Mal angezeigt wird, erhält das erste eingabefähige Control mit Tabstop-Eigenschaft, die den meisten Controls als Voreinstellung zugewiesen ist, den Eingabefokus.

Bestimmte Controls können ein &-Zeichen enthalten, um ein Tastaturkürzel zu erzeugen. Dadurch wird abhängig von den Systemeinstellungen das folgende Zeichen im Text des Controls unterstrichen. Der Benutzer aktiviert das Tastaturkürzel, indem er die Alt-Taste und zusätzlich das korrespondierende Zeichen drückt. Für Buttons, Checkboxen und Radiobuttons entspricht das Auslösen des Kürzels einem Klick auf das Control. Bei Groupboxen und Textfeldern wird der Eingabefokus in das erste eingabefähige Tabstop Control gesetzt, das danach erstellt wurde. Wenn mehrere Controls dasselbe Tastaturkürzel haben, wandert der Eingabefokus der Reihe nach durch alle diese Controls.

Wenn ein &-Zeichen als Text angezeigt werden soll, muss es verdoppelt werden. Beispiel: Save && Exit

Erscheinungsbild der Fenster

Als Icon verwendet ein GUI-Fenster das Trayicon, das zum Zeitpunkt der Erstellung des Fensters zugeordnet war. Deshalb muss ggf. das Trayicon geändert werden, bevor das Fenster erstellt wird. Beispiel: Menu, Tray, Icon, MyIcon.ico. Es ist ebenso möglich, einem Fenster mit DllCall und SendMessage ein eigenes "großes" Icon für die Anzeige in der Alt-Tab-Leiste zuzuweisen. Beispiel:

hIcon32 := DllCall("LoadImage", uint, 0
, str, "My Icon.ico" ; Dateiname des Icons (die Datei kann auch mehrere Icons enthalten).
, uint, 1 ; Art des Bildes: IMAGE_ICON
, int, 32, int, 32 ; Gewünschte Breite und Höhe des Bildes (hilft LoadImage bei der Bestimmung des bestgeeigneten Icons).
, uint, 0x10) ; Flags: LR_LOADFROMFILE
Gui +LastFound
SendMessage, 0x80, 1, hIcon32 ; 0x80 ist WM_SETICON und 1 bedeutet ICON_BIG (0 steht für ICON_SMALL).
Gui Show

Wegen systeminterner Beschränkungen werden Checkboxen, Radiobuttons und Groupboxen mit individueller Textfarbe unter Windows XP und den Folgeversionen mit dem "klassischen" Windowsthema angezeigt.

Siehe auch: Gui, Margin.

Allgemeine Anmerkungen

Für die Bearbeitung einzelner Controls eines GUI-Fensters nutzt man GuiControl und GuiControlGet.

Jedes GUI-Fenster kann bis zu 11.000 Controls verwalten. Bei mehr als 5000 Controls ist aber Vorsicht geboten, weil dann bestimmte Arten von Controls zu Systeminstabilitäten führen können.

Jedes Skript, das irgendwo eine GUI-Anweisung beinhaltet, wird automatisch persistent, selbst wenn die GUI-Anweisung nie ausgeführt wird. Außerdem kann gleichzeitig nur eine Instanz des Skripts gestartet werden, wenn das nicht mit #SingleInstance Direktive anders festgelegt wird.

Siehe auch

GuiControl, GuiControlGet, Menu, Control Types, ListView, TreeView, Control, ControlGet, SplashImage, MsgBox, FileSelectFile, FileSelectFolder

Beispiele

; Beispiel: Erzielt einen Effekt ähnlich wie SplashTextOn:
Gui, +AlwaysOnTop +Disabled -SysMenu +Owner ; +Owner vermeidet den Taskleisteneintrag.
Gui, Add, Text,, Some text to display.
Gui, Show, NoActivate, Title of Window ; NoActivate vermeidet das Deaktivieren des aktuell aktiven Fensters.

 

; Beispiel: Ein einfacher Eingabedialog für Vor- und Nachname:
Gui, Add, Text,, Vorname:
Gui, Add, Text,, Nachname:
Gui, Add, Edit, vVorName ym ; Die Option ym beginnt eine neue Spalte für die Controls.
Gui, Add, Edit, vNachName
Gui, Add, Button, default, OK ; Die Subroutine ButtonOK wird (falls sie existiert) aufgerufen, wenn der Button gedrückt wird.
Gui, Show,, Einfaches Eingabebeispiel
return ; Ende der Auto-Execute Section. Das Skript wartet auf Benutzeraktionen.
GuiClose:
ButtonOK:
Gui, Submit ; Schreibt die Benutzereingaben in die den Controls zugewiesenen Ausgabevariablen.
MsgBox Sie haben "%VorName% %NachName%" eingegeben.
ExitApp

 

; Beispiel: Tab-Control:
Gui, Add, Tab2,, Erster Tab|Zweiter Tab|Dritter Tab ; Tab2 anstelle von Tab benötigt v1.0.47.05.
Gui, Add, Checkbox, vMyCheckbox, Beispiel Checkbox
Gui, Tab, 2
Gui, Add, Radio, vMyRadio, Beispiel Radio1
Gui, Add, Radio,, Beispiel Radio2
Gui, Tab, 3
Gui, Add, Edit, vMyEdit r5 ; r5 bedeutet 5 Zeilen hoch.
Gui, Tab ; Nachfolgend erzeugte Controls gehören nicht mehr zum Tab-Control.
Gui, Add, Button, default xm, OK ; xm positioniert den Button in der linken unteren Ecke.
Gui, Show
return
ButtonOK:
GuiClose:
GuiEscape:
Gui, Submit ; Schreibt die Inhalte der Controls in die den Controls zugewiesenen Ausgabevariablen.
MsgBox Ihre Eingaben:`n%MyCheckbox%`n%MyRadio%`n%MyEdit%
ExitApp

 

; Beispiel: Eine Listbox, die die Dateien eines Verzeichnisses enthält:
Gui, Add, Text,, Wähle eine auszuführende Datei aus der Liste.`nAbbruch mit ESCAPE oder Schließen des Fensters.
Gui, Add, ListBox, vMyListBox gMyListBox w640 r10
Gui, Add, Button, Default, OK
Loop, C:\*.* ; Ändere das Verzeichnis und das Dateimuster entsprechend der eigenen Anforderungen.
{
GuiControl,, MyListBox, %A_LoopFileFullPath%
}
Gui, Show
return
MyListBox:
if A_GuiEvent <> DoubleClick
return
; Anderenfalls wird ein Doppelklick auf einen Listeneintrag wie das Drücken des OK-Buttons behandelt.
; Die Verarbeitung wird hinter der folgenden Sprungmarke fortgesetzt..
ButtonOK:
GuiControlGet, MyListBox ; Schreibt die aktuelle Auswahl der Listbox in die Variable.
MsgBox, 4,, Soll die Datei bzw. das Dokument ausgeführt werden?`n`n%MyListBox%
IfMsgBox, No
return
; Anderenfalls versuche die Ausführung:
Run, %MyListBox%,, UseErrorLevel
if ErrorLevel = ERROR
MsgBox Die angegebene Datei konnte nicht ausgeführt werden. Vielleicht ist ihr kein Programm zugewiesen.
return
GuiClose:
GuiEscape:
ExitApp

 

; Beispiel: Zeige eine kontextsensitive Hilfe (mit ToolTip), wenn der Benutzer die Maus über ein bestimmtes Control bewegt:
Gui, Add, Edit, vMyEdit
MyEdit_TT := "Das ist der ToolTip für das Control mit der Variablen MyEdit."
Gui, Add, DropDownList, vMyDDL, Rot|Grün|Blau
MyDDL_TT := "Wähle eine Farbe aus der Liste."
Gui, Add, Checkbox, vMyCheck, Dieses Control hat keinen Tooltip.
Gui, Show
OnMessage(0x200, "WM_MOUSEMOVE")
return

WM_MOUSEMOVE()
{
static CurrControl, PrevControl, _TT ; _TT muss für die Verwendung mit der ToolTip-Anweisung unten leer bleiben.
CurrControl := A_GuiControl
If (CurrControl <> PrevControl and not InStr(CurrControl, " "))
{
ToolTip ; Jeder frühere ToolTip wird abgeschaltet.
SetTimer, DisplayToolTip, 1000
PrevControl := CurrControl
}
return
DisplayToolTip:
SetTimer, DisplayToolTip, Off
ToolTip % %CurrControl%_TT ; Das führende einzelne Prozentzeichen erzwingt einen Ausdruck.
SetTimer, RemoveToolTip, 3000 ; Der ToolTip wird nach 3 Sekunden abgeschaltet
return
RemoveToolTip:
SetTimer, RemoveToolTip, Off
ToolTip
return
}
GuiClose:
ExitApp

 

; Beispiel: On-Screen-Display (OSD) mit einem transparenten Fenster:
CustomColor = EEAA99 ; Kann jede RGB-Farbe sein, sie wird unten transparent gemacht.
Gui +LastFound +AlwaysOnTop -Caption +ToolWindow ; +ToolWindow verhindert den Eintrag in der Task- und der Alt-Tab-Leiste.
Gui, Color, %CustomColor%
Gui, Font, s32 ; Setzt eine große Zeichenhöhe (32 Punkte).
Gui, Add, Text, vMyText cLime, XXXXX YYYYY ; XXXXX & YYYYY unterstützen die automatische Größenbestimmung des Fensters.
; Macht alle Pixel dieser Farbe transparent und den Text selbst durchscheinend (150):
WinSet, TransColor, %CustomColor% 150
SetTimer, UpdateOSD, 200
Gosub, UpdateOSD ; Das erste Update wird sofort durchgeführt, ohne auf den Ablauf des Timers zu warten.
Gui, Show, x0 y400 NoActivate ; NoActivate verhindert die Deaktivierung des aktuell aktiven Fensters.
return
UpdateOSD:
MouseGetPos, MouseX, MouseY
GuiControl,, MyText, X%MouseX%, Y%MouseY%
return

 

; Beispiel: Eine Fortschrittsanzeige über einem Hintergrundbild.
Gui, Color, White
Gui, Add, Picture, x0 y0 h350 w450, %A_WinDir%\system32\ntimage.gif
Gui, Add, Button, Default xp+20 yp+250, Start the Bar Moving
Gui, Add, Progress, vMyProgress w416
Gui, Add, Text, vMyText wp ; wp bedeutet "verwende die Breite des vorherigen Controls".
Gui, Show
return
ButtonStartTheBarMoving:
Loop, %A_WinDir%\*.*
{
if A_Index > 100
break
GuiControl,, MyProgress, %A_Index%
GuiControl,, MyText, %A_LoopFileName%
Sleep 50
}
GuiControl,, MyText, Bar finished.
return
GuiClose:
ExitApp

 

; Beispiel: Einfacher Bildbetrachter:
Gui, +Resize
Gui, Add, Button, default, &Load New Image
Gui, Add, Radio, ym+5 x+10 vRadio checked, Anzeige in &aktueller Größe
Gui, Add, Radio, ym+5 x+10, Anzeige in &Bildschirmbreite
Gui, Add, Pic, xm vPic
Gui, Show
return
ButtonLoadNewImage:
FileSelectFile, file,,, Wähle ein Bild:, Bilder (*.gif; *.jpg; *.bmp; *.png; *.tif; *.ico; *.cur; *.ani; *.exe; *.dll)
if file =
return
Gui, Submit, NoHide ; Speichert die Werte der Radiobuttons.
if Radio = 1 ; Zeige das Bild in seiner aktuellen Größe an.
{
Width = 0
Height = 0
}
else ; Der zweite Radiobutton ist ausgewählt: Zeige das Bild in Bildschirmbreite an.
{
Width := A_ScreenWidth - 28 ; Minus 28 für Rahmen und innere Ränder.
Height = -1 ; "Seitenverhältnis beibehalten" scheint am Besten.
}
GuiControl,, Pic, *w%width% *h%height% %file% ; Bild laden.
Gui, Show, xCenter y0 AutoSize, %file% ; Fenstergöße an die Bildgröße anpassen.
return
GuiClose:
ExitApp

 

; Beispiel: Einfacher Texteditor mit Menüleiste.
; Submenüs für die Menüleiste erstellen:
Menu, FileMenu, Add, &Neu, FileNew
Menu, FileMenu, Add, &Öffnen, FileOpen
Menu, FileMenu, Add, &Speichern, FileSave
Menu, FileMenu, Add, Speichern &unter, FileSaveAs
Menu, FileMenu, Add ; Trennlinie.
Menu, FileMenu, Add, &Ende, FileExit
Menu, HelpMenu, Add, &Hilfe, HelpAbout
; Die Menüleiste durch Hinzufügen der Submenüs erstellen:
Menu, MyMenuBar, Add, &Datei, :FileMenu
Menu, MyMenuBar, Add, &Hilfe, :HelpMenu
; Die Menüleiste dem Fenster hinzufügen:
Gui, Menu, MyMenuBar
; Das Editfeld erstellen und das Fenster anzeigen:
Gui, +Resize ; Die Größe des Fensters kann verändert werden.
Gui, Add, Edit, vMainEdit WantTab W600 R20
Gui, Show,, Unbenannt
CurrentFileName = ; Keine Datei ausgeählt.
return
FileNew:
GuiControl,, MainEdit ; Editfeld leerenl.
return
FileOpen:
Gui +OwnDialogs ; Zwingt den Benutzer, den FileSelectFile-Dialog zu beenden, bevor er in das Hauptfenster zurückkehrt.
FileSelectFile, SelectedFileName, 3,, Datei öffnen, Textdateien (*.txt)
if SelectedFileName = ; Keine Datei ausgewählt.
return
Gosub FileRead
return
FileRead: ; Die aufrufende Routine hat die Variable SelectedFileName gefüllt.
FileRead, MainEdit, %SelectedFileName% ; Kompletten Dateiinhalt in die Variable einlesen.
if ErrorLevel
{
MsgBox Could not open "%SelectedFileName%".
return
}
GuiControl,, MainEdit, %MainEdit% ; Text in das Editfeld schreiben.
CurrentFileName = %SelectedFileName%
Gui, Show,, %CurrentFileName% ; Dateinamen in der Titelleiste anzeigen.
return
FileSave:
if CurrentFileName = ; Wenn noch kein Dateiname gewählt wurde, "Speichern unter" ausführen.
Goto FileSaveAs
Gosub SaveCurrentFile
return
FileSaveAs:
Gui +OwnDialogs ; Zwingt den Benutzer, den FileSelectFile-Dialog zu beenden, bevor er in das Hauptfenster zurückkehrt.
FileSelectFile, SelectedFileName, S16,, Datei speichern, Text Documents (*.txt)
if SelectedFileName = ; Keine Datei ausgewählt.
return
CurrentFileName = %SelectedFileName%
Gosub SaveCurrentFile
return
SaveCurrentFile: ; Die aufrufende Routine hat geprüft, das der Dateiname nicht leer ist.
IfExist %CurrentFileName%
{
FileDelete %CurrentFileName%
if ErrorLevel
{
MsgBox The attempt to overwrite "%CurrentFileName%" failed.
return
}
}
GuiControlGet, MainEdit ; Inhalt des Editfeldes in die Variable schreiben.
FileAppend, %MainEdit%, %CurrentFileName% ; Inhalt in Datei speichern.
; Im Erfolgsfall Dateinamen in der Titelleiste anzeigen, falls der Aufruf von FileSaveAs kam
Gui, Show,, %CurrentFileName%
return
HelpAbout:
Gui, 2:+owner1 ; Macht das Hauptfenster (Gui #1) zum Besitzer des Hilfefensters (Gui #2).
Gui +Disabled ; Das Hauptfenster wird gesperrt.
Gui, 2:Add, Text,, Hilfetext.
Gui, 2:Add, Button, Default, OK
Gui, 2:Show
return
2ButtonOK: ; Diese Routinen werden vom Hilfefenster verwendet.
2GuiClose:
2GuiEscape:
Gui, 1:-Disabled ; Das Hauptfenster wird entsperrt (das muss vor der nächsten Anweisung geschehen).
Gui Destroy ; Zerstört das Hilfefenster.
return
GuiDropFiles: ; Unterstützung für "Drag & Drop".
Loop, parse, A_GuiEvent, `n
{
SelectedFileName = %A_LoopField% ; Nur die erste Datei verarbeiten (falls mehrere übergeben wurden).
break
}
Gosub FileRead
return
GuiSize:
if ErrorLevel = 1 ; Das Fenster wurde minimiert. Kein Aktion.
return
; Anderenfalls wurde die Fenstergöße geändert oder das Fenster maximiert. Das Editfeld wird angepasst.
NewWidth := A_GuiWidth - 20
NewHeight := A_GuiHeight - 20
GuiControl, Move, MainEdit, W%NewWidth% H%NewHeight%
return
FileExit: ; Der Benutzer wählte "Ende" im Dateimenü.
GuiClose: ; Der Benutzer hat das Fenster geschlossen.
ExitApp