III. Beispiel: Umgang mit mehreren Fenstern

  • Ziel des Beispiels:
  • Ein Programm, welches auf Knopfdruck ein leeres Fenster öffnet

    1. Die Schritte 1 bis 5 vorhergehender Beispiele wiederholen sich an dieser Stelle:
    2. Als nächstes bauen wir eine Funktion, die einfach ein Fenster ausgibt. Dazu legt man über New -> Code -> Function/Method eine neue Funktion an.
      Die Funktion, die ich "NewWindow" nenne hat vorerst keine Eingabewerte, wichtig ist aber der Rückgabewert: ein Pointer auf ein Fl_Window:
      			Fl_Window*
      		
    3. Jetzt wird innerhalb der gerade anglegten NewWindow()-Funktion über New -> Group -> Window ein neues Fenster eingefügt. Dabei spielt es jetzt im Moment noch keine Rolle, was das Fenster eigentlich für Eigenschaften hat.
    4. Als nächste wird noch innerhalb der NewWindow()-Funktion eine manuelle Rückgabe eingefügt, dies ist nötig, damit die Funktion einen Pointer auf das eben geschaffene Fenster zurückliefern kann.
      Um das zu realisieren, wird über New -> Code -> Code unterhalb des eben angelegten Fensters (C-Hierachie!) ein neues Codefragment eingefügt. Dessen Befehlszeile ist sehr einfach und kurz:
      			return w;
      		

      Zur Erklärung: FLUID legt im späteren Quelltext immer beim Einbau eines Fenster einen Pointer mit dem Namen w an, sowohl in der main()-Methode als auch bei allen anderen Fenstern. Und da unsere Funktion noch keine Rückgabeanweisung hat, muss diese nun manuell eingefügt werden, dabei muss man die strikte Quelltext-Generierung von FLUID "missbrauchen".

    5. Damit ist die NewWindow()-Funktion fertig und wir können uns der Button_CB zuwenden. Diese hat noch immer den Funktionskopf
      		static void Button_CB(Fl_Widget*,void*)
      		

      ,wie im Beispiel II-1.
      Die Callback-Funktion des Buttons benötigt (wieder) ein Codefragment, welches über New -> Code -> Code eingefügt wird. Die Befehlszeile lautet diesmal:
      			NewWindow()->show();
      		

      Zur Erklärung: NewWindow() ist klar, das ist der Funktionsname der zuvor angelegten Funktion. An dieser Stelle liegt jetzt also irgendwo ein Pointer w, der auf ein fertiges Fenster zeigt. Mit der Klassenfunktion show() wird dieses nun angezeigt. So setzt sich diese Codezeile zusammen.

    6. Zum Schluss noch: Speichern, Kompilieren und Ausführen.
    7. Hinweis: Es ist egal, ob in der Hierachie erst die NewWindow()- und danach die Button_CB(...)-Funktion oder umgedreht.

      Tutorial-3-1.fl Tutorial-3-1.h Tutorial-3-1.cpp

    Ein Programm, welches auf Knopfdruck ein leeres Fenster öffnet und auf Knopfdruck wieder schließt

    1. Ich greife an dieser Stelle auf das erste Beispiel dieses Abschnittes zurück, weil dieses Beispiel nur eine Erweiterung ist.
      In dieser Erweiterung soll es darum gehen, dass das Fenster, welches sich auf Knopfdruck öffnet, einen "Schließen"-Button enthält.
    2. Dem Fenster in der NewWindow()-Funktion gibt man als erstes einen Pointernamen (Eigenschaftsfeld des Fensters: C++/Name), bei mir im Beispiel SubWindow.

    3. Außerdem fügt man im Fenster in der Funktion NewWindow() einen Button ein, dessen Label ich im Beispiel einfach "Schließen" nenne.
    4. Jetzt kommt die Callback-Funktion des eben angelegten "Schließen"-Buttons. An dieser Stelle nutze ich eine Verkürzung, die sich vorallem bei sehr kurzen Callback-Funktionen eignet.
      Anstatt wie bisher den Namen der Callback-Funktion in das Feld Callback einzutragen, trägt man zwei ganz normale Codezeilen ein:
      				SubWindow->hide();
      				delete SubWindow;
      		

      Zur Erklärung: Die allgemein übliche Methode ein FLTK-Fenster zu schließen funktioniert über die hide()-Funktion. Die Referenzierung erfolgt durch den Pointernamen SubWindow, den unser Fenster (NICHT HAUPTFENSTER) trägt.
      Der zweite Befehl löscht darüber hinaus das Fenster und räumt es aus dem Speicher.

    5. Zum Schluss noch Speichern, Kompilieren und Ausführen.
    6. Tutorial-3-1.fl Tutorial-3-1.h Tutorial-3-1.cpp

    Ein Programm, welches Berechnungen am Kreis ausführt

    1. Ziel dieses etwas komplexeren Programmes ist es, den Umfang und den Flächeninhalt eines Kreises zu berechnen. Im Gegensatz zu den bisherigen Programmen soll der Radius in einem separaten Fenster eingegeben werden.
      Da das etwas komplexer nun wird, ist hier eine Auflistung der Elemente, die im Laufe des Programms erstellt werden müssen: