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
Wrap
GFA-BASIC Atari
|
1993-09-19
|
8KB
|
255 lines
'
' W_VDI109.GFA REDRAW mit COPY RASTER (VDI-Funktion 109)
' Auswahl mit EVNT-MULTI
'
' Rumpfprogramm zur Fensterverwaltung (ohne LINE-A)
'
RESERVE FRE(0)
'
xres&=WORK_OUT(0)+1 ! X-Auflösung
yres&=WORK_OUT(1)+1 ! Y-Auflösung
'
CONTRL(0)=102 ! Nr. der VDI-Funktion
INTIN(0)=1 ! 1=erweitete Auskunft
VDISYS ! VDI-Aufruf
bit_pl&=INTOUT(4) ! Anzahl der Bit-Ebenen
'
w_ram%=xres&*yres&*bit_pl&/8 ! RAM-Speicherplatz für 1 Fenster
logbase%=XBIOS(3) ! Adresse des Arbeitsbildschirmes
sizeflag!=FALSE ! Fenstergröße geändert?
fullflag!=FALSE ! Fenstergröße maximal?
DIM s_mfdb&(6),d_mfdb&(6) ! Memory Form Description Block
' ! (Felder für COPY RASTER-Funktion)
REPEAT
PRINT AT(2,3);"wieviele Fenster wollen Sie öffnen (maximal 7) ";
INPUT w_anzahl&
PRINT AT(2,3);" "
UNTIL w_anzahl&<=7 ! maximale Fensteranzahl
'
DIM w_adr%(12) ! Adressen der Fenster
'
DIM message_buffer%(3) ! 16 Byte
mes_adr%=V:message_buffer%(0)
'
ABSOLUTE word0&,mes_adr%
ABSOLUTE handle&,mes_adr%+6
ABSOLUTE x&,mes_adr%+8
ABSOLUTE y&,mes_adr%+10
ABSOLUTE b&,mes_adr%+12
ABSOLUTE h&,mes_adr%+14
'
DEFFILL 1,2,4 ! Hintergrund-Muster wie Desktop,
PBOX 0,19,xres&,yres& ! das erspart das Neuzeichnen des
DEFFILL 1,0 ! Hintergrundes
'
GOSUB beispiel_fenster(45,35,120,80) ! Beispiel-Fenster anlegen
'
DO
~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%)
IF word0&>10
GOSUB window_manager
word0&=0
ENDIF
LOOP
'
> PROCEDURE window_manager
'
SELECT word0&
'
CASE 20 ! WINDOW REDRAW
~WIND_UPDATE(1) ! Bildschirmaufbau beginnt
'
~WIND_GET(handle&,4,ax&,ay&,ab&,ah&) ! Arbeitsbereich holen
~WIND_GET(handle&,11,rx&,ry&,rb&,rh&) ! 1. Eintrag in Rechteckliste
IF fullflag!=FALSE ! restaurieren, wenn
GOSUB w_restaurieren(handle&,rx&,ry&,rb&-1,rh&-1) ! Fenster nicht maximal
ENDIF
'
WHILE rb&>0 AND rh&>0 ! wenn ein Rechteck da ist
IF sizeflag!=TRUE
~WIND_GET(win&,4,x&,y&,b&,h&) ! Arbeitsbereich holen
GOSUB fuellmuster(x&,y&,b&,h&)
sizeflag!=FALSE
ELSE
~RC_INTERSECT(ax&,ay&,ab&,ah&,rx&,ry&,rb&,rh&) ! Überlappung prüfen
GOSUB w_restaurieren(handle&,rx&,ry&,rb&-1,rh&-1)
ENDIF
~WIND_GET(handle&,12,rx&,ry&,rb&,rh&) ! Nächstes Listen-Rechteck
WEND
'
~WIND_UPDATE(0) ! Bildschirmaufbau beendet
'
CASE 21 ! WINDOW TOP
~WIND_GET(w_top&,4,ax&,ay&,ab&,ah&) ! Arbeitsfläche holen
GOSUB rette_fenster(w_top&,ax&,ay&,ab&,ah&) ! Fenster retten
~WIND_SET(handle&,10,0,0,0,0) ! neues Top-Handle holen
w_top&=handle&
'
CASE 22 ! WINDOW CLOSED
~WIND_CLOSE(handle&) ! Fenster schließen
~WIND_DELETE(handle&) ! Fenster löschen
~MFREE(w_adr%(handle&)) ! res. Speicher freigeben
RESERVE +w_ram% ! Speicher an Basic
'
~WIND_GET(0,10,handle&,ay&,ab&,ah&) ! neues Fenster-Handle holen
w_top&=handle&
'
CASE 23 ! WINDOW FULL
win&=handle&
'
IF fullflag!=FALSE ! Fenstergröße nicht max.
~WIND_GET(handle&,4,x&,y&,b&,h&) ! Arbeitsfläche holen
GOSUB rette_fenster(handle&,x&,y&,b&,h&) ! Fenster retten
~WIND_SET(handle&,5,0,19,xres&,yres&-19) ! max. Fenstergröße
fullflag!=TRUE
sizeflag!=TRUE
ELSE
~WIND_GET(handle&,6,ax&,ay&,ab&,ah&) ! vorherige Fenstergröße
~WIND_SET(handle&,5,ax&,ay&,ab&,ah&) ! Fenster setzen
~WIND_GET(win&,4,ax&,ay&,ab&,ah&) ! Arbeitsfläche holen
GOSUB w_restaurieren(win&,ax&,ay&,ab&,ah&) ! Fenster nicht maximal
fullflag!=FALSE
sizeflag!=FALSE
ENDIF
'
CASE 27 ! WINDOW SIZED
win&=handle&
sizeflag!=TRUE
fullflag!=FALSE
b&=MIN(xres&-x&-2,b&)
h&=MIN(yres&-y&-2,h&)
~WIND_SET(handle&,5,x&,y&,MAX(55,b&),MAX(55,h&))
~WIND_GET(handle&,4,x&,y&,b&,h&) ! Arbeitsbereich holen
GOSUB fuellmuster(x&,y&,b&,h&)
'
CASE 28 ! WINDOW MOVED
IF fullflag!=FALSE
sizeflag!=FALSE
x&=MIN(xres&-b&-2,x&)
y&=MIN(yres&-h&-2,y&)
~WIND_SET(handle&,5,x&,y&,b&,h&) ! neues Fenster setzen
ENDIF
'
ENDSELECT
RETURN
'
> PROCEDURE beispiel_fenster(x&,y&,b&,h&)
'
freier_ram%=FRE(0) ! Größter freier Speicherblock im RAM
'
IF freier_ram%>=w_ram&*w_anzahl& ! RAM-Speicher groß genug?
RESERVE -w_ram%*w_anzahl& ! Speicher von BASIC entnehmen
w_adr%=MALLOC(w_ram%*w_anzahl&) ! Speicher für Fenster belegen
FOR i&=1 TO w_anzahl&
w_adr%(i&)=w_adr% ! Speicher für Fenster belegen
w_title$=" Titel "+STR$(i&)+" "
w_info$=" Info "+STR$(i&)+" "
w_top&=i& ! Fenster oben
'
GOSUB init_window(x&,y&,b&,h&,w_title$,w_info$) ! Fenster anlegen
x&=x&+50 ! neue Fensterwerte
y&=y&+40
b&=b&+40
h&=h&+15
w_adr%=w_adr%+w_ram%
NEXT i&
ELSE
ALERT 1,"|Kein Fenster mehr, der |Speicher reicht nicht.",1," ok ",antwort&
ENDIF
RETURN
'
'
> PROCEDURE init_window(x&,y&,b&,h&,w_titel$,w_info$)
~WIND_UPDATE(1) ! Bildschirmaufbau beginnt
handle&=WIND_CREATE(&X111111,0,19,xres&,yres&-19)
w_titel$=w_titel$+CHR$(0)
adr_tit%=V:w_titel$
w_info$=w_info$+CHR$(0)
adr_inf%=V:w_info$
'
~WIND_SET(handle&,2,CARD(SWAP(adr_tit%)),CARD(adr_tit%),0,0) ! Titelzeile
~WIND_SET(handle&,3,CARD(SWAP(adr_inf%)),CARD(adr_inf%),0,0) ! Infozeile
x&=MIN(x&,xres&-40)
y&=MIN(y&,yres&-40)
b&=MIN(b&,xres&-2-x&)
h&=MIN(h&,yres&-2-y&)
~WIND_OPEN(handle&,x&,y&,b&,h&)
'
~WIND_GET(handle&,4,x&,y&,b&,h&) ! Fenster-Arbeitsfläche ermitteln
DEFFILL 1,2,RAND(25) ! zufälliges Füllmuster
PBOX x&,y&,x&+b&,y&+h& ! Arbeitsfläche mit Muster füllen
'
GOSUB rette_fenster(handle&,x&,y&,b&,h&)
'
~WIND_UPDATE(0) ! Fenster ist fertig
RETURN
'
> PROCEDURE fuellmuster(x&,y&,b&,h&)
DEFFILL 1,2,RAND(25) ! zufälliges Füllmuster
PBOX x&,y&,x&+b&,y&+h& ! Arbeitsfläche mit Muster füllen
RETURN
'
'
PROCEDURE rette_fenster(hdl&,x&,y&,b&,h&)
GOSUB src_mfdb(logbase%,xres&,yres&,bit_pl&) ! MFDB-Feld Quelle
GOSUB des_mfdb(w_adr%(hdl&),xres&,yres&,bit_pl&) ! MFDB-Feld Ziel
GOSUB par_mfdb(x&,y&,b&,h&,x&,y&) ! Parameter-Feld
'
INTIN(0)=3 ! Rasterverknüpfung (Ziel=Quelle)
CONTRL(0)=109 ! Nr. der VDI-Funktion
CONTRL(1)=4 ! Einträge in ptsin
CONTRL(3)=1 ! Einträge in intin
CONTRL(6)=GRAF_HANDLE() ! Kennung der VDI-Workstation
CONTRL(7)=CARD(SWAP(V:s_mfdb&(0))) ! Zeiger auf MFDB des Quellrasters
CONTRL(8)=CARD(V:s_mfdb&(0)) ! Zeiger auf MFDB des Quellrasters
CONTRL(9)=CARD(SWAP(V:d_mfdb&(0))) ! Zeiger auf MFDB des Zielrasters
CONTRL(10)=CARD(V:d_mfdb&(0)) ! Zeiger auf MFDB des Zielrasters
VDISYS ! VDI-Aufruf
RETURN
'
PROCEDURE w_restaurieren(handle&,x&,y&,b&,h&)
GOSUB src_mfdb(w_adr%(handle&),xres&,yres&,bit_pl&) ! Source -Feld
GOSUB des_mfdb(logbase%,xres&,yres&,bit_pl&) ! Destination -Feld
GOSUB par_mfdb(x&,y&,b&,h&,x&,y&) ! Parameter -Feld
'
INTIN(0)=3 ! Rasterverküpfung (Ziel=Quelle)
CONTRL(0)=109 ! Nr. der VDI-Funktion
CONTRL(1)=4 ! Einträge in ptsin
CONTRL(3)=1 ! Einträge in intin
CONTRL(6)=GRAF_HANDLE() ! Kennung der VDI-Workstation
CONTRL(7)=CARD(SWAP(V:s_mfdb&(0))) ! Zeiger auf MFDB des Quellrasters
CONTRL(8)=CARD(V:s_mfdb&(0)) ! Zeiger auf MFDB des Quellrasters
CONTRL(9)=CARD(SWAP(V:d_mfdb&(0))) ! Zeiger auf MFDB des Zielrasters
CONTRL(10)=CARD(V:d_mfdb&(0)) ! Zeiger auf MFDB des Zielrasters
VDISYS ! VDI-Aufruf
RETURN
'
PROCEDURE src_mfdb(s_adr%,x&,y&,bit_pl&)
LPOKE V:s_mfdb&(0),s_adr% ! Longword-Zeiger auf Quellraster
s_mfdb&(2)=x& ! max. Breite des Rasters (durch 16 teilbar)
s_mfdb&(3)=y& ! max. Höhe des Rasters
s_mfdb&(4)=x&/16 ! Rasterbreite in Worten (=Pixel/16)
s_mfdb&(5)=0 ! reserviert, immer 0
s_mfdb&(6)=bit_pl& ! Bitplanes (Anzahl der Rasterebenen)
RETURN
'
PROCEDURE des_mfdb(d_adr%,x&,y&,bit_pl&)
LPOKE V:d_mfdb&(0),d_adr% ! Longword-Zeiger auf Zielraster
d_mfdb&(2)=x& ! max. Breite des Rasters (durch 16 teilbar)
d_mfdb&(3)=y& ! max. Hoehe des Rasters
d_mfdb&(4)=x&/16 ! Rasterbreite in Worten (=Pixel/16)
d_mfdb&(5)=0 ! reserviert, immer 0
d_mfdb&(6)=bit_pl& ! Bitplanes (Anzahl der Rasterebenen)
RETURN
'
PROCEDURE par_mfdb(sx&,sy&,sb&,sh&,dx&,dy&)
PTSIN(0)=sx& ! linke X-Koordinate Quellraster
PTSIN(1)=sy& ! linke Y-Koordinate Quellraster
PTSIN(2)=sx&+sb& ! rechte X-Koordinate Quellraster
PTSIN(3)=sy&+sh& ! rechte Y-Koordinate Quellraster
PTSIN(4)=dx& ! linke X-Koordinate Zielraster
PTSIN(5)=dy& ! linke Y-Koordinate Zielraster
PTSIN(6)=dx&+sb& ! rechte X-Koordinate Zielraster
PTSIN(7)=dy&+sh& ! rechte Y-Koordinate Zielraster
RETURN