Ich habe diesmal etwas mehr kopiert aus dem Tutorial was der Autor genau sagt, vielleicht kennt ihr die pdf Datei ja schon, sie lautet PB-Tutorium
Kapitel Windows Handling
Nach dem letzten, etwas sehr trockenem Kapitel, können wir jetzt zu einem doch
schon interessanterem Teil der Programmierung kommen: Den Fenstern, woher auch
der Name unser aller Lieblingsbetriebssystems Windows herkommt. Warum diese
Dinger ausgerechnet Fenster heißen, weiß der Teufel. So recht was durchsehen kann
ich da ehrlich gesagt nicht… Aber was soll’s, ich muss ja auch nicht alles verstehen
und manche Dinge lassen sich auch nicht irgendwie logisch erklären, das ist bei M$
einfach so. Aber das soll nicht Thema dieses Kapitels sein, wir wollen jetzt mal lieber
lernen, wie man diese undurchsichtigen Fenster benutzt.
Naja, wenigstens sind die Dinger nicht so schwarz wie unsere Consolen

Also, genug der Vorrede. Kommen
wir nun zum Wichtigen: Wie mache ich so ein Fenster auf? Ja, dafür gibt’s wie bei
der Console einen kleinen Befehl, nämlich OpenWindow() sieht irgendwie fast so
aus, wie mit der Console…aber ganz so einfach ist das diesmal nicht

