Von Dialogen und Dialogboxen - GEM-Kurs, Teil 1

GEM, ein Zauberwort für alle, die sich noch nicht oder nicht intensiv mit der Programmierung einer grafischen Oberfläche auseinandergesetzt haben. In unserem Einstieg in dieses Thema geben wir Ihnen einen Überblick der wichtigsten Strukturen und Parameter bei Dialogen.

Bei den Strukturen und den dazugehörigen Parametern soll nicht jede Einzelheit aufgeführt werden, denn wir gehen davon aus, daß Ihnen ein passendes Nachschlagewerk zur Verfügung steht. Hier steht vielmehr die Programmierung im Vordergrund. Beginnen wir also mit den Grundlagen.

Ein Dialog stellt so etwas wie ein Zwiegespräch zwischen Anwender und Computer dar. Vermittler ist hierbei die Dialogbox. Wir wollen uns hier in erster Linie mit der Verwaltung von Dialogen und dem Aufbau von Dialogboxen beschäftigen. GEM ist über jedes vernünftige Entwicklungssystem programmierbar. Wichtig ist u.a., daß strukturierte Datentypen erlaubt sind, denn über diese ist ein einfacher Zugriff auf die GEM-Strukturen möglich. Hier wurde die Programmiersprache C verwendet, die den besonderen Vorteil hat, portabel zu sein.

Eine zentrale Struktur für Dialogboxen ist die»OBJECT«-Struktur. Eine Dialogbox besteht aus einzelnen Objekten, die jeweils über eine OBJECT-Struktur definiert sind. Die Zusammenfassung aller Objekte einer Dialogbox wird »Objektbaum« genannt und stellt untereinander verkettete Objekte dar. Die einzelnen Strukturelemente bedeuten:

**Die »OBJECT«-Struktur ist eine zentrale Struktur für Dialogboxen** ~~~~~~~~~~~~~~~~~~~~~

typedef struct { WORD ob_next; /* Zeiger auf das nächste Objekt / WORD ob_head; / Zeiger auf das erste Kind / WORD ob_tail; / Zeiger auf das letzte Kind / UWORD ob_type; / Objekttyp / UWORD ob_flags; / Diverse Flags / UWORD ob_state; / Diverse Statusinformationen */ BYTE ob_spec; / Zeiger auf weitere Struktur / WORD ob_x; / x-Position relativ zum Parent-Objekt / WORD ob_y; / y-Position relativ zum Parent-Objekt / WORD ob_width; / Breite / WORD ob_height; / Höhe */ } OBJECT;


</div>

»ob_next«, »ob_head« und »ob_tail« sind keine echten Zeiger (Adressen), was auch schon dadurch deutlich wird, daß es sich hier um 2-Byte-Werte - oder auch Worte genannt - handelt. Ein Objektbaum ist über ein Array deklariert. Das nullte Element im Array ist das sog. Root-Objekt. »ob_next«, »ob_head« und »ob_tail« beinhalten, ausgehend von diesem Root-Objekt, die Indizes der dazugehörigen Elemente im Array. Eine 5 in »ob_tail« bedeutet somit, daß das fünfte Element im Array das letzte Child-Objekt des Root-Objekts ist. »ob_next« zeigt auf das folgende Objekt, es sei denn, es ist das letzte Element eines Parent-Objekts. In diesem Fall zeigt »ob_next« auf das Parent-Objekt. Existieren keine Child-Objekte unterhalb eines Parents, so zeigt dies der Wert »NIL« (-1) an. »ob_type« besagt, um was für ein Objekt es sich handelt. Der eigentliche Typ steht jedoch nur im unteren Byte, das obere steht zur freien Verfügung. Hier werden die sog. erweiterten Objekttypen definiert.

<div class="textkasten bggray" markdown=1>

Die Objektflags geben an, wie die einzelnen Objekte vom Anwender bedient werden können

SELECTABLE (0x0001) Anwahl durch Anklicken DEFAULT (0x0002) optisch hervorgehoben, mit RETURN wählbar EXIT (0x0004) Ausgang nach Klick mit Maus und Loslassen der Maustaste EDITABLE (0x0008) edierbares Objekt RBUTTON (0x0010) Radioknopf LASTOB (0x0020) letztes Objekt im Objektbaum TOUCHEXIT (0x0040) Ausgang nach Klick mit Maus HIDETREE (0x0080) Objekt (incl. Childobjekte) versteckt INDIRECT (0x0100) In ob_spec steht Zeiger auf eigentliche ob_spec


</div>

Die Typen und Flags bestimmen das Aussehen und Verhalten der Objekte. Auch wenn die Typen und Flags nahezu grenzenlos miteinander kombiniert werden können, gebieten die Gestaltungsregeln Einhalt. Das Strukturelement »ob_spec« soll in dieser Folge nicht ausführlich behandelt werden. Wir kommen darauf zurück, wenn dieses Element benötigt wird.

Die Elemente zur Beschreibung der Position, Höhe und Breite sind in Rasterkoordinaten angegeben. Anzumerken ist jedoch, daß die Position der Objekte immer relativ zum Parent-Objekt gemessen wird. Zur Berechnung der absoluten Position existiert eine AES-Funktion (objc_offset()).
Eine Struktur, auf die »ob_spec« zeigen kann, wird hier noch besprochen. Es handelt sich um die »TEDINFO«-Struktur, welche die Information über einen Text beinhaltet. »obspec« zeigt genau dann auf eine TEDINFO-Struktur, wenn »ob_type« im unteren Byte den Typ »G_TEXT«, »G_BOXTEXT«, »G_FTEXT« oder »G_FBOXTEXT« lautet.

