Einführung in GEM (Teil 3)

Farbdefinition

Wer einen Farbmonitor besitzt, mußte sicher schon feststellen, daß eine freie Definition der einzelnen Farbtöne nicht problemlos möglich ist. Zwar kann man die Farbtöne durch das Desk-Accessoir 'Kontrollfeld' einstellen, die Definition per ST-Basic, Und das eventuelle Abspeichern der neu gewählten Farben bleiben dem Anwender jedoch verwehrt. Mit der folgenden VDI-Routine können, sämtliche Farben, je nach Auflösungsstufe, neu definiert werden. Diese Farben werden aus den drei Grundfarben 'Rot, Grün, Blau' gemischt, wobei jede Grundfarbe mit sieben verschiedenen Farbintensitäten eingeht.

Aufruf durch:

FARBNR = ..:  
ROT = 1 .. 7:  
GRUEN = 1 .. 7:   
BLAU = 1 .. 7 :  
Gosub FARBE  

Die 'Farbnummer' gibt an, welche Farbe umdefiniert wird, sie entspricht der im 'COLOR'-Befehl angegebenen Farbe und kann durch diesen auch angesprochen werden. Somit ist es möglich, eine eigene Farbpalette zu definieren und diese auch als Basicprogramm abzuspeichern, so daß sie nicht jedes mal per Hand eingestellt werden muß. Die so erreichbaren Farben werden in dem Beispielprogramm dargestellt.

Polymarkerfarben

Die Farbeinstellung für die VDI- und AES-Routinen können mit dem Basic-Befehl 'COLOR' vorgenommen werden. Eine Ausnahme macht der Polymarker-Befehl. Er wird durch eine eigene Routine eingestellt. Man kann aus der vorhandenen Farbpalette, je nach Auslösungsstufe, die Farbe auswählen.
Dies geschieht durch:

MARKERFARBE =.. :  
Gosub POLYMARKERFARBE  

AES-Routinen

Aufruf von AES-Funktionen

Grundsätzlich übernimmt das AES (Application Enviroment System) folgende Aufgaben:

Da das AES Teil des Betriebssystems ist, wird es beim Booten mitgeladen und ist somit jederzeit im Speicher vorhanden. Der hier wichtigste Bestandteil ist die umfangreiche Bibliothek, in der eine Vielzahl von Routinen enthalten sind, die auch für den Basicprogrammierer interessant sind.

Wie schon bei den VDI-Routinen erfolgt auch der AES-Aufruf in C oder anderer Sprache mit GEM-Einbindung, durch namentlichen Funktionsaufruf, wobei die Parameter eingeschlossen sind. In BASIC hingegen sind solche Routinen nur mit Funktionsnummer ansprechbar. Die benötigten Parameter (z. B. Fensterposition) müssen in bestimmten Speicherzellen übergeben werden. Diese Art des Funktionsaufrufes ist recht unübersichtlich und fehleranfällig. Deshalb ist es auch hier ratsam, wichtige Routinen in Unterprogrammen zusammenzufassen, welche mit sinngemäßen Programm- und Variablennamen versehen werden. Bei Bedarf 'MERGEt' man diese Unterprogramme von Diskette in das Hauptprogramm. Dies ersetzt zwar kein gutes Basic, es lohnt sich aber aufgrund der vielen Möglichkeiten, die die VDI- und AES-Routinen bieten.

Die Schnittstelle zwischen Basic und dem AES realisiert der 'GEMSYS'-Befehl. Er benötigt nur einen Parameter: die Funktionsnummer. Daraus ist ersichtlich, daß die übrigen Parameter dem AES auf einem anderen Weg mitgeteilt werden müssen. Dazu benutzt man die folgenden Felder.

Control Beinhaltet Länge der folgen den Felder
global Enthält verschiedene System daten
gintin Dateneingabefeld (z. B. Eck punkte eines Fensters)
gintout Datenausgabe (z. B. Position der Maus)
addrin Zeiger auf Adresse (Eingabe)
addrout Zeiger auf Adresse (Ausgabe)

Es handelt sich bei diesen Variablen lediglich um Adressen, die eine bestimmte Speicherstelle markieren, welche wiederum das AES benutzt. Diese Variablen sind nicht vordefiniert und müssen deshalb initialisiert werden. Dies geschieht mit dem Programm 'INIT', das vor Benutzung der AES Routinen einmal aufgerufen werden muß, da sich sonst der Rechner zum 'Bombenlegen' berufen fühlt.

Anschließend können die AES-Routinen auch im ST-Basic ihre Verwendung finden.

Fenster

