GEM-Programmierung: Fenster

Erzeugen von Fenstern

Das Erzeugen eines Fensters erfolgt in zwei Schritten. Zunächst wird ein Fenster erzeugt, das heißt, es wird bei GEM angemeldet und die Datenstrukturen angelegt. Dann wird es eröffnet. Erst im zweiten Schritt ist es auf dem Bildschirm zu sehen.

Auch beim Schließen gibt es diese Stufen. Zunächst wird geschlossen, erst im zweiten Schritt wird es auch aus dem System entfernt.

   /* Die gewuenschten Rahmenelemente */
   FensterStil = CLOSER | MOVER | SIZER  . . . ;

   FensterHandle = wind_create(FensterStil,maxx,maxy,maxw,maxh);
   if (FensterHandle < 0) {
      /* kein Fenster mehr zur Verfuegung */
   } else {
      if (wind_open(FensterHandle, posx,posy,posw,posh) == 0) {
         /* Fehler aufgetreten */
      }
      . . .
   }
   . . .

   wind_close(FensterHandle);  /* Schliessen */
   wind_delete(FensterHandle); /* Abmelden */

Zu Anfang sieht man die Definition der Rahmenelemente. Im Beispiel soll das Fenster eine Schließbox, einen verschiebbaren Titelbalken und eine Vergrößerungsbox enthalten. Mit diesem Parameter wird die Funktion wind_create aufgerufen, die das Fensterhandle zurückliefert, sofern GEM noch Fenster zur Verfügung hat. Da GEM ursprünglich eine begrenzte Zahl von Fenstern hatte, ist die Abfrage, ob noch ein Fensterhandle zur Verfügung steht, von besonderer Bedeutung. Die Positionskoordinaten mit dem Präfix max sind die maximal zulässige Ausdehnung des Fensters. Im Normalfall verwendet man hier die Dimensionen des Desktops. Sie sagen etwas darüber aus, wie groß das Fenster im Laufe des Programms höchstens werden kann. Das Fenster ist nach diesem Aufruf noch nicht auf dem Bildschirm sichtbar.

Erst die Funktion wind_open erzeugt auf dem Bildschirm einen sichtbaren Rahmen des Fensters. Der weiße Hintergrund des Fensters muß durch den Programmierer erzeugt werden, indem er anschließend ein weiß gefülltes Rechteck mit den Koordinaten des Arbeitsbereiches zeichnet. Die Koordinaten mit dem Präfix pos legen die tatsächliche Position des Fensters fest.

Fensterereignisse

GEM erhält die Fensterereignisse wie alle anderen Ereignisse nach dem Aufruf der Funktion evnt_multi als Rückgabewert. Als Parameter an evnt_multi wird unter anderem ein Array übergeben, das nach einem Fensterereignis nähere Informationen enthält. Dies sind einmal das Handle des betroffenen Fenster und die Bildschirmpositionen, die für die Bearbeitung des Ereignisses benötigt werden. Letztere können nur im Zusammenhang mit der Nachricht interpretiert werden. Beim Verschieben geben sie z. B. die Zielposition an.

   aktion = evnt_multi(handle, . . ., Bereich, . . .      );
   switch(aktion) {
      . . .
      case WMMOVED:
         Verschiebe(Bereich);
      . . .
   }
   . . .

void Verschiebe(int *Bereich)
{
   /* Bereich[0] bis [2] enthalten nachrichtenspezifische Details.
    */
   wind_set(message[3], /* Handle des Fensters */
         WF_CURRXYWH,   /* Position aendern    */
         Bereich[4],    /* neue x-Koordinate */
         Bereich[5],    /* neue y_Koordinate */
         Bereich[6],    /* Fensterbreite (unveraendert) */
         Bereich[7]);   /* Fensterhoehe (unveraendert) */
}

Der Mehraufwand für die Verschiebung des Fensters, die in anderen Oberflächen vom System übernommen wird, hält sich in Grenzen.

Fenster maximieren

Bei GEM erfordert die Nachricht zum Maximieren des Fensters die Speicherung der aktuellen Fensterposition und die manuelle Positionierung des Fensters auf die maximale Fenstergröße. Unter GEM muß auch festgestellt werden, ob das Fenster bereits auf maximale Fenstergröße eingestellt war, um es auf die Originalgröße reduzieren zu können.


Computer-Oldies - Atari ST Programmierung - Informatik-Ecke (C) Copyright 1999 Arnold Willemer