Das Strukturelement »te_ptext« zeigt auf den Text, der in der Dialogbox erscheint. Die Textmaske (mit fixem Text) ist nur dann sichtbar, wenn es sich bei dem Objekt um eines mit veränderbarem Text (»G_FTEXT«, »G_FBOXTEXT«) handelt. Dann ist auch die Typmaske »te_pvalid« gefüllt. Die Textmaske ist vergleichbar mit einem Formular, welches vorgibt, wie ein Text eingetragen werden muß. Die Typmaske definiert dann, was eingetragen werden darf.

»te_font« bestimmt, mit welchem Zeichensatz der Text dargestellt werden soll. Hier stehen jedoch nur der normale Zeichensatz je nach Bildschirmauflösung) und der 6 x 6-Systemzeichensatz zur Verfügung. Unter der Justifikation »te_just« ist anzugeben, ob der Text rechtsbündig, linksbündig oder zentriert ausgegeben werden soll.

Die Farbe des Rahmens, des Textes, des Musters und noch einiger anderer (momentan für uns unwichtige) Dinge werden mit »te_color« festgelegt. Sofern ein Rahmen um das Objekt zu zeichnen ist, gibt »te_thickness« die Stärke dieses Rahmens an. »te_txtlen« und »te_tmplen« enthalten schließlich die Information über die Länge des Textes und der Textmaske.

Haben Sie nun keine Furcht vor den Objekten und Objektbäumen. Nur in den allerseltensten Fällen legt man diese Strukturen »zu Fuß« an. Resource Construction Sets nehmen Ihnen hier viel Arbeit ab. Wichtig ist in erster Linie die Kenntnis über Größe und Lage eines Objekts sowie die Bedeutung von »ob_spec« in der Objektstruktur. Mit der Größe und Lage einzelner Objekte ist es möglich, diese gezielt neu zu zeichnen, über »ob_spec« können beispielsweise Zeichenketten verändert werden.

Machen Sie sich bitte mit Ihrem Resource-Construction-Programm vertraut. Legen Sie probeweise Dialogboxen an. Sofern Ihr Resource-Construction-Programm über eine Testfunktion verfügt, ist - zumindest eingeschränkt - das Austesten eines Dialogs möglich. In der nächsten Folge wollen wir mit Hilfe eines solchen Resource-Construction-Programms eine Dialogbox entwerfen und in ein Programm einbinden. (uw)

Literatur:  
[1]	Atari ST Profibuch, Jankowski/ Rabich/ Reschke, Sybex 1987/88/89  
[2]	GEM Programmier-Handbuch, Balma/ Fitler, Sybex 1987/88

<div class="textkasten bggray" markdown=1>
**Die Objekttypen beschreiben verschiedene Darstellungsarten der einzelnen Elemente eines Dialogs mit dem Anwender
Rechtecke:**

G_BOX (20) sichtbares Rechteck G_IBOX (25) unsichtbares Rechteck Texte: G_TEXT (21) Graphiktext G_BOXTEXT (22) Graphiktext im Rechteck G_FTEXT (29) formatierter Graphiktext G_FBOXTEXT (30) formatierter Graphiktext im Rechteck G_BUTTON (26) zentrierter Text im Rechteck (Button) G_STRING (28) Text G_TITLE (32) Text, Titel eines Drop-Down-Menüs Bilder: G_IMAGE (23) Bild G_ICON (31) Icon (Bild mit Maske und Text) Zeichen: G_BOXCHAR (27) einzelnes Zeichen im Rechteck frei definierte: G_USERDEF (24) frei definierbares Objekt (wird später behandelt)


</div>

<div class="textkasten bggray" markdown=1>
**Die TEDINFO-Struktur beinhaltet Informationen zur Textdarstellung:**

typedef struct { BYTE *te_ptext; BYTE *te_ptmplt; BYTE te_pvalid; WORD te_font; WORD te_resvd1; / reserviert / WORD te_just; WORD te_color; WORD te_resvd2; / reserviert */ WORD te_thickness; WORD te_txtlen; WORD te_tmplen; } TEDINFO;


</div>

<div class="textkasten bggray" markdown=1>
**Der Objektstatus zeigt an, wie die einzelnen Objekte innerhalb des Programms gesetzt sind**

SELECTED (0x0001) Objekt gewählt (invertiert) CROSSED (0x0002) Objekt mit Kreuz CHECKED (0x0004) Objekt mit Häkchen DISABLED (0x0008) Objekt gesperrt OUTLINED (0x0010) Objekt umrahmt SHADOWED (0x0020) Objekt abhängig von Rahmendicke schattiert DRAW3D (0x0040) Objekt im 3D-Effekt (ab GEM 2.0) WHITEBAK (0x0080) Objekt ohne Hintergrundmaske bei Icons auf weißem Hintergrund (ab GEM 2.0)


</div>

Dietmar Rabich
Aus: ST-Magazin 07 / 1990, Seite 104

Links

Copyright-Bestimmungen: siehe Über diese Seite