Eine Vielzahl der AES-Routinen dient dem Aufbau und der Steuerung der Fenster. Einige dieser Befehle sind auch im ST-Basic vorgesehen, nämlich diejenigen zum Offnen, Schließen und Löschen von Fenstern (OPENW, CLOSEW und CLEARW). Das AES bietet allerdings eine weitaus größere Anzahl von Befehlen, die sich auf die Fenster beziehen. Zwar sind nicht alle Befehel zum Einsatz in Basic geeignet, der verbleibende Teil aber ist durchaus interessant und hilft in Basic-Programmen, die Fähigkeiten des ATARI ST besser zu nutzen. Die AES-Routinen werden direkt über die Basic-AES-Schnittstelle, dem GEMSYS-Befehl angesprochen.

Ein Beispiel hierzu zeigt die Routine zum Einstellen der Fenstergröße. Im ST-Basic ist dies nur durch 'FULLW' vorgesehen. Mit Hilfe einer AES-Routine kann man aber die Größe und den Ort der vier Fenster beliebig angeben. Dazu benötigt die Routine den linken oberen Eckpunkt, die gewünschten Ausmaße und die Nummer des Fensters.

Der Aufruf erfolgt durch:

XPOS = .. : YPOS = ..   
BRETI = .. : HOCH = .. :  
FENSTERNR = 1..4 :  
GOSUB SETWIND:  

Die Fensternummern entsprechen nicht denen des Basics. Den Fenstern sind folgende Werte zugeordnet:

EDIT - 1  
LIST - 2  
OUTPUT - 3  
COMMAND - 4  

Nutzung des gesamten Bildschirms

Da alle Ausgabebefehle des Basics im Output-Fenster ausgegeben werden, ist am Bildschirmrand immer das Output-Window zu sehen. Für manche Anwendung wäre es aber zweckmäßiger, wenn man dieses Fenster umgehen, oder besser gesagt, es unsichtbar machen könnte. Bei dem ATARI ST ist bekanntlich fast alles möglich, so auch dies. Ein einfacher Weg ist, unter Benutzung der vorherigen Routine, das Output-Window etwas größer zu definieren als den Bildschirm. Dadurch werden die Randzonen des Fensters aus dem Bildschirm herausgedrängt, das Ergebnis bis auf die Menüzeile, (weißer Bildschirm), welchen man mit allen Basic- und GEMBefehlen ansprechen kann.

Aufruf durch:
Gosub INIT
Gosub FULLWINDOW

Besonders bei Hardcopies tritt diese Funktion positiv in Erscheinung, da sich dort die Fensterumrandungen doch sehr störend auswirken.

Das Unterprogramm bietet die Möglichkeit, nach eigenem Geschmack festzulegen, ob das Fenster ganz verschwindet, oder ob noch ein feiner Rand sichtbar bleibt. Somit läßt sich eine Hardcopy auch umrahmt auf dem Drucker ausgeben. Die Werte für den umrandeten Bildschirm sind im Listing in Klammern angegeben.
Die Basic-Befehle 'FULLW, CLEARW, OPENW' arbeiten problemlos mit dem großen Fenster zusammen, bei 'CLOSEW 2' ist es erforderlich, das Fenster vorher mittels 'FULLW 2' wieder auf 'normale' Größe zurückzustellen. Weiterhin sollte man darauf achten, daß sich die Ubereinstimmung der GEM-Koordinaten und der BasicKoordinaten dadurch ändert. In den bisherigen Unterprogrammen wurden alle GEM-Ausgabebefehle denen des Basics angeglichen.- Die Koordinaten wichen in X-Richtung um ein Pixel und in Y-Richtung um 38 Pixel voneinander ab. Bei der Verwendung des gesamten Bildschirms beträgt die Abweichung in Y-Richtung nur noch 19 Pixel, und die X-Koordinaten sind gleich, was in den betreffenden Unterprogrammen berücksichtigt werden muß.

Löschen der Menüzeile

Nach Anwendung der FULLWIND Routine bleibt die erste Zeile (Menüzeile) bestehen. Diese Zeile kann von keinem Basic-Befehl angesprochen werden, sie dient lediglich der lnformation über die Menüpunkte. Wer auch sie beim Ausdruck vom Papier verbannen möchte, der kann dies mit folgendem Programm tun. Das Programm zeichnet mittels der VDI-Routine 'RECHTECK' ein weißes Rechteck in die oberste Bildschirmzeile, welches so dimensioniert ist, daß es gerade die betreffende Zeile überdeckt.

