AMIGA-Magazin · Ausgabe 4/05 OS4-Programmierung: Gadtools und Reaction

Aktuelles Heft 04/05

GUI-Macher

Die »Gadtools« und »Reaction« sind für die Gestaltung der Benutzeroberfläche zuständig. In dieser Ausgabe wollen wir den beiden Bibliotheken unsere Aufmerksamkeit schenken und Oberflächen programmieren.

von Michael Christoph

 

Obwohl sich beide Libraries kaum verändert haben, gibt es doch einige Kleinigkeiten, die man bei der Programmierung unter AmigaOS 4 beachten sollte. Informationen zur Handhabung der Interfaces und die entsprechenden Basis-Zeigernamen finden Sie im Kasten »Die Reaction-Basiszeiger«.

Die mit Kickstart 2.0 eingeführte gadtools.library erleichterte die Erstellung von Gadgets und Menüs stark. Sie brachte viele neue Gadget-Typen mit und wurde mit der Workbench in »Amiga OS 3.5« größtenteils durch Reaction abgelöst. Das Erzeugen der Menüs wurde in die Window-Klasse verlagert ­ damit kann die NewMenu-Struktur direkt übergeben werden. Dadurch haben die Gadtools unter OS4 praktisch keine Bedeutung mehr und sollten nicht mehr verwendet werden. Unter Reaction stehen alle bekannten Gadget-Typen zur Verfügung ­ dazu kommen einige Neuerungen.

Auf Grund der Änderungen ist die gadtools.library auch nicht im AutoInit-Code vorhanden (Stand SDK 51.3) und muss daher selber geöffnet und geschlossen werden. Die Reaction-Classes hingegen werden automatisch geöffnet, wenn die Linkeroption -l raauto angegeben wird. Die Option ra steht dabei für Reaction.

Zwar wird MUI als OS4-native-PPC-Version geliefert, trotzdem ist es als AddOne zu betrachten. Die offizielle Oberfläche besteht aus Reaction-Gadgets, wie es auch die Systemprogramme (Prefs-Einsteller etc.) recht deutlich zeigen. Daher gibt es hierfür (bisher) auch keine AutoInit-Library.

Reaction Schritt für Schritt
Anhand eines kleinen Beispieles soll die praktische Benutzung von Reaction aufgezeigt werden. Ziel davon ist ein kleines Fenster, das ein Menü hat, sowie einen Button und ein Checkbox-Gadget. Der Button kann auch einfach durch andere Gadgettypen ersetzt werden und so als Grundlage für unterschiedliche Tests dienen. Das Gadget wird, wie alle anderen Objekte auch, per Funktion NewObject() angelegt ­ das Beispiel sehen Sie in Listing 1.

Paralell verhält es sich mit dem Anlegen des Fensterobjekts. Übergeben werden können die meisten der WA-Tags von OpenWindow und zusätzlich die WINDOW_xxx-Defines aus dem Include classes/window.h (Listing 2). Benötigt wird noch ein Layout-Objekt, das sich automatisch um Größenänderungen kümmert und diese an die Gadgets weitergibt (s. Listing 3).
Was jetzt noch fehlt ist das Menü für das Fenster. Dieses wird anhand der bekannten NewMenu-Struktur beschrieben. Man findet diese im Include libraries/
gadtools.h beschrieben. Diese Struktur kann direkt im WINDOW_NewMenu beim Anlegen des Fensters mitgegeben werden (s. Listing 4)

Mit AmigaOS 4 sind die Reaction-Gadgets auch BubbleHelp-fähig geworden. Das heißt, wird die Maus über ein Gadget bewegt, wird ein Hilfetext angezeigt. Dabei übernimmt das Betriebssystem wieder die ganze Arbeit. Man muss lediglich die einzelnen Texte hinterlegen. Dazu dient die Struktur HintInfo ­ zu finden im Include classes/
window.h (Listing 5). Der vierte Wert ist für zukünftige Flags reserviert und zur Zeit mit dem Wert 0 zu belegen. Die Struktur muss nur noch im Fensterobjekt hinterlegt werden (Listing 6).

Über den Aufruf WINDOW_GadgetHelp, FALSE wird sie deaktiviert und nicht weiter angezeigt. Der Wert TRUE schaltet das BubbleHelp an. Zur Kontrolle von BubbleHelp wird das Beispielprogramm noch um eine Checkbox erweitert. Damit lässt sich die Hilfe wie in Listing 7 ein- und ausschalten.

Nach diesen Vorbereitungen folgt im Programm eine Nachrichtenschleife, die sich um die einzelnen Messages des Gadgets, des Fensters und des Menüs kümmert. Zuvor muss allerdings noch das Fenster angezeigt werden, da es bisher lediglich unsichtbar erzeugt wurde. Dazu wird das Makro RA_OpenWindow benutzt. Da es sich um ein Makro handelt, darf hier kein Basiszeiger vorangestellt werden. Analog gehen Sie bei RA_HandleInput und RA_CloseWindow wie in Listing 8 vor.

Nicht vergessen werden darf, am Programmende alle erzeugten Objekte auch wieder freizugeben. Das ist allerdings recht einfach, da die DisposeObject()-Funktion auf das Fenster angewendet, auch alle darin enthaltenen Objekte mit vernichtet:

IIntuition->DisposeObject(gb_WindowObj);

Versehen mit den notwendigen Includes und der main-Funktion ist das vollständige Beispiel in der Datei "ReactionEx.c" zu finden. Das Beispielprogramm und den kompletten Quelltext finden Sie auf der CD zu dieser Ausgabe im Verzeichnis »Amiga Magazin« und da in der Schublade »OS4-Programmierung«.

Format der .res-Dateien bisher in der Praxis gescheitert.
Wer also Programme dieser Art nach PPC portieren möchte, muss viel Handarbeit investieren, um alle Elemente der Oberfläche mittels NewObject() direkt anzulegen. Wer sich davon aber nicht abschrecken lässt, findet im Kasten »Ressource-Daten anpassen« ein paar Tipps, die aber auch beim kompletten Neuschreiben hilfreich sind.

In der nächsten Ausgabe geht`s dann richtig unter die Oberfläche von AmigaOS 4. Sie lesen dann, wie ppc-native Libraries und Devices programmiert werden und wie man diese einfach mit einem 68k-Interface versehen kann, falls sie auch von alten Anwendungen noch benutzt werden sollen

Reactor problematisch
Ressource-Daten anpassen
Abhängig vom verwendeten Compiler muss der Startupcode für den Workbenchstart und die Includes angepasst werden.
Das Öffnen der einzelnen Reaction-Klassen kann man sich ersparren, wenn beim Linken -l raauto angibt.
Statt dem Erzeugen und Layouten des Menus kann der neue Tag WINDOW_NewMenu verwendet werden.
-D __USE_INLINE__ und -D __USE_BASETYPE__ kann auf die Interfaces schrittweise verzichtet werden.
Dann muss allerdings auch noch -l auto beim Linken angegeben werden, damit zu jeder notwendigen Library auch das Interface automatisch geöffnet und geschlossen wird.
Vielleicht erinnert sich der eine oder andere Leser noch an das umfangreiche Reaction-Beispielprogramm aus Amiga-Magazin 1/2000 [1]. Damals wurde mit dem GUI-Creater »Reactor« eine Resource-Datei erstellt. Diese Datei wurde dann im Programm nur noch geöffnet und die Daten daraus gelesen, um die komplette Oberfläche automatisch zu erstellen.

Ein Problem stellt dabei die von Reactor erzeugte Objektdatei dar. Diese liegt im 68k-Format vor und kann nicht vom gcc zum restlichen im ppc-Format vorliegenden Source hinzugelinkt werden. Mit Hilfe von »vlink« (Linker von vbcc) sollte es zwar theoretisch möglich sein, funktioniert aber in der Praxis nicht immer. Und auch ein Konverter von Resourcedatei nach Sourcecode ist auf Grund mangelnder Informationen über das Format der .res-Dateien bisher in der Praxis gescheitert.

Wer also Programme dieser Art nach PPC portieren möchte, muss viel Handarbeit investieren, um alle Elemente der Oberfläche mittels NewObject() direkt anzulegen. Wer sich davon aber nicht abschrecken lässt, findet im Kasten »Ressource-Daten anpassen« ein paar Tipps, die aber auch beim kompletten Neuschreiben hilfreich sind.

In der nächsten Ausgabe geht`s dann richtig unter die Oberfläche von AmigaOS 4. Sie lesen dann, wie ppc-native Libraries und Devices programmiert werden und wie man diese einfach mit einem 68k-Interface versehen kann, falls sie auch von alten Anwendungen noch benutzt werden sollen.

lb

Literatur:
[1] Inspektor Gadget, Michael Christoph, Amiga Magazin 1/2000

 

Die Reaction-Basiszeiger
Basis  
struct GadToolsIFace *IGadTools; Basiszeiger für die alten Gadtools-Gadgets.

struct WindowIFace *IWindow;

Fensterobjekt

struct RequesterIFace *IRequester;
Requester-Objekt.
struct LayoutIFace *ILayout;
Anordnen der Gadgets in horizontale und vertikale Gruppen.
struct VirtualIFace *IVirtual;
Eine nicht unbedingt vollständige Layout-Gruppe.
Labels  
struct BevelIFace *IBevel;
Rahmen zum Gruppieren von Elementen, optional mit Beschriftung

struct BitMapIFace *IBitMap;

Anzeigen von Grafiken, die mittels DataType geladen werden

struct GlyphIFace *IGlyph;
Gruppe vordefinierter System-Symbole
struct LabelIFace *ILabel; Feldbeschriftung, muss einem anderen Objekt zugeordnet werden
struct PenMapIFace *IPenMap; Vergleichbar IBitMap, allerdings müssen die Daten direkt zum Code
hinzugelinkt werden
Gadgets  
struct ButtonIFace *IButton; Normaler Knopf zum Drücken, kann auch ein/ausschaltbar sein
struct CheckBoxIFace *ICheckBox;
Feld zum Abhaken
struct ChooserIFace *IChooser;

Cycle-Gadget (als Pop-Up- oder Drop-Down-Version)

struct ClickTabIFace *IClickTab; Dragbar für mehrere Seiten
struct ColorWheelIFace *IColorWheel; Farbrad für Farbauswahl
struct DateBrowserIFace *IDateBrowser; Monats-Kalender
struct DrawListIFace *IDrawList;
Erstellung von frei skalierbaren Objekten
struct FuelGaugeIFace *IFuelGauge; Füllstandsanzeige
struct GetFileIFace *IGetFile;
Anzeige/Auswahl einer Datei oder Verzeichnisses zum Laden oder
Speichern
struct GetFontIFace *IGetFont; Anzeige/Auswahl eines Zeichensatzes
struct GetScreenModeIFace *IGetScreenMode; Anzeige/Auswahl eines Bildschirmmodus
struct IntegerIFace *IInteger; Zahleneingabefeld

struct ListBrowserIFace *IListBrowser;
Listen-Objekt, kann hierachische Gruppen enthalten und Anzeigeelemente
struct PaletteIFace *IPalette;
Farbauswahl aus einer Farbpalette (max. 256 Farbregister möglich)
struct PopupMenuIFace *IPopupMenu;
Kontextabhängige Pop-Up-Menüs anzeigen
struct RadioButtonIFace *IRadioButton;
Auswahlgruppe, von denen einer angewählt ist

struct ScrollerIFace *IScroller;
Schiebebalken mit dynamischer Breite

struct SliderIFace *ISlider;
Schiebeknopf mit fester Breite
struct SpaceIFace *ISpace; »Unsichtbares« Platzhalter-Objekt

struct SpeedBarIFace *ISpeedBar;

Fortschrittsanzeigebalken
struct StringIFace *IString; Einzeiliges Texteingabefeld
struct TextClipIFace *ITextClip;
Einfache Handhabung von Text im Clipboard

struct TextEditorIFace *ITextEditor;
Ein mehrzeiliges Eingabefeld (z.B. in Notepad verwendet)


Beispiel:
Die BubbleHelp-Funktion von AmigaOS 4 in der Praxis.

 

 

Listingübersicht

Listing 1: Ein Reaction-Gadget definieren

Listing 2: Defintion eines Reaction-Fensters.
Listing 3: Die Größenänderung anpassen.
Listing 4: Das Menü für das Reaction-Beispiel.
Listing 5: Die Struktur für die Hilfstexte.
Listing 6: Die Window-Objekt-Struktur
Listing 7: BubbleHelp ein- bzw. ausschalten.
Listing 8: Das Fenster zeigen bzw. ausblenden.

 

 


Download:enthält:
Download ReactionEx.c : Reaction-GUI mit BubbleHelp
os4prog-9-reaction-src.lha,
42.541 bytes


Hauptseite © 2005 All Rights Reserved. Alle Rechte vorbehalten Franzis' Verlag GmbH
Veröffentlichung und Vervielfältigung nur mit schriftlicher Genehmigung des Verlags

Kommentare, Fragen, Korrekturen und Kritik bitte an Webmaster AMIGA schicken.
Zuletzt aktualisiert am 23. Juli 2005, Michael Christoph.