home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.uni-stuttgart.de/pub/systems/acorn/
/
Acorn.tar
/
Acorn
/
acornet
/
fun
/
mags
/
hl-04-93.arc
/
!HL-04_93_Text_WIMP-Kurs
< prev
next >
Wrap
Text File
|
1993-08-11
|
10KB
|
195 lines
ÿÿÿÿÿÿÿÿÿÿ Programmieren des WIMP ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Teil 4.
Nachdem wir nun in der letzten Folge schon ein Icon auf die Iconbar gebracht
haben, ohne allerdings irgendetwas damit anfangen zu k÷nnen, wollen wir uns in
dieser Folge darum kⁿmmern, was geschehen soll, wenn der Benutzer ⁿber unserem
Icon den mittleren Mausknopf drⁿckt (Menu), also von unserem Programm ein
Menu sehen m÷chte.
Die ganze Menudarstellung macht der WIMP fⁿr uns, wenn wir es ihm mittels
eines
SYS "Wimp_CreateMenu"
befehlen. Wir mⁿssen allerdings dafⁿr sorgen, da▀ der WIMP auch Menupunkte
vorfindet, die er darstellen kann. Au▀erdem mⁿssen wir ihm sagen, wo er dieses
Menu auf den Bildschirm bringen soll und wie gro▀ es sein soll.
Um ersteinmal den Mausclick zu behandeln, schreiben wir in Zeile 1000:
WHEN 6 : PROCmouse_was_clicked
denn der eventcode% 6 wird ausgel÷st, wenn ein Mausclick ⁿber irgendeinem
unserem Programm zugeh÷rigen Bildschirmteil ausgel÷st wird - also das Iconbar-
Icon, das Info-Window (zu dem wir noch kommen).
Die Prozedur dann also in Zeile 4000:
4000 DEFPROCmouse_was_clicked
4010 xcoord%=!pollblock%
4020 button%=pollblock%!8
4030 window_handle%=pollblock%!12
4040 icon_handle%=pollblock%!16
4050 IF window_handle%=-2 AND icon_handle%=iconhandle% THEN
4060 CASE (button% AND 3) OF
4070 WHEN 2 : REM der mittlere Mausbutton wurde gedrⁿckt
4080 xpos% = xcoord%-64
4090 ypos% = 96+2*44
4100 SYS "Wimp_CreateMenu",,menublock%,xpos%,ypos%
4800 ENDCASE
4810 ENDIF
4820 ENDPROC
Hier werden zuerst aus dem Pollblock wieder die vom WIMP ⁿbertragenen Daten
herausgeholt, nΣmlich: an welcher x-Position der Mausknopf gedrⁿckt wurde,
welcher Knopf gedrⁿckt wurde, ⁿber welchem Window und ⁿber welchem Icon.
All diese Daten stehen wieder als 32bit-Words im pollblock%, von wo wir sie
bestimmten Variablen zuweisen. xcoord% enthΣlt dann also die x-Koordinate in
OS-Units und steht als erstes im pollblock%. Diesen Wert brauchen wir, weil
wir natⁿrlich das Menu auch dort auf den Bildschirm bringen m÷chten, wo der
Mauszeiger gerade ist. Die y-Position befindet sich als zweiter Wert im
pollblock%, doch brauchen wir sie nicht, weil das Menu immer unten direkt an
der Iconbar abgebildet wird, und diese Koordinate steht fest.
Danach kommt ein Wert, der angibt welcher Mausknopf gedrⁿckt worden ist. Hier
sind Kombinationen m÷glich, aber es gilt da▀ 1=Adjust, 2=Menu, 4=Select ist.
Ein gleichzeitiges Drⁿcken von Select und Adjust wⁿrde also zu einer 5 fⁿhren.
HΣtten wir jetzt ein Window auf dem Bildschirm, so wⁿ▀ten wir auch, wenn der
Mausclick auf diesem Window stattfand, und zwar stⁿnde dann das entsprechende
Window-Handle an der nΣchsten Stelle. Aber auch die Iconbar gilt als Window,
und sie hat das Window-Handle -2 (rechte HΣlfte der Iconbar, mit den
Applikationen) bzw. -1 (linke HΣlfte der Iconbar, mit den Filing Systems und
Devices). Unser Icon steht rechts (haben wir angegeben, in Folge 2 beim
Darstellen des Iconbar-Icons), und so ist das Window-Handle -2.
Das Icon-Handle, was danach kommt ist dementsprechend das Icon-Handle des
Icons, ⁿber dem der Mausknopf gedrⁿckt wurde. Fⁿr unser Iconbar-Icon kennen
wir das Icon-Handle, es wurde uns vom WIMP ⁿbermittelt, als wir das Icon auf
der Iconbar installiert haben. Wir hatten es in der Variablen iconhandle%
abgelegt.
Und so k÷nnen wir also festlegen, da▀ ein Menu nur dann auf dem
Bildschirm erscheinen soll, wenn der Benutzer mit dem mittleren Mausknopf
ⁿber dem Icon auf der Iconbar einmal ╗clickt½. Da▀ einmal geclickt wurde,
liegt ja nun schon fest, sonst wⁿrde gar nicht diese Prozedur aufgerufen
werden, doch haben wir jetzt noch die Bedingung mit dem Icon, die wir mit der
IF-Anweisung in Zeile 4050 testen.
Dann wird der Mausknopf geprⁿft (zur Sicherheit klammern wir alle nicht
ben÷tigten Bits aus), und wenn eine 2 herauskommt, dann wurde 'Menu' gedrⁿckt,
und wir k÷nnen das Menu darstellen.
Hierfⁿr gibt es den Befehl SYS "Wimp_CreateMenu", der ein paar Parameter
verlangt: in der Hauptsache den Zeiger auf einen speziellen Menu-Daten-Block,
wo die eigentlichen MenueintrΣge stehen, doch au▀erdem noch die x- und y-
Position, wo das Menu entstehen soll.
Die x-Position haben wir uns gemerkt, sie steht jetzt in xcoord%, damit jetzt
das Menu nicht komplett rechts vom Mauszeiger erscheint, verschieben wir den
linken Rand des Menus etwas nach links vom Mauszeiger. 64 ist da der Standard-
Wert. Die y-Position steht fest, blo▀ wird die obere Kantenposition verlangt,
und die variiert je nachdem, wieviele MenueintrΣge wir haben. Wir wollen uns
auf die zwei Minimal-EintrΣge 'Info' und 'Quit' beschrΣnken. Jeder Menueintrag
ist Acorn-konform 44 OS-Units hoch (obwohl hier jeder beliebige Wert genommen
werden kann), und so ergibt sich die obere Kantenposition aus
(y-Position, wo die untere Kante sein soll)
+ (Anzahl der MenueintrΣge) * (H÷he der MenueintrΣge)
oder in Zahlen:
96 + 2*44
wobei die Zahl 2 je nach Anzahl der MenueintrΣge noch wachsen kann.
Im menublock% stehen nun die Menudaten, denen wir uns jetzt zuwenden wollen:
Der menublock% besteht aus 28 Bytes fⁿr die Grunddefinition, und 24 Bytes
fⁿr jeden Menueintrag. Unser Menu mit 2 EintrΣgen hat also einen Umfang von
76 Bytes, genauer gesagt, 19 Words, denn die werden in erster Linie verwendet.
Man kann nun diese Words in DATA-Zeilen ablegen und sie in den menublock%
hineinschreiben; ich finde es allerdings einfacher, fⁿr kurze Zeit den
eingebauten Assembler zu bemⁿhen: hierzu setzen wir die Variable P% auf den
Anfang des menublock% und geben dann die Werte mit EQUD-Anweisungen ein,
wobei der Assembler sich automatisch um die konsekutive Reihenfolge der Words
kⁿmmert. Unsere Menudefinitionen schreiben wir also in Zeile 210, gleich nach
dem Installieren des Iconbar-Icons:
210 P% = menublock%
220 [ OPT 2
230 EQUS "Program"+STRING$(5,CHR$0):EQUD &00070207:EQUD 100:EQUD 44:EQUD 0
240 EQUD &00:EQUD -1:EQUD &07008001:EQUS "Info"+STRING$(8,CHR$0)
250 EQUD &80:EQUD -1:EQUD &07008001:EQUS "Quit"+STRING$(8,CHR$0)
260 ]
womit die Definition geschrieben ist. Wir mⁿssen jetzt natⁿrlich noch den
menublock% reservieren, in Zeile 200:
DIM pollblock% 256,menublock% 76
Zu den Zeilen: in Zeile 220 startet der Assembler. OPT 2 sagt ihm, wie er
die folgenden Zeilen zu behandeln hat. Andere Werte als 2 sind aber in diesem
Fall nicht sinnvoll. Die 2 bedeutet ihm, da▀ er alles einmal durchassembliert,
nicht zweimal, er prⁿft auch nicht, ob der menublock% gro▀ genug ist und gar
nichts. Es soll uns aber so reichen. Dann kommen die 28 Bytes Grunddefinition:
Zuerst der String, der in der Title Bar erscheinen soll. Sinnigerweise ver-
wendet man hier den Namen des Programms, hier also 'Program'. Fⁿr den Titel
sind ohne weitere UmstΣnde 12 Bytes vorgesehen, mehr ist nicht m÷glich. Will
man weniger, so mu▀ man die restlichen Bytes auffⁿllen. Eigentlich reicht ein
einziges Nullbyte als Endkennung des Strings, doch lΣ▀t sich mit dem
STRING$(x,x$) sehr gut der Rest auffⁿllen.
Das nΣchste Word bestimmt die Farben des Menus; hier werden 4 Bytes ⁿber-
geben, und zwar in der Reihenfolge wie sie oben stehen:
Die Farbe des Menu-Feldes, wo die EintrΣge stehen -- 0 (wei▀)
Die Farbe, in der die MenueintrΣge dort stehen ----- 7 (schwarz)
Die Hintergrundfarbe der Title-Bar ----------------- 2 (grau)
Die Farbe des Rahmens und des Textes der Title-Bar - 7 (schwarz)
Als nΣchstes kommt die Breite des Menus in OS-Units. hier kommt es natⁿrlich
auf die Breite des lΣngsten Menueintrages an. 100 reicht fⁿr die 7 Buchstaben,
die in der Title-Bar stehen. Der nΣchste Wert, 44, ist die schon besprochene
H÷he der einzelnen Menu-EintrΣge. Die dann folgende 0 besagt, da▀ zwischen
den einzelnen Menu-EintrΣgen *kein* Zwischenraum gesetzt werden soll. Man kann
hier die OS-Units angeben, die zwischen den einzelnen EintrΣgen freigelassen
werden sollen. Zu bedenken ist dann aber die verΣnderte Gesamth÷he des Menus,
die dann beim Darstellen des Menus berⁿcksichtigt werden mu▀!
Nun folgen die Daten der einzelnen MenueintrΣge: Man kann das ganze sehr
ⁿbersichtlich halten, wenn man jedem Menueintrag eine eigene Zeile spendiert,
wie es in unserem Beispiel zu sehen ist. Das erste Word enthΣlt Flags, so
kann zum Beispiel links vom Menueintrag ein Haken gesetzt werden, oder unter
dem Eintrag eine Linie gesetzt werden. Eine andere M÷glichkeit tritt beim
zweiten, unserem letzten, Eintrag in Kraft: Bit 7 mu▀ auf 1 stehen, wenn
dieser Eintrag der letzte Eintrag ist!
Das nΣchste Word ist vorgesehen, um ein Window-Handle oder ein Untermenu-
Pointer dort hinzuschreiben; steht dort z.B. ein Window-Handle%, so stellt der
WIMP automatisch rechts vom Menueintrag einen Pfeil (ë) dar, und wenn man
auf diesen mit dem Mauszeiger fΣhrt, so ÷ffnet sich automatisch das entspre-
chende Window. Diese M÷glichkeit wollen wir spΣter fⁿr das 'About this
Program'-Window benutzen, doch brauchen wir dafⁿr Window-Definitionen, die uns
noch fehlen, und so lassen wir eine -1 dort drin. Dann folgen einige
Icon-Definitionen (4 Bytes in obiger Reihenfolge):
Textfarbe -- 7 (schwarz)
Hintergrundfarbe -- 0 (wei▀)
16 Bits Flags, die z.B. regeln, da▀ der Text linksbⁿndig erscheint
Danach kommt der eigentliche Text des Menueintrags, wieder 12 Bytes, und
wieder mu▀ der Rest aufgefⁿllt werden.
Dasselbe jetzt mit allen anderen EintrΣgen, und dann wird mit ] der Assembler-
Durchgang beendet.
Jetzt das so erweiterte BASIC-Programm abgespeichert und gestartet, und schon
haben wir auf Mausclick ein Menu, in dem wir sogar schon den schwarzen
Balken herumschieben k÷nnen. Ebenso k÷nnen wir das Menu an der Titlebar
fassen und ⁿber den ganzen Desktop schieben. All das regelt der WIMP auto-
matisch.
In der nΣchsten Folge wollen wir uns an die Window-Definition wagen, und ein
Info-Window erstellen, was dann auf den Bildschirm zu bringen ist.
- Martin Willers -