Durch dieses Programm bleibt die erste Zeile für immer verschwunden und kann nur durch einen Neustart oder durch die - schon zuvor beschriebene - VDI-Textausgaberoutine (siehe ST-Computer 2/86) wieder hergestellt werden. Diese Ausgaberoutine spricht, wie alle GEM-Routinen, unabhängig von dem gerade sichtbaren Fenster, den gesamten Bildschirm an. Somit kann die oberste Zeile bei Bedarf wieder regeneriert oder sogar nach eigenen Wünschen gestaltet werden.

Bewegungseindrücke

AES verfügt über Routinen, die den Eindruck vermitteln, es bewege sich ein Rechteck von einem Punkt zum andern oder wachse aus dem Bildschirm auf seine volle Größe heraus. Anwendungen finden diese Routinen beispielsweise beim Aufbau eines Fensters (z. B. Directory anzeigen) oder beim Einblenden einer Meldung (z. B. Desk-Info).
Auch in Basic sind diese Routinen ansprechbar und helfen so, manches Programm grafisch interessanter zu gestalten.
Im AES existieren drei verschiedene Routinen.

GROW BOX & SHRINX BOX

Mit dieser Routine kann der Bewegungsablauf eines Rechteckes abgebildet werden, das sich von einem Punkt des Bildschirms auf einen anderen Punkt zubewegt, um sich dort auf eine vorgewählte Größe auszudehnen. Die Routine benötigt als Parameter den oberen linken Eckpunkt des Startrechteckes und dessen Ausdehnung, ebenso die Werte für das Zielrechteck, wobei diese sich unterscheiden können. Das Rechteck beginnt nun am Startpunkt (XPOS1; YPOS1) mit der Anfangsgröße (BREITI; HOCH1) seine Bewegung bis zum Zielpunkt. Anschließend vergrößert es sich auf die Endmaße (BREIT2; HOCH2). Diese Routine bildet ausschließlich den Bewegungsablauf ab; das entstehende Rechteck muß durch eine andere Routine gezeichnet werden. Dies könnte mit vier LINEF-Befehlen oder besser mit den dafür vorgesehenen VDIRechteckroutinen erreicht werden (siehe ST 2/86).

Der Aufruf von 'GROWBOX' erfolgt durch:
XALT = .. : YALT = ...:
XNEU = .. : YNEU = ...:
BREIT1 = .. : HOCH 1 = ..:
BREIT2 = .. : HOCH2 = ..:
Gosub GROWBOX

Mit Hilfe dieser und der folgenden Routine werden sehr schöne grafische Effekte erzielt, beispielsweise zum Einblenden von Informationen oder eines Auswahlmenüs. Damit die Hintergrundinformation nicht verlorengeht, sollte man hierbei mit dem 'XOR-Grafikmodus' arbeiten (siehe ST-Computer 2/86).

SHRINX BOX ist die Umkehrfunktion der GROWBOX-Routine. Sie wird mit den gleichen Parametern angesprungen wie die 'GROWBOX' Routine. Der Bewegungsablauf ist genau entgegengesetzt, das Rechteck verkleinert sich und bewegt sich anschließend zum Zielpunkt auf den ehemaligen Startpunkt zurück, wo es verschwindet. Zum Einsatz kommt diese Routine beispielsweise beim Schließen eines Fensters (Löschen Directoryfenster). Falls die Parameter nicht verändert wurden, erfolgt der Aufruf durch:

Gosub SCHRUMPFBOX

andernfalls müssen die acht Parameter neu definiert werden (siehe GROWBOX).

MOVEBOX
Die letzte Routine dieser Gruppe ist 'MOVEBOX'. Sie bewegt ein Rechteck mit gleichbleibender Größe von einem Punkt zu einem anderen. Wie die vorherigen Routinen sorgt auch diese nur für den Bewegungsablauf. Die Rechtecke an sich bzw. der Inhalt dieses Bereiches müssen extra gezeichnet werden.
Der Aufruf dieses Unterprogrammes erfolgt durch:
XALT = .. : YALT = ..:
XNEU = .. : PNEU = ..:
BREIT = .. : HOCH = ..:
Gosub MOVEBOX

62150 MOVEBOX: 
62152 ' --> BREIT; HOCH; XALT; YALT
62154 ' --> XNEU; YNEU
62156 poke control+2,6 
62158 poke control+4,1 
62160 poke gintin,breit
62162 poke gintin+2,hoch
62164 poke gintin+4,xalt +1 
62166 poke gintin+6,yalt +38 
62168 poke gintin+8,xneu +1 
62170 poke gintin+10,yneu +38 
62172 gemsys 72
62174 return
62176 '-----------------------
Fortsetzung folgt (HS)

Aus: ST-Computer 04 / 1986, Seite 39

Links

Copyright-Bestimmungen: siehe Über diese Seite