Technische Tips und Tricks:Window- Programmierung von B. Kühnast Diesmal gehts um Windows, im folgenden auch Fenster genannt. Fenster dienen dazu, bestimmte Informationen mitzu- teilen (z. B. Fehlermeldungen) und anschließend den ursprünglichen Bild- schirminhalt wiederherzustellen. Als Beispiele möchte ich an Windows 3.0 auf IBM-Kompatiblen, GEM (das Atari St- Betriebssystem) und den BLACK MAGIC COMPOSER hinweisen. Letzterer ist für mich das Beste, was der XL an Fenstern zu bieten hat (an dieser Stelle ein Lob an Sven Tegethoff, falls er's liest). An dieser Stelle möchte ich noch schnell darauf hinweisen, daß es manch- mal besser ist, auf Fenster zu ver- zichten. DOS-Operationen führe ich zum Beispiel am liebsten in einer Shell aus. (Das heißt, daß die Befehle direkt eingegeben werden, wie in DOS XL oder SpartaDOS.) Das wesentliche bei der Fenster- Programmierung ist das oben erwähnte Wiederherstellen des Bildschirms. Zuerst die Lösung in Turbo-Basic. TURBO-BASIC --------------------------------------- Bitte Listing TBWIND1.TBA auf der Diskette zur Verdeutlichung ansehen. --------------------------------------- In der ersten Zeile wird der Screen ganz einfach in einen String kopiert. Die nächsten Zeilen zeichnen den Rahmen für das Fenster. Das könnt man natürlich auch weglassen, es sieht aber optisch sauberer aus. Aufruf: X=1:Y=2:X1=10:Y1=12:EXEC OPENW Diese Zeile öffnet ein Fenster von Position X,Y bis Position X1,Y1. --------------------------------------- 10100 PROC CLOSEW 10110 MOVE ADR(SCREEN$),DPEEK(88),960 10120 ENDPROC --------------------------------------- Beim Schließen wird der Screen einfach zurückkopiert. Aufruf: EXEC CLOSEW (Schön einfach, nicht?) --------------------------------------- 10200 PROC INVERT 10210 AD=DPEEK(88)+Y*40+X 10220 DPOKE 203,AD 10230 POKE 205,L 10240 DUMMY=USR(1536) 10250 ENDPROC --------------------------------------- Diese Prozedur invertiert eine Reihe Zeichen auf dem Bildschirm. Normalerweise dient sie dazu, eine Zeile anzuwählen, quasi als Cursor- Ersatz. Im Beispiel wird diese Routine auch benutzt, um einen Text blinken zu lassen. Dazu muß man nur ein EXEC INVERT ausführen, etwas warten (z. B. PAUSE 10) und wieder invertieren usw. Aufruf: X=1:Y=2:L=10:EXEC INVERT Zeigt an Position X,Y einen 10 Zeichen langen Balken. Um den verschwinden zu lassen, reicht EXEC INVERT, dabei X, Y und L einfach unverändert lassen. Die Quick-Variante sieht etwas anders aus. QUICK ----- Anmerkung: (+ und )+ entsprechen der jeweiligen eckigen Klammer. Die Quick-Prozeduren befinden sich in der Library WINDOW.LIB. Die Kommentare wurden hier aus Platzgründen weggelassen. -------------------------------------- Bitte das Listing QUICKLIS.TBA von der Diskette zur Verdeutlichung laden. --------------------------------------- Die ersten vier Zeilen besorgen das Speichern des Screens. In Turbo-Basic wird, weil's einfach und schnell ist, der ganze Bildschirm (960 Bytes) gespeichert. Hier wird der Cut-Befehl benutzt, weil so nur ein Teil des Screens übernommen wird. So spart man Platz, was besonders günstig bei der Verwendung mehrerer Fenster ist. Die restlichen Zeilen zeichnen wieder den Rahmen. Leider ist dieser Programmteil doch etwas zu langsam geworden. Allerdings könnte man diesen Programmteil einfach weglassen und das ganze Fenster mit INVERT invertieren. Aufruf: .OPENW(1,2,10,12,$A800) Die ersten vier Zahlen sind wieder die Koordinaten der linken oberen und der rechten unteren Ecke des Fensters. Die fünfte Zahl gibt an, wo der Bildschirmteil gespeichert wird. --------------------------------------- PROC CLOSEW IN BYTE (+ X,Y )+ WORD (+ BUFF )+ LOCAL WORD (+ XX )+ BEGIN MUL(X,8,XX) PASTE(0,XX,Y,BUFF) ENDPROC --------------------------------------- Die Restaurierung des Screens geschieht entsprechend mit dem Put-Befehl. Wie auch beim OPENW müssen hier die X- Koordinaten umgerechnet werden. Da Put und Get für Graphics 8 ausgelegt sind, müssen die Werte mit 8 malgenommen werden. Ansonsten werden nur x Bit gespeichert, wir benötigen aber x Byte. Aufruf: .CLOSEW(1,2,$A800) Für CLOSEW sind nur die Koordinaten der linken oberen Ecke nötig, da der Rest bei Put gespeichert wurde. Die dritte Zahl ist die Puffer- adresse. --------------------------------------- PROC INVERT IN BYTE (+ X,Y,L )+ LOCAL WORD (+ AD,MISC )+ BEGIN DATA($0600) (+ $85,$CD,$A0,$00,$B1,$CB,$49,$80 $91,$CB,$C8,$C4,$CD,$D0,$F5,$60 )+ DPEEK(88,AD) MUL(40,Y,MISC) ADD(AD,MISC,AD) ADD(AD,X,AD) DPOKE(203,AD) CALL(L,0,0,$0600) ENDPROC --------------------------------------- Das ist die Quick-Version des Invert- Befehls. Die Data-Zeilen müssen vor dem Aufruf stehen! Wie die Turbo-Basic Version ist diese für Seite 6 ausgelegt. Aufruf: .INVERT(1,2,10) Die ersten beiden Zahlen sind die Koordinaten, die dritte gibt die Länge des Balkens an. Als Beispiel gibt's in Turbo-Basic ein kleines Quiz. Das Spiel wird mit dem Feuerknopf gestartet. Dann erscheint eine Statistik, die auf Knopfdruck verschwindet. Der Computer wählt ein Themengebiet aus und stellt eine entsprechende Frage. Mit dem Balken wird die Antwort ausgesucht (Joystick rauf oder runter) und dann mit Knopfdruck bestätigt. Erscheint vor der Antwort ein Plus (+), war sie richtig, bei Minus (-) falsch. Mit Feuerknopf (ja, schon wieder) gehts weiter. Leider war es nicht möglich, eine größere Anzahl Fragen einzubauen. Daraus ergeben sich automatisch Wiederholungen (leider). Nach zehn Fragen ist das Spiel beendet. Quick-User können die Library in eigene Programme einbauen. Das Verwalten der einzelnen Windows (Reihenfolge beim öffnen und schließen, Speicherplatz) muß aber das Hauptprogramm übernehmen. Das Interessanteste ist, daß niemand früher auf die Idee kam, Fenster zu programmieren. Erst durch die 16-Bit Rechner wurden sie populär. Dabei ist es nicht besonders schwer, so etwas auf 8-Bittern zu machen (XL: S.A.M., C64: Geos ...). Deshalb: Wenn ihr irgendwo eine interessante Sache seht, überlegt euch, ob es sich nicht lohnt, die auf dem XL zu programmieren. Es geht vielleicht leichter als ihr denkt! Bis nächsten Monat!