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.
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.
Computer-Oldies - Atari ST Programmierung - Informatik-Ecke | (C) Copyright 1999 Arnold Willemer |