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 >
Text File  |  1993-08-11  |  10KB  |  195 lines

  1.  
  2.  
  3.  
  4. ÿÿÿÿÿÿÿÿÿÿ Programmieren des WIMP ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  5.  
  6.  
  7. Teil 4.
  8.  
  9. Nachdem wir nun in der letzten Folge schon ein Icon auf die Iconbar gebracht
  10. haben, ohne allerdings irgendetwas damit anfangen zu k÷nnen, wollen wir uns in
  11. dieser Folge darum kⁿmmern, was geschehen soll, wenn der Benutzer ⁿber unserem
  12. Icon den mittleren Mausknopf drⁿckt (Menu), also von unserem Programm ein
  13. Menu sehen m÷chte.
  14.  
  15. Die ganze Menudarstellung macht der WIMP fⁿr uns, wenn wir es ihm mittels
  16. eines
  17.  
  18.    SYS "Wimp_CreateMenu"
  19.  
  20. befehlen. Wir mⁿssen allerdings dafⁿr sorgen, da▀ der WIMP auch Menupunkte
  21. vorfindet, die er darstellen kann. Au▀erdem mⁿssen wir ihm sagen, wo er dieses
  22. Menu auf den Bildschirm bringen soll und wie gro▀ es sein soll.
  23.  
  24. Um ersteinmal den Mausclick zu behandeln, schreiben wir in Zeile 1000:
  25.  
  26.    WHEN 6 : PROCmouse_was_clicked
  27.  
  28. denn der eventcode% 6 wird ausgel÷st, wenn ein Mausclick ⁿber irgendeinem
  29. unserem Programm zugeh÷rigen Bildschirmteil ausgel÷st wird - also das Iconbar-
  30. Icon, das Info-Window (zu dem wir noch kommen).
  31.  Die Prozedur dann also in Zeile 4000:
  32.  
  33.   4000  DEFPROCmouse_was_clicked
  34.   4010   xcoord%=!pollblock%
  35.   4020   button%=pollblock%!8
  36.   4030   window_handle%=pollblock%!12
  37.   4040   icon_handle%=pollblock%!16
  38.   4050   IF window_handle%=-2 AND icon_handle%=iconhandle% THEN
  39.   4060    CASE (button% AND 3) OF
  40.   4070     WHEN 2 : REM  der mittlere Mausbutton wurde gedrⁿckt
  41.   4080      xpos% = xcoord%-64
  42.   4090      ypos% = 96+2*44
  43.   4100      SYS "Wimp_CreateMenu",,menublock%,xpos%,ypos%
  44.   4800    ENDCASE
  45.   4810   ENDIF
  46.   4820  ENDPROC
  47.  
  48. Hier werden zuerst aus dem Pollblock wieder die vom WIMP ⁿbertragenen Daten
  49. herausgeholt, nΣmlich: an welcher x-Position der Mausknopf gedrⁿckt wurde,
  50. welcher Knopf gedrⁿckt wurde, ⁿber welchem Window und ⁿber welchem Icon.
  51.  All diese Daten stehen wieder als 32bit-Words im pollblock%, von wo wir sie
  52. bestimmten Variablen zuweisen. xcoord% enthΣlt dann also die x-Koordinate in
  53. OS-Units und steht als erstes im pollblock%. Diesen Wert brauchen wir, weil
  54. wir natⁿrlich das Menu auch dort auf den Bildschirm bringen m÷chten, wo der
  55. Mauszeiger gerade ist. Die y-Position befindet sich als zweiter Wert im
  56. pollblock%, doch brauchen wir sie nicht, weil das Menu immer unten direkt an
  57. der Iconbar abgebildet wird, und diese Koordinate steht fest.
  58.  Danach kommt ein Wert, der angibt welcher Mausknopf gedrⁿckt worden ist. Hier
  59. sind Kombinationen m÷glich, aber es gilt da▀ 1=Adjust, 2=Menu, 4=Select ist.
  60. Ein gleichzeitiges Drⁿcken von Select und Adjust wⁿrde also zu einer 5 fⁿhren.
  61.  HΣtten wir jetzt ein Window auf dem Bildschirm, so wⁿ▀ten wir auch, wenn der
  62. Mausclick auf diesem Window stattfand, und zwar stⁿnde dann das entsprechende
  63. Window-Handle an der nΣchsten Stelle. Aber auch die Iconbar gilt als Window,
  64. und sie hat das Window-Handle -2 (rechte HΣlfte der Iconbar, mit den
  65. Applikationen) bzw. -1 (linke HΣlfte der Iconbar, mit den Filing Systems und
  66. Devices). Unser Icon steht rechts (haben wir angegeben, in Folge 2 beim
  67. Darstellen des Iconbar-Icons), und so ist das Window-Handle -2.
  68.  Das Icon-Handle, was danach kommt ist dementsprechend das Icon-Handle des
  69. Icons, ⁿber dem der Mausknopf gedrⁿckt wurde. Fⁿr unser Iconbar-Icon kennen
  70. wir das Icon-Handle, es wurde uns vom WIMP ⁿbermittelt, als wir das Icon auf
  71. der Iconbar installiert haben. Wir hatten es in der Variablen iconhandle%
  72. abgelegt.
  73.  Und so k÷nnen wir also festlegen, da▀ ein Menu nur dann auf dem
  74. Bildschirm erscheinen soll, wenn der Benutzer mit dem mittleren Mausknopf
  75. ⁿber dem Icon auf der Iconbar einmal ╗clickt½. Da▀ einmal geclickt wurde,
  76. liegt ja nun schon fest, sonst wⁿrde gar nicht diese Prozedur aufgerufen
  77. werden, doch haben wir jetzt noch die Bedingung mit dem Icon, die wir mit der
  78. IF-Anweisung in Zeile 4050 testen.
  79.  
  80.  Dann wird der Mausknopf geprⁿft (zur Sicherheit klammern wir alle nicht
  81. ben÷tigten Bits aus), und wenn eine 2 herauskommt, dann wurde 'Menu' gedrⁿckt,
  82. und wir k÷nnen das Menu darstellen.
  83. Hierfⁿr gibt es den Befehl SYS "Wimp_CreateMenu", der ein paar Parameter
  84. verlangt: in der Hauptsache den Zeiger auf einen speziellen Menu-Daten-Block,
  85. wo die eigentlichen MenueintrΣge stehen, doch au▀erdem noch die x- und y-
  86. Position, wo das Menu entstehen soll.
  87.  Die x-Position haben wir uns gemerkt, sie steht jetzt in xcoord%, damit jetzt
  88. das Menu nicht komplett rechts vom Mauszeiger erscheint, verschieben wir den
  89. linken Rand des Menus etwas nach links vom Mauszeiger. 64 ist da der Standard-
  90. Wert. Die y-Position steht fest, blo▀ wird die obere Kantenposition verlangt,
  91. und die variiert je nachdem, wieviele MenueintrΣge wir haben. Wir wollen uns
  92. auf die zwei Minimal-EintrΣge 'Info' und 'Quit' beschrΣnken. Jeder Menueintrag
  93. ist Acorn-konform 44 OS-Units hoch (obwohl hier jeder beliebige Wert genommen
  94. werden kann), und so ergibt sich die obere Kantenposition aus
  95.  
  96.     (y-Position, wo die untere Kante sein soll)
  97.   + (Anzahl der MenueintrΣge) * (H÷he der MenueintrΣge)
  98.  
  99. oder in Zahlen:
  100.  
  101.     96 + 2*44
  102.  
  103. wobei die Zahl 2 je nach Anzahl der MenueintrΣge noch wachsen kann.
  104. Im menublock% stehen nun die Menudaten, denen wir uns jetzt zuwenden wollen:
  105.  
  106. Der menublock% besteht aus 28 Bytes fⁿr die Grunddefinition, und 24 Bytes
  107. fⁿr jeden Menueintrag. Unser Menu mit 2 EintrΣgen hat also einen Umfang von
  108. 76 Bytes, genauer gesagt, 19 Words, denn die werden in erster Linie verwendet.
  109. Man kann nun diese Words in DATA-Zeilen ablegen und sie in den menublock%
  110. hineinschreiben; ich finde es allerdings einfacher, fⁿr kurze Zeit den
  111. eingebauten Assembler zu bemⁿhen: hierzu setzen wir die Variable P% auf den
  112. Anfang des menublock% und geben dann die Werte mit EQUD-Anweisungen ein,
  113. wobei der Assembler sich automatisch um die konsekutive Reihenfolge der Words
  114. kⁿmmert. Unsere Menudefinitionen schreiben wir also in Zeile 210, gleich nach
  115. dem Installieren des Iconbar-Icons:
  116.  
  117.  210  P% = menublock%
  118.  220  [ OPT 2
  119.  230   EQUS "Program"+STRING$(5,CHR$0):EQUD &00070207:EQUD 100:EQUD 44:EQUD 0
  120.  
  121.  240   EQUD &00:EQUD -1:EQUD &07008001:EQUS "Info"+STRING$(8,CHR$0)
  122.  250   EQUD &80:EQUD -1:EQUD &07008001:EQUS "Quit"+STRING$(8,CHR$0)
  123.  260  ]
  124.  
  125. womit die Definition geschrieben ist. Wir mⁿssen jetzt natⁿrlich noch den
  126. menublock% reservieren, in Zeile 200:
  127.  
  128.  DIM pollblock% 256,menublock% 76
  129.  
  130. Zu den Zeilen: in Zeile 220 startet der Assembler. OPT 2 sagt ihm, wie er
  131. die folgenden Zeilen zu behandeln hat. Andere Werte als 2 sind aber in diesem
  132. Fall nicht sinnvoll. Die 2 bedeutet ihm, da▀ er alles einmal durchassembliert,
  133. nicht zweimal, er prⁿft auch nicht, ob der menublock% gro▀ genug ist und gar
  134. nichts. Es soll uns aber so reichen. Dann kommen die 28 Bytes Grunddefinition:
  135.  Zuerst der String, der in der Title Bar erscheinen soll. Sinnigerweise ver-
  136. wendet man hier den Namen des Programms, hier also 'Program'. Fⁿr den Titel
  137. sind ohne weitere UmstΣnde 12 Bytes vorgesehen, mehr ist nicht m÷glich. Will
  138. man weniger, so mu▀ man die restlichen Bytes auffⁿllen. Eigentlich reicht ein
  139. einziges Nullbyte als Endkennung des Strings, doch lΣ▀t sich mit dem
  140. STRING$(x,x$) sehr gut der Rest auffⁿllen.
  141.  Das nΣchste Word bestimmt die Farben des Menus; hier werden 4 Bytes ⁿber-
  142. geben, und zwar in der Reihenfolge wie sie oben stehen:
  143.  
  144.  Die Farbe des Menu-Feldes, wo die EintrΣge stehen -- 0 (wei▀)
  145.  Die Farbe, in der die MenueintrΣge dort stehen ----- 7 (schwarz)
  146.  Die Hintergrundfarbe der Title-Bar ----------------- 2 (grau)
  147.  Die Farbe des Rahmens und des Textes der Title-Bar - 7 (schwarz)
  148.  
  149. Als nΣchstes kommt die Breite des Menus in OS-Units. hier kommt es natⁿrlich
  150. auf die Breite des lΣngsten Menueintrages an. 100 reicht fⁿr die 7 Buchstaben,
  151. die in der Title-Bar stehen. Der nΣchste Wert, 44, ist die schon besprochene
  152. H÷he der einzelnen Menu-EintrΣge. Die dann folgende 0 besagt, da▀ zwischen
  153. den einzelnen Menu-EintrΣgen *kein* Zwischenraum gesetzt werden soll. Man kann
  154. hier die OS-Units angeben, die zwischen den einzelnen EintrΣgen freigelassen
  155. werden sollen. Zu bedenken ist dann aber die verΣnderte Gesamth÷he des Menus,
  156. die dann beim Darstellen des Menus berⁿcksichtigt werden mu▀!
  157.  Nun folgen die Daten der einzelnen MenueintrΣge: Man kann das ganze sehr
  158. ⁿbersichtlich halten, wenn man jedem Menueintrag eine eigene Zeile spendiert,
  159. wie es in unserem Beispiel zu sehen ist. Das erste Word enthΣlt Flags, so
  160. kann zum Beispiel links vom Menueintrag ein Haken gesetzt werden, oder unter
  161. dem Eintrag eine Linie gesetzt werden. Eine andere M÷glichkeit tritt beim
  162. zweiten, unserem letzten, Eintrag in Kraft: Bit 7 mu▀ auf 1 stehen, wenn
  163. dieser Eintrag der letzte Eintrag ist!
  164.  Das nΣchste Word ist vorgesehen, um ein Window-Handle oder ein Untermenu-
  165. Pointer dort hinzuschreiben; steht dort z.B. ein Window-Handle%, so stellt der
  166. WIMP automatisch rechts vom Menueintrag einen Pfeil (ë) dar, und wenn man
  167. auf diesen mit dem Mauszeiger fΣhrt, so ÷ffnet sich automatisch das entspre-
  168. chende Window. Diese M÷glichkeit wollen wir spΣter fⁿr das 'About this
  169. Program'-Window benutzen, doch brauchen wir dafⁿr Window-Definitionen, die uns
  170. noch fehlen, und so lassen wir eine -1 dort drin. Dann folgen einige
  171. Icon-Definitionen (4 Bytes in obiger Reihenfolge):
  172.  
  173.  Textfarbe        -- 7 (schwarz)
  174.  Hintergrundfarbe -- 0 (wei▀)
  175.  16 Bits Flags, die z.B. regeln, da▀ der Text linksbⁿndig erscheint
  176.  
  177. Danach kommt der eigentliche Text des Menueintrags, wieder 12 Bytes, und
  178. wieder mu▀ der Rest aufgefⁿllt werden.
  179.  
  180. Dasselbe jetzt mit allen anderen EintrΣgen, und dann wird mit ] der Assembler-
  181. Durchgang beendet.
  182.  
  183. Jetzt das so erweiterte BASIC-Programm abgespeichert und gestartet, und schon
  184. haben wir auf Mausclick ein Menu, in dem wir sogar schon den schwarzen
  185. Balken herumschieben k÷nnen. Ebenso k÷nnen wir das Menu an der Titlebar
  186. fassen und ⁿber den ganzen Desktop schieben. All das regelt der WIMP auto-
  187. matisch.
  188.  
  189. In der nΣchsten Folge wollen wir uns an die Window-Definition wagen, und ein
  190. Info-Window erstellen, was dann auf den Bildschirm zu bringen ist.
  191.  
  192.  
  193.                                                              - Martin Willers -
  194.  
  195.