home *** CD-ROM | disk | FTP | other *** search
/ Falcon 030 Power 2 / F030_POWER2.iso / ST_STE / MAGS / ICTARI10.ARJ / ictari.10 / GFA / GEM_WIND / W_VDI109.GFA (.txt) < prev   
GFA-BASIC Atari  |  1993-09-19  |  8KB  |  255 lines

  1. '
  2. ' W_VDI109.GFA        REDRAW  mit COPY RASTER (VDI-Funktion 109)
  3. '                     Auswahl mit EVNT-MULTI
  4. '
  5. ' Rumpfprogramm zur Fensterverwaltung (ohne LINE-A)
  6. '
  7. RESERVE FRE(0)
  8. '
  9. xres&=WORK_OUT(0)+1                   ! X-Auflösung
  10. yres&=WORK_OUT(1)+1                   ! Y-Auflösung
  11. '
  12. CONTRL(0)=102                         ! Nr. der VDI-Funktion
  13. INTIN(0)=1                            ! 1=erweitete Auskunft
  14. VDISYS                                ! VDI-Aufruf
  15. bit_pl&=INTOUT(4)                     ! Anzahl der Bit-Ebenen
  16. '
  17. w_ram%=xres&*yres&*bit_pl&/8          ! RAM-Speicherplatz für 1 Fenster
  18. logbase%=XBIOS(3)                     ! Adresse des Arbeitsbildschirmes
  19. sizeflag!=FALSE                       ! Fenstergröße geändert?
  20. fullflag!=FALSE                       ! Fenstergröße maximal?
  21. DIM s_mfdb&(6),d_mfdb&(6)             ! Memory Form Description Block
  22. '                                     ! (Felder für COPY RASTER-Funktion)
  23. REPEAT
  24.   PRINT AT(2,3);"wieviele Fenster wollen Sie öffnen (maximal 7) ";
  25.   INPUT w_anzahl&
  26.   PRINT AT(2,3);"                                                 "
  27. UNTIL w_anzahl&<=7                    ! maximale Fensteranzahl
  28. '
  29. DIM w_adr%(12)                        ! Adressen der Fenster
  30. '
  31. DIM message_buffer%(3)                ! 16 Byte
  32. mes_adr%=V:message_buffer%(0)
  33. '
  34. ABSOLUTE word0&,mes_adr%
  35. ABSOLUTE handle&,mes_adr%+6
  36. ABSOLUTE x&,mes_adr%+8
  37. ABSOLUTE y&,mes_adr%+10
  38. ABSOLUTE b&,mes_adr%+12
  39. ABSOLUTE h&,mes_adr%+14
  40. '
  41. DEFFILL 1,2,4                         ! Hintergrund-Muster wie Desktop,
  42. PBOX 0,19,xres&,yres&                 ! das erspart das Neuzeichnen des
  43. DEFFILL 1,0                           ! Hintergrundes
  44. '
  45. GOSUB beispiel_fenster(45,35,120,80)  ! Beispiel-Fenster anlegen
  46. '
  47. DO
  48.   ~EVNT_MULTI(&X110000,0,0,0,0,0,0,0,0,0,0,0,0,0,mes_adr%,100,d%,d%,d%,d%,d%,d%)
  49.   IF word0&>10
  50.     GOSUB window_manager
  51.     word0&=0
  52.   ENDIF
  53. LOOP
  54. '
  55. > PROCEDURE window_manager
  56.   '
  57.   SELECT word0&
  58.     '
  59.   CASE 20                        ! WINDOW REDRAW
  60.     ~WIND_UPDATE(1)                               ! Bildschirmaufbau beginnt
  61.     '
  62.     ~WIND_GET(handle&,4,ax&,ay&,ab&,ah&)          ! Arbeitsbereich holen
  63.     ~WIND_GET(handle&,11,rx&,ry&,rb&,rh&)         ! 1. Eintrag in Rechteckliste
  64.     IF fullflag!=FALSE                                  ! restaurieren, wenn
  65.       GOSUB w_restaurieren(handle&,rx&,ry&,rb&-1,rh&-1) ! Fenster nicht maximal
  66.     ENDIF
  67.     '
  68.     WHILE rb&>0 AND rh&>0                         ! wenn ein Rechteck da ist
  69.       IF sizeflag!=TRUE
  70.         ~WIND_GET(win&,4,x&,y&,b&,h&)             ! Arbeitsbereich holen
  71.         GOSUB fuellmuster(x&,y&,b&,h&)
  72.         sizeflag!=FALSE
  73.       ELSE
  74.         ~RC_INTERSECT(ax&,ay&,ab&,ah&,rx&,ry&,rb&,rh&) ! Überlappung prüfen
  75.         GOSUB w_restaurieren(handle&,rx&,ry&,rb&-1,rh&-1)
  76.       ENDIF
  77.       ~WIND_GET(handle&,12,rx&,ry&,rb&,rh&)       ! Nächstes Listen-Rechteck
  78.     WEND
  79.     '
  80.     ~WIND_UPDATE(0)                               ! Bildschirmaufbau beendet
  81.     '
  82.   CASE 21                        ! WINDOW TOP
  83.     ~WIND_GET(w_top&,4,ax&,ay&,ab&,ah&)           ! Arbeitsfläche holen
  84.     GOSUB rette_fenster(w_top&,ax&,ay&,ab&,ah&)   ! Fenster retten
  85.     ~WIND_SET(handle&,10,0,0,0,0)                 ! neues Top-Handle holen
  86.     w_top&=handle&
  87.     '
  88.   CASE 22                        ! WINDOW CLOSED
  89.     ~WIND_CLOSE(handle&)                          ! Fenster schließen
  90.     ~WIND_DELETE(handle&)                         ! Fenster löschen
  91.     ~MFREE(w_adr%(handle&))                       ! res. Speicher freigeben
  92.     RESERVE +w_ram%                               ! Speicher an Basic
  93.     '
  94.     ~WIND_GET(0,10,handle&,ay&,ab&,ah&)           ! neues Fenster-Handle holen
  95.     w_top&=handle&
  96.     '
  97.   CASE 23                        ! WINDOW FULL
  98.     win&=handle&
  99.     '
  100.     IF fullflag!=FALSE                            ! Fenstergröße nicht max.
  101.       ~WIND_GET(handle&,4,x&,y&,b&,h&)            ! Arbeitsfläche holen
  102.       GOSUB rette_fenster(handle&,x&,y&,b&,h&)    ! Fenster retten
  103.       ~WIND_SET(handle&,5,0,19,xres&,yres&-19)    ! max. Fenstergröße
  104.       fullflag!=TRUE
  105.       sizeflag!=TRUE
  106.     ELSE
  107.       ~WIND_GET(handle&,6,ax&,ay&,ab&,ah&)        ! vorherige Fenstergröße
  108.       ~WIND_SET(handle&,5,ax&,ay&,ab&,ah&)        ! Fenster setzen
  109.       ~WIND_GET(win&,4,ax&,ay&,ab&,ah&)           ! Arbeitsfläche holen
  110.       GOSUB w_restaurieren(win&,ax&,ay&,ab&,ah&)  ! Fenster nicht maximal
  111.       fullflag!=FALSE
  112.       sizeflag!=FALSE
  113.     ENDIF
  114.     '
  115.   CASE 27                        ! WINDOW SIZED
  116.     win&=handle&
  117.     sizeflag!=TRUE
  118.     fullflag!=FALSE
  119.     b&=MIN(xres&-x&-2,b&)
  120.     h&=MIN(yres&-y&-2,h&)
  121.     ~WIND_SET(handle&,5,x&,y&,MAX(55,b&),MAX(55,h&))
  122.     ~WIND_GET(handle&,4,x&,y&,b&,h&)               ! Arbeitsbereich holen
  123.     GOSUB fuellmuster(x&,y&,b&,h&)
  124.     '
  125.   CASE 28                        ! WINDOW MOVED
  126.     IF fullflag!=FALSE
  127.       sizeflag!=FALSE
  128.       x&=MIN(xres&-b&-2,x&)
  129.       y&=MIN(yres&-h&-2,y&)
  130.       ~WIND_SET(handle&,5,x&,y&,b&,h&)               ! neues Fenster setzen
  131.     ENDIF
  132.     '
  133.   ENDSELECT
  134. RETURN
  135. '
  136. > PROCEDURE beispiel_fenster(x&,y&,b&,h&)
  137.   '
  138.   freier_ram%=FRE(0)                     ! Größter freier Speicherblock im RAM
  139.   '
  140.   IF freier_ram%>=w_ram&*w_anzahl&       ! RAM-Speicher groß genug?
  141.     RESERVE -w_ram%*w_anzahl&            ! Speicher von BASIC entnehmen
  142.     w_adr%=MALLOC(w_ram%*w_anzahl&)      ! Speicher für Fenster belegen
  143.     FOR i&=1 TO w_anzahl&
  144.       w_adr%(i&)=w_adr%                  ! Speicher für Fenster belegen
  145.       w_title$=" Titel "+STR$(i&)+" "
  146.       w_info$=" Info "+STR$(i&)+" "
  147.       w_top&=i&                          ! Fenster oben
  148.       '
  149.       GOSUB init_window(x&,y&,b&,h&,w_title$,w_info$)   ! Fenster anlegen
  150.       x&=x&+50                           ! neue Fensterwerte
  151.       y&=y&+40
  152.       b&=b&+40
  153.       h&=h&+15
  154.       w_adr%=w_adr%+w_ram%
  155.     NEXT i&
  156.   ELSE
  157.     ALERT 1,"|Kein Fenster mehr, der |Speicher reicht nicht.",1," ok ",antwort&
  158.   ENDIF
  159. RETURN
  160. '
  161. '
  162. > PROCEDURE init_window(x&,y&,b&,h&,w_titel$,w_info$)
  163.   ~WIND_UPDATE(1)                           ! Bildschirmaufbau beginnt
  164.   handle&=WIND_CREATE(&X111111,0,19,xres&,yres&-19)
  165.   w_titel$=w_titel$+CHR$(0)
  166.   adr_tit%=V:w_titel$
  167.   w_info$=w_info$+CHR$(0)
  168.   adr_inf%=V:w_info$
  169.   '
  170.   ~WIND_SET(handle&,2,CARD(SWAP(adr_tit%)),CARD(adr_tit%),0,0)  ! Titelzeile
  171.   ~WIND_SET(handle&,3,CARD(SWAP(adr_inf%)),CARD(adr_inf%),0,0)  ! Infozeile
  172.   x&=MIN(x&,xres&-40)
  173.   y&=MIN(y&,yres&-40)
  174.   b&=MIN(b&,xres&-2-x&)
  175.   h&=MIN(h&,yres&-2-y&)
  176.   ~WIND_OPEN(handle&,x&,y&,b&,h&)
  177.   '
  178.   ~WIND_GET(handle&,4,x&,y&,b&,h&)          ! Fenster-Arbeitsfläche ermitteln
  179.   DEFFILL 1,2,RAND(25)                      ! zufälliges Füllmuster
  180.   PBOX x&,y&,x&+b&,y&+h&                    ! Arbeitsfläche mit Muster füllen
  181.   '
  182.   GOSUB rette_fenster(handle&,x&,y&,b&,h&)
  183.   '
  184.   ~WIND_UPDATE(0)                           ! Fenster ist fertig
  185. RETURN
  186. '
  187. > PROCEDURE fuellmuster(x&,y&,b&,h&)
  188.   DEFFILL 1,2,RAND(25)                   ! zufälliges Füllmuster
  189.   PBOX x&,y&,x&+b&,y&+h&                 ! Arbeitsfläche mit Muster füllen
  190. RETURN
  191. '
  192. '
  193. PROCEDURE rette_fenster(hdl&,x&,y&,b&,h&)
  194.   GOSUB src_mfdb(logbase%,xres&,yres&,bit_pl&)      ! MFDB-Feld Quelle
  195.   GOSUB des_mfdb(w_adr%(hdl&),xres&,yres&,bit_pl&)  ! MFDB-Feld Ziel
  196.   GOSUB par_mfdb(x&,y&,b&,h&,x&,y&)                 ! Parameter-Feld
  197.   '
  198.   INTIN(0)=3                            ! Rasterverknüpfung (Ziel=Quelle)
  199.   CONTRL(0)=109                         ! Nr. der VDI-Funktion
  200.   CONTRL(1)=4                           ! Einträge in ptsin
  201.   CONTRL(3)=1                           ! Einträge in intin
  202.   CONTRL(6)=GRAF_HANDLE()             ! Kennung der VDI-Workstation
  203.   CONTRL(7)=CARD(SWAP(V:s_mfdb&(0)))  ! Zeiger auf MFDB des Quellrasters
  204.   CONTRL(8)=CARD(V:s_mfdb&(0))        ! Zeiger auf MFDB des Quellrasters
  205.   CONTRL(9)=CARD(SWAP(V:d_mfdb&(0)))  ! Zeiger auf MFDB des Zielrasters
  206.   CONTRL(10)=CARD(V:d_mfdb&(0))       ! Zeiger auf MFDB des Zielrasters
  207.   VDISYS                                ! VDI-Aufruf
  208. RETURN
  209. '
  210. PROCEDURE w_restaurieren(handle&,x&,y&,b&,h&)
  211.   GOSUB src_mfdb(w_adr%(handle&),xres&,yres&,bit_pl&)  ! Source      -Feld
  212.   GOSUB des_mfdb(logbase%,xres&,yres&,bit_pl&)         ! Destination -Feld
  213.   GOSUB par_mfdb(x&,y&,b&,h&,x&,y&)                    ! Parameter   -Feld
  214.   '
  215.   INTIN(0)=3                            ! Rasterverküpfung (Ziel=Quelle)
  216.   CONTRL(0)=109                         ! Nr. der VDI-Funktion
  217.   CONTRL(1)=4                           ! Einträge in ptsin
  218.   CONTRL(3)=1                           ! Einträge in intin
  219.   CONTRL(6)=GRAF_HANDLE()             ! Kennung der VDI-Workstation
  220.   CONTRL(7)=CARD(SWAP(V:s_mfdb&(0)))  ! Zeiger auf MFDB des Quellrasters
  221.   CONTRL(8)=CARD(V:s_mfdb&(0))        ! Zeiger auf MFDB des Quellrasters
  222.   CONTRL(9)=CARD(SWAP(V:d_mfdb&(0)))  ! Zeiger auf MFDB des Zielrasters
  223.   CONTRL(10)=CARD(V:d_mfdb&(0))       ! Zeiger auf MFDB des Zielrasters
  224.   VDISYS                                ! VDI-Aufruf
  225. RETURN
  226. '
  227. PROCEDURE src_mfdb(s_adr%,x&,y&,bit_pl&)
  228.   LPOKE V:s_mfdb&(0),s_adr%           ! Longword-Zeiger auf Quellraster
  229.   s_mfdb&(2)=x&              ! max. Breite  des Rasters  (durch 16 teilbar)
  230.   s_mfdb&(3)=y&              ! max. Höhe    des Rasters
  231.   s_mfdb&(4)=x&/16           ! Rasterbreite in Worten (=Pixel/16)
  232.   s_mfdb&(5)=0               ! reserviert, immer 0
  233.   s_mfdb&(6)=bit_pl&         ! Bitplanes (Anzahl der Rasterebenen)
  234. RETURN
  235. '
  236. PROCEDURE des_mfdb(d_adr%,x&,y&,bit_pl&)
  237.   LPOKE V:d_mfdb&(0),d_adr%           ! Longword-Zeiger auf Zielraster
  238.   d_mfdb&(2)=x&              ! max. Breite  des Rasters (durch 16 teilbar)
  239.   d_mfdb&(3)=y&              ! max. Hoehe   des Rasters
  240.   d_mfdb&(4)=x&/16           ! Rasterbreite in Worten (=Pixel/16)
  241.   d_mfdb&(5)=0               ! reserviert, immer 0
  242.   d_mfdb&(6)=bit_pl&         ! Bitplanes (Anzahl der Rasterebenen)
  243. RETURN
  244. '
  245. PROCEDURE par_mfdb(sx&,sy&,sb&,sh&,dx&,dy&)
  246.   PTSIN(0)=sx&               ! linke X-Koordinate Quellraster
  247.   PTSIN(1)=sy&               ! linke Y-Koordinate Quellraster
  248.   PTSIN(2)=sx&+sb&           ! rechte X-Koordinate Quellraster
  249.   PTSIN(3)=sy&+sh&           ! rechte Y-Koordinate Quellraster
  250.   PTSIN(4)=dx&               ! linke X-Koordinate Zielraster
  251.   PTSIN(5)=dy&               ! linke Y-Koordinate Zielraster
  252.   PTSIN(6)=dx&+sb&           ! rechte X-Koordinate Zielraster
  253.   PTSIN(7)=dy&+sh&           ! rechte Y-Koordinate Zielraster
  254. RETURN
  255.