next up previous contents
Nächste Seite: Menu Aufwärts: Die Komponenten Vorherige Seite: Die Komponenten   Inhalt


Frame

Eine graphische Benutzeroberfläche besteht in erster Linie aus einem Fenster. Das folgende Beispiel zeigt, wie ein einfaches Fenster erzeugt werden kann:


    /* Example simple.c */

    #include <stdio.h>
    #include "japi.h"
    
    int main()
    {
        int frame;
    
        if(j_start()<0)
            printf("can't connect to server\n"),exit(0);
    
        frame     = j_frame("");
        j_show(frame);
    
        getchar();
    
        j_quit();
        exit(0);
    }
    
    compile:  gcc simple.c -o simple -ljapi
 

Abbildung 2.1: Ein einfaches Fenter unter JAPI.
simple.eps

Wir wollen nun Schritt für Schritt die benutzten Funktionen besprechen. Um eine graphische Ausgabe zu erzeugen, muss zunächst der JAPI Graphik Kernel gestartet werden:


    j_start()

Die Funktion liefert J_TRUE zurück, sofern der Graphik Kernel korrekt gestartet wurde. Ist ein Fehler aufgetreten, so wird J_FALSE zurückgeliefert.

Die nächste Funktion:


    j_frame("Ueberschrift")

erzeugt ein Hauptfenster (Frame) für die Applikation. Dieses Graphik Element Frame erwartet einen Parameter. Dies ist eine Überschrift, die im Rahmen der Applikation eingeblendet wird. Wird ein leerer String übergeben, so wird eine Standartüberschrift verwendet, wie sie auch in Abbildung 2.1 zu sehen ist.

Ein Frame besitzt zunächst eine Größe von 400 mal 300 Pixeln. Wie diese Größe verändert werden kann, werden wir später noch kennenlernen.

Die Funktion j_frame() erzeugt zwar einen Frame, stellt diesen aber noch nicht am Bildschirm dar. Erst nach der folgenden Funktion wird der Frame sichtbar:


    j_show(frame)

Das Beispiel wartet nun in der Konsole auf die Eingabe eines Zeichens, um die Applikation zu beenden. Dann wird mit der Funktion:


    j_quit()

die Applikation veranlaßt sich vom JAPI Kernel zu trennen. j_quit() ist somit die letzte Anweisung, die der JAPI Sever entgegennimmt. Weitere japi Funktionen können dann nicht mehr ausgeführt werden.

Das Beispiel erzeugt Fenster, das eine standardisierte Breite und Höhe besitzt, siehe Abbildung 2.1. Es gestattet jedoch noch keine Interaktion mit dem Benutzer. Wir wollen das Beipiel nun so erweitern, daß der Benutzer mit der Maus das Programm beenden kann.

Unter jeder Oberfläche existiert im Fenterrahmen ein Icon, mit dem ein Program beendet werden kann. In der Regel befindet sich dieses Icon in der rechten oberen Ecke, und besizt ein 'X' als Symbol.

Im Beispiel wurde ein Frame erzeugt, und in einer Varaiblen mit dem Namen 'frame' gespeichert. Der gespeicherte Wert repräsentiert einen Index, über den auf das eigentliche graphische Element zugriffen werden kann. So erwarten z.B. auch die Funktion j_show() einen solchen Indexwert, der ihr zeigt, welches Element anzuzeigen ist. Über diese Indexwerte ist aber noch mehr möglich. Erfolgt eine Benutzeraktion, so wird über diesen Index angezeigt, in welchem graphischen Element die Aktion geschehen ist. Deshalb werden diese Indexwerte auch Eventnummern der Elemente genannt. Die Eventnummer eines Frames ist nun genau an das Close Icon des Fenterrahmen gebunden. Wird nun also vom Benutzer dieses Icon angeklickt, so wird die Applikation mit der Eventnummer des Frames benachrichtigt, die dann entsprechen reagieren kann. Eine geeignete Reaktion wäre in unserem Beispiel das sofortige Ende der Applikation.

Die Frage ist nun, wie bekommt eine Applikation die Eventnachricht. Unter JAPI gibt es eine Funktion, mit der überprüft werden kann, ob ein Event vorliegt. Die Funktion:


    j_nextaction() 

liefert die entsprechende Eventnummer des Objektes in dem der Benutzer eine Aktion durchführte. j_nextaction() ist blockierend, d.h. die Applikation schlummert in dieser Funktion solange, bis der Benutzer eine Aktion durchführt. Wir werden später auch noch eine nichtblockierende Funktion kennenlernen. Nun können wir unser erstes Beispiel so erweitern, daß der Benutzer die Applikation durch Anklicken des Close Icons im Fensterrahmen beenden kann.


/* Example frame.c */

#include <stdio.h>
#include "japi.h"

int main()
{
    int frame;

    if(j_start()<0)
        printf("can't connect to server\n"),exit(0);

    frame = j_frame("");

    j_show(frame);

    while(1)
    {
        if(j_nextaction()==frame)
            break;
    }

    j_quit();
    exit(0);
}


compile:  gcc frame.c -o frame -ljapi 

Neu ist die Endlosschleife:


    while(1)
    {
        if(j_nextaction()==frame)
            break;
    }

in der die Applikation solange verweilt, solage der Japi Server nicht die Identifikationsnummer des Frames zurückliefert. Die Nummer des Frames wird genau dann geliefert, wenn der Benutzer den entsprechenden Close Button des Fensters anklickt. Mit anderen Worten ist die Eventnummer des Frames eindeutig an die Aktion ''Schließen des Framewindows'' gebunden.

Die Endlosschleife ist ein weiteres elementares Element jeder JAPI Applikation. Diese Schleife findet sich in allen Programmen wieder, die auf Benutzeraktion reagieren. Sie wird auch als ''Event Loop'' bezeichnet. Wie bereits erwähnt, liefern viele der graphischen Elemente ein Event, wenn der Benutzer eine entsprechende Aktion ausführt. Bei einem Frame ist diese Aktion nun eben das Anklicken des Close Button, der sich im Fenterrahmen befindet.


next up previous contents
Nächste Seite: Menu Aufwärts: Die Komponenten Vorherige Seite: Die Komponenten   Inhalt
Merten Joost 2003-02-26