Dieser Befehl
braucht nämlich so einige Parameter, hier mal der Funktionsaufruf mit
Parameterangabe:
Code: Alles auswählen
OpenWindow(#Window, x, y, InnereBreite, InnereHöhe, Flags, Titel$ [,
ParentWindowID])
Das Ding gehen wir jetzt gleich mal Parameter für Parameter durch. Der erste
Parameter ist eine Zahl, was durch das vorangehende # gekennzeichnet ist. Damit
übergibst du dem Fenster eine konstante Nummer. Diese brauchst du, damit du
später die Fenster voneinander unterscheiden kannst. Jedes Fenster braucht eine
EIGENE Nummer, da du ja mehr als nur 1 Fenster öffnen kannst. x gibt an, an
welcher x-Position das Fenster geöffnet werden soll.
Dies gibt an, an welchem horizontalen Punkt die linke, obere Ecke des Fensters sein soll. y gibt an, an welcher
vertikalen Stelle sich die linke, obere Ecke befinden soll. InnereBreite gibt an, wie
groß das Fenster in x-Richtung sein soll. InnereHöhe gibt an, wie groß das Fenster in
y-Richtung sein soll. Flags sind spezielle Übergabewerte an das Fenster. Das kann
eine oder mehrere der folgenden Konstanten sein:
Code: Alles auswählen
#PB_Window_SystemMenu : Schaltet das System-Menü in der Fenster-
Titelzeile ein.
#PB_Window_MinimizeGadget ;Fügt das Minimieren-Gadget der Fenster-Titelzeile hinzu.
#PB_Window_System wird automatisch hinzugefügt.
#PB_Window_MaximizeGadget ;Fügt das Maximieren-Gadget der Fenster-
Titelzeile hinzu. #PB_Window_System wird automatisch hinzugefügt.
#PB_Window_SizeGadget ;Fügt das Größenänderungs-Gadget zum Fenster hinzu.
#PB_Window_Invisible ;Erstellt ein Fenster, zeigt es aber nicht an. Wird nicht
unter AmigaOS unterstützt.
#PB_Window_TitleBar ; Erstellt ein Fenster mit einer Titelzeile.
#PB_Window_BorderLess ;Erstellt ein Fenster ohne jegliche Ränder.
#PB_Window_ScreenCentered ;Zentriert das Fenster in der Mitte des Bildschirms. Die
Parameter x,y werden ignoriert.
#PB_Window_WindowCentered ;Zentriert das Fenster in der Mitte des
übergeordneten Fenster ("parent window")
Die Parameter x,y werden ignoriert. Wenn du mehrere dieser Konstanten verwendest, musst du sie mit einem „ |“
voneinander trennen. Diese Liste ist auch in der Hilfe einsehbar. Titel$ sollte sich von
selbst erklären, hier übergibt man den Namen an das Fenster, der in der Titelzeile
erscheint. Der nächste Parameter ist allerdings wieder etwas anders, als die anderen.
Dieser Parameter ist optional. Hier kann ein „Elternfenster“ angegeben werden. Aber
das lassen wir jetzt erstmal außen vor.
So, das ist jetzt zwar schön, dass wir Fenster erstellen können, aber wie wollen wir jetzt merken, dass der Benutzer zum Beispiel auf das Schließkreuz oder zum Beispiel auf einen Button geklickt hat? Nun, das ist
ganz einfach (natürlich

! Wir benötigen eine Event-Loop. Und schon wieder so
ein verwirrender Begriff :-/. Aber wie immer ganz einfach: Was eine Schleife (Loop)
ist, wisst ihr ja schon, und ein Event ist ein Ereignis. Kurz gesagt, wir brauchen eine
Ereignisschleife.
Ein Ereignis entsteht zum Beispiel, wenn der Benutzer auf eine
Schaltfläche, wie eben zum Beispiel auf das Schließkreuz, oder einen Knopf(Button)
klickt. Auch sind zum Beispiel Ereignisse, wenn das Fenster verschoben wird, oder
gezeichnet wird. Das klären wir noch.Wir schreiben jetzt einfach erstmal eine kleine
Schleife, die demonstriert, wie so etwas aussieht:
Code: Alles auswählen
OpenWindow(0,0,0,300,200,#PB_WINDOW_SCREENCENTERED |
#PB_WINDOW_SYSTEMMENU,"Hallo :-)") ;wir Öffnen das Fenster
Repeat ;unsere Schleife
;Wir warten auf ein Ereignis des Fensters
Event = WaitWindowEvent()
;Okay, irgendwas ist geschehen auf dem Fenster
Select Event ;Wir schauen, was passiert ist
Case #PB_Event_CloseWindow ;Falls das Fenster geschlossen werden soll
;Nachfrage, ob das Fenster wirklich geschlossen werden soll
aw = MessageRequester("Frage","Soll das Fenster geschlossen
werden?",#PB_MessageRequester_YesNo)
If aw = 6 ;6 = Ja-Knopf
End
EndIf
EndSelect
ForEver
Hier wird gerade ein Bild angezeigt, wie das nach dem Drücken von F5 aussieht
Sieht es nicht Originell aus?!

Wenn du auf das Schließkreuz klickst, dann kommt
eine MessageBox(MessageRequester) in der du gefragt wirst, ob du das Fenster
schließen möchtest. Klickst du auf „ja“ wird das Programm beendet (und damit auch
automatisch alle offenen Fenster geschlossen). Aber wir gehen den Code mal
Schrittweise durch, damit ihn alle verstehen. Also, als erstes öffnen wir ein Fenster
mittels OpenWindow().
Dieses bekommt die Nummer 0 (Dies ist aber jetzt ohne
Bedeutung, da wir ohnehin nur ein Fenster geöffnet haben). Dieses WÜRDE an der
Position 0,0, also links oben in der Ecke des Bildschirms angezeigt. Es hat eine
Ausdehnung von 300*200 Pixel. Die Parameter für dieses Fenster sind
#PB_WINDOW_ScreenCentered und #PB_WINDOW_SystemMenu.
#PB_WINDOW_ScreenCentered gibt an, dass das Fenster in der Mitte des
Bildschirms angezeigt wird. #PB_Window_SystemMenu gibt an, dass das Fenster ein
Systemmenü bekommt (Das Ding links oben in der Ecke).Als nächstes geben wir nur
noch als Titel „Hallo

“ an.
So, nun, da wir unser Fenster erstmal offen haben,
starten wir unsere EventLoop. Wir nehmen einfach mal eine Repeat-ForEver Schleife,
da das Programm ja nicht von alleine enden soll. In der Schleife wird zuerst der
Befehl WaitWindowEvent aufgerufen. Dieser Befehl WARTET(!!) bis ein Ereignis auf
irgend einem Fenster diesen Programmes auftritt. Ist dies der Fall gibt es das ausgelöste
Ereignis als Rückgabewert an das Programm zurück.
Wir speichern das Event einfach in die sinnvoll benannte Variable „Event“. Danach verarbeiten wir das
Ereignis in einem Select-Block. In diesem Fall ist das natürlich weniger sinnvoll, da
wir sowieso nur ein Event abfangen, nämlich das CloseEvent. Dies hat die
Bezeichnung #PB_EVENT_CloseWindow. Aber in größeren Programmen wollen wir ja
meist auf mehrere Ereignisse reagieren können, wobei sich der Select-Block anbietet,
zwecks der Übersichtlichkeit. Hier eine Liste aus der Hilfe mit den anderen
WindowEvents, die auftreten können. (Ich werde sie aber jetzt hier nicht alle
erläutern, alles nacheinander
Code: Alles auswählen
#PB_Event_Menu ;ein Menü wurde ausgewählt
#PB_Event_Gadget ;ein Gadget wurde gedrückt
#PB_Event_CloseWindow ;das Schließgadget vom Fenster wurde gedrückt
#PB_Event_Repaint ;der Fensterinhalt wurde zerstört und muss neu gezeichnet
werden (nützlich für 2D Grafik-Operationen)
#PB_Event_MoveWindow ;das Fenster wurde verschoben
Statt dem WaitWindowEvent() kannst du auch einfach WindowEvent() verwenden.
An sich verrichtet dieser Befehl fast das gleiche, bloß dass er das Programm nicht
anhält, sondern einfach weitermacht, auch wenn kein Ereignis vorhanden ist. Du
musst dich dann selbst darum kümmern, dass dein Programm nicht zuviel CPULeistung
beansprucht. Ich denke der Rest von dem Code erklärt sich selbst und ist
eigentlich alter Stoff. Noch eine kleine Anmerkung: Wenn wir ein Fenster schließen
möchten verwenden wir im Normalfalle CloseWindow(). Dies ist aber in UNSEREM
Fall unnötig, da End auch sämtliche Fenster schließt, bevor das Programm dann
auch wirklich beendet wird. So, jetzt haben wir es geschafft, ein Fenster zu öffnen,
cool nicht?! Naja, gut, es ist vielleicht cool, aber bringen tut uns das auch noch
nichts… Also machen wir fröhlich weiter

Kommen wir also zum nächsten
Abschnitt, den Gadgets.
Ps.: Ich habe hier den Abschnitt komplett kopiert (Kapitel Windows-Handling, Beschreibung und Beispiele)