home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
M.u.C.S. Disc 2000
/
MUCS2000.iso
/
anwend
/
fontshow
/
fontshow.lst
< prev
next >
Wrap
File List
|
1995-04-30
|
16KB
|
588 lines
'
@prg_init
@prg_defvar
@prg_defconst
@prg_rsc
@prg_main
@prg_exit
'
EDIT
'
'
' Liste der Procedures
'
> PROCEDURE font_get(fg_dev&,fg_ptr%)
SWAP *fg_ptr%,fg_ptr$()
LOCAL i&,a&,a$,fg_count&
V~H=fg_dev&
fg_count&=VST_LOAD_FONTS(0)+1
'
IF fg_count&=0
~FORM_ALERT(1,"[1][Es stehen keine|Zeichensätze zur Verfügung|für dieses Gerät!][Abbruch]")
ELSE
FOR i&=1 TO fg_count&
a&=@vqt_name(fg_dev&,i&,a$)
fg_ptr$(i&-1)=STR$(a&,5)+" "+LEFT$(a$,16)
NEXT i&
ENDIF
'
SWAP *fg_ptr%,fg_ptr$()
RETURN
> PROCEDURE font_size(d&,ptr%)
LOCAL a&,b&,c&,dummy&
SWAP *ptr%,ptr$()
a&=32767
CLR c&
CLR b&
DO
b&=@vst_point(d&,a&,dummy&,dummy&,dummy&,dummy&) ! Fontgrö₧e
ptr$(c&)=STR$(b&,5) ! Wir zählen von oben nach unten,
EXIT IF b&>a& ! da wir immer die nächst kleinere
INC c& ! Grö₧e zurückgeliefert bekommen!!!
a&=b&
DEC a&
LOOP UNTIL c&=255
'
QSORT ptr$(),c&
FOR a&=c& TO PRED(DIM?(ptr$()))
ptr$(a&)=""
NEXT a&
'
SWAP *ptr%,ptr$()
RETURN
'
> PROCEDURE prg_defconst
'
' Für FORM_DIAL()
'
fo_dbeg&=0
fo_dgrw&=1
fo_dshr&=2
fo_dend&=3
'
LET tree1%=0 !RSC_TREE!
LET tree2%=1 !RSC_TREE!
LET tree3%=2 !RSC_TREE!
LET tree4%=3 !RSC_TREE!
LET t1_chrbx&=2 !Obj in #0
LET t1_exit&=3 !Obj in #0
LET t1_sty_a&=7 !Obj in #0
LET t1_sty_f&=12 !Obj in #0
LET t1_styl0&=14 !Obj in #0
LET t1_styl5&=19 !Obj in #0
LET t1_nameb&=23 !Obj in #0
LET t1_names&=24 !Obj in #0
LET t1_namet&=25 !Obj in #0
LET t1_sizeb&=26 !Obj in #0
LET t1_sizes&=27 !Obj in #0
LET t1_sizet&=28 !Obj in #0
LET t1_charb&=30 !Obj in #0
LET t1_chart&=31 !Obj in #0
LET t1_chars&=32 !Obj in #0
LET t1_about&=34 !Obj in #0
LET t2_txtbx&=1 !Obj in #1
RETURN
> PROCEDURE prg_defvar
prg_path$=CHR$(GEMDOS(25)+65)+":"+DIR$(0)+"\"
rsc_name$=prg_path$+"FONTSHOW.RSC"
DIM font_name$(255),font_size$(255),extend&(7),font_char$(256)
'
draw!=TRUE
font_size&=10
font_style&=0
pos_font&=0
pos_size&=0
'
FOR i&=0 TO 222
font_char$(i&)=CHR$(i&+1)+" "+CHR$(i&+33)
NEXT i&
RETURN
> PROCEDURE prg_exit
~VST_UNLOAD_FONTS(0)
~RSRC_FREE()
RESERVE
RETURN
> PROCEDURE prg_init
IF GDOS?=FALSE
~FORM_ALERT(1,"[3][FONTSHOW |benötigt|GDOS!][ABBRUCH]")
EDIT
ENDIF
RESERVE 40960
handle_s&=V~H
RETURN
> PROCEDURE prg_main
LOCAL pos&,back&,x&,y&,a&
'
~FORM_DIAL(fo_dbeg&,0,0,0,0,t1_x&,t1_y&,t1_w&,t1_h&)
~FORM_DIAL(fo_dgrw&,0,0,0,0,t1_x&,t1_y&,t1_w&,t1_h&)
~OBJC_DRAW(tree4%,0,5,t4_x&,t4_y&,t4_w&,t4_h&)
@font_get(handle_s&,*font_name$())
font_name$=font_name$(0)
pos_char&=65
font_char$="Endlich GDOS!"
'
~OBJC_DRAW(tree1%,0,5,t1_x&,t1_y&,t1_w&,t1_h&)
~GRAF_MOUSE(0,0)
'
DO
'
IF draw!
@redraw(handle_s&)
@font_size(handle_s&,*font_size$())
draw!=FALSE
ENDIF
'
back&=WORD(FORM_DO(tree1%,0))
SELECT back&
CASE t1_exit&
prg_exit!=TRUE
'
CASE t1_names&
' Wenn man will, da₧ das Popupmenue immer bei Position 0 beginnt,
' mu₧ man für pos_font& immer 0 übergeben!!
@popup(tree2%,*font_name$(),pos_font&,font_name$,pos_font&)
draw!=TRUE
pos_size&=0 ! Mu₧ zurückgesetzt werden, da Listenlänge anders sein kann
'
CASE t1_sizes&
~OBJC_OFFSET(tree1%,t1_sizeb&,x&,y&)
OB_X(tree3%,0)=x&+OB_W(tree1%,t1_sizeb&)-OB_W(tree3%,0)
OB_Y(tree3%,0)=y&+OB_H(tree1%,t1_sizeb&)+1
'
' Wenn man will, da₧ das Popupmenue immer bei Position 0 beginnt,
' mu₧ man für pos_size& immer 0 übergeben!!
@popup(tree3%,*font_size$(),pos_size&,font_size$,pos_size&)
draw!=TRUE
'
CASE t1_chars&
~OBJC_OFFSET(tree1%,t1_charb&,x&,y&)
OB_X(tree3%,0)=x&+OB_W(tree1%,t1_charb&)-OB_W(tree3%,0)
OB_Y(tree3%,0)=y&+OB_H(tree1%,t1_charb&)+1
'
@popup(tree3%,*font_char$(),pos_char&,font_char$,pos_char&)
draw!=TRUE
'
CASE t1_styl0& TO t1_styl5&
CLR font_style&
OB_STATE(tree1%,back&-t1_styl0&+t1_sty_a&)=BCHG(OB_STATE(tree1%,back&-t1_styl0&+t1_sty_a&),1)
~OBJC_DRAW(tree1%,back&-t1_styl0&+t1_sty_a&,0,0,0,0,0)
FOR a&=0 TO t1_sty_f&-t1_sty_a&
IF BTST(OB_STATE(tree1%,a&+t1_sty_a&),1)=TRUE
font_style&=BSET(font_style&,a&)
ENDIF
NEXT a&
draw!=TRUE
'
~EVNT_BUTTON(1,1,0)
'
CASE t1_sizet&,t1_chart&
OB_FLAGS(tree1%,t1_exit&)=BCLR(OB_FLAGS(tree1%,t1_exit&),1)
OB_FLAGS(tree1%,back&)=OB_FLAGS(tree1%,back&) XOR &X110
~FORM_DO(tree1%,back&)
OB_STATE(tree1%,back&)=0
IF back&=t1_sizet&
font_size$=CHAR{{OB_SPEC(tree1%,back&)}}
ELSE
font_char$=CHAR{{OB_SPEC(tree1%,back&)}}
ENDIF
OB_FLAGS(tree1%,back&)=OB_FLAGS(tree1%,back&) XOR &X110
OB_FLAGS(tree1%,t1_exit&)=BSET(OB_FLAGS(tree1%,t1_exit&),1)
draw!=TRUE
'
CASE t1_about&
GET t4_x&,t4_y&,t4_x&+t4_w&,t4_y&+t4_h&,get$
~OBJC_DRAW(tree4%,0,5,t4_x&,t4_y&,t4_w&,t4_h&)
~FORM_DO(tree4%,0)
PUT t4_x&,t4_y&,get$
'
ENDSELECT
'
LOOP UNTIL prg_exit!=TRUE
~FORM_DIAL(fo_dshr&,0,0,0,0,t1_x&,t1_y&,t1_w&,t1_h&)
~FORM_DIAL(fo_dend&,0,0,0,0,t1_x&,t1_y&,t1_w&,t1_h&)
RETURN
> PROCEDURE prg_rsc
LOCAL x&,y&
IF RSRC_LOAD(rsc_name$)=0
~FORM_ALERT(1,"[3][Konnte |"+RIGHT$(rsc_name$,30)+"|nicht finden!][ABBRUCH]")
RESERVE
EDIT
ENDIF
'
~RSRC_GADDR(0,tree1%,tree1%)
~RSRC_GADDR(0,tree2%,tree2%)
~RSRC_GADDR(0,tree3%,tree3%)
~RSRC_GADDR(0,tree4%,tree4%)
'
~FORM_CENTER(tree1%,t1_x&,t1_y&,t1_w&,t1_h&)
SUB t1_x&,2 ! Ist notwendig, da Mutterobjekt schattiert ist!!
SUB t1_y&,2
ADD t1_w&,4
ADD t1_h&,4
'
~FORM_CENTER(tree4%,t4_x&,t4_y&,t4_w&,t4_h&)
SUB t4_x&,2 ! Ist notwendig, da Mutterobjekt schattiert ist!!
SUB t4_y&,2
ADD t4_w&,4
ADD t4_h&,4
'
~OBJC_OFFSET(tree1%,t1_nameb&,x&,y&)
OB_X(tree2%,0)=x&
OB_Y(tree2%,0)=y&+OB_H(tree1%,t1_nameb&)+1
'
RETURN
'
PROCEDURE popup(pp_tree%,pp_field%,pp_posin&,VAR pp_string$,pp_posout&)
'
' Adresse des Objektbaums pp_tree%
' Objekt, mit dem nach oben gescrollt werden soll pp_up&
' Objekt, mit dem nach unten gescrollt werden soll pp_dn&
' Slider-Objekt pp_ib&
' Mutterobjekt der Textobjekte pp_txtbx&
' Erstes Textobjekt des Scroll-Menues pp_txt0&
' Letztes Textobjekt des Scroll-Menues pp_txt9&
' Zeiger auf Stringfeld, das angezeigt werden soll pp_field%
' Anzahl der tatsächlichen Einträge pp_count&
' Maximale Anzahl der Einträge pp_max&
' Elter-Objekt, das alle Texcteinträge enthält pp_txtbx&
' Elter-Objekt, das die Slider & Pfeile enthält pp_scrbx&
' Textinhalt des String-Objektes, das ausgewählt wurde pp_string$
' Anzahl der Texteinträge pp_txt&
'
'
LOCAL a$,a&,b&,c&,d&,pp_tx&,pp_ty&,pp_tw&,pp_th&,exit!,back&
LOCAL pp_a&,pp_pos&,pp_sel!,pp_up&,pp_dn&,pp_txt0&,pp_txt9&
LOCAL pp_scrbx&,pp_txtbx&,pp_count&,pp_max&,pp_txt&,pp_ib&,pp_ob&
'
'
pp_txtbx&=OB_HEAD(pp_tree%,0) ! Textbox im Objektbaum ermitteln
pp_scrbx&=OB_TAIL(pp_tree%,0) ! Scrollbox -""-
pp_up&=OB_HEAD(pp_tree%,pp_scrbx&) ! Erstes Textobjekt
pp_ob&=pp_up&+1
pp_ib&=OB_HEAD(pp_tree%,pp_ob&)
pp_dn&=OB_TAIL(pp_tree%,pp_scrbx&) ! Letztes Textobjekt
pp_txt0&=OB_HEAD(pp_tree%,pp_txtbx&) ! Pfeil hoch
pp_txt9&=OB_TAIL(pp_tree%,pp_txtbx&) ! Pfeil runter
pp_txt&=pp_txt9&-pp_txt0&+1
'
SWAP *pp_field%,pp_field$() ! Feld zuweisen
pp_max&=DIM?(pp_field$())
'
DO UNTIL pp_field$(pp_count&)=""
INC pp_count&
LOOP WHILE pp_count&<pp_max&
'
a&=MAX(pp_count&,pp_txt&)
a&=OB_H(pp_tree%,pp_ob&)*(pp_txt&)/a&
a&=MAX(OB_W(pp_tree%,pp_ib&),a&)
OB_H(pp_tree%,pp_ib&)=a&
'
pp_tx&=OB_X(pp_tree%,0) ! Ausma₧e ermitteln...
pp_ty&=OB_Y(pp_tree%,0)
pp_tw&=OB_W(pp_tree%,0)
pp_th&=OB_H(pp_tree%,0)
'
SUB pp_tx&,2 ! Ist notwendig, da Mutterobjekt schattiert ist!!
SUB pp_ty&,2 ! dto.
ADD pp_tw&,6 ! dto.
ADD pp_th&,6 ! dto.
'
pp_pos&=pp_posin&
'
FOR a&=0 TO MIN(pp_txt&-1,pp_count&-1) ! Wir weisen Strings zu
OB_FLAGS(pp_tree%,a&+pp_txt0&)=BSET(OB_FLAGS(pp_tree%,a&+pp_txt0&),6) !Touchexit
CHAR{OB_SPEC(pp_tree%,a&+pp_txt0&)}=pp_field$(a&+pp_pos&)
NEXT a&
'
IF pp_count&<=pp_txt&
'
FOR a&=pp_count& TO pp_txt&-1
OB_FLAGS(pp_tree%,a&+pp_txt0&)=BCLR(OB_FLAGS(pp_tree%,a&+pp_txt0&),6)
CHAR{OB_SPEC(pp_tree%,a&+pp_txt0&)}="" ! Da wo nix ist, wird auch nix
NEXT a& ! reingeschrieben
'
ENDIF
'
GET pp_tx&,pp_ty&,pp_tx&+pp_tw&,pp_ty&+pp_th&,a$ ! Wir merken uns den Hintergrund!
pp_sel!=TRUE
'
~OBJC_DRAW(pp_tree%,0,0,pp_tx&,pp_ty&,pp_tw&,pp_th&)
~OBJC_DRAW(pp_tree%,pp_up&,0,0,0,0,0)
~OBJC_DRAW(pp_tree%,pp_dn&,0,0,0,0,0)
DO
'
IF pp_sel!=TRUE ! Wenn neu gezeichnet werden soll...
'
IF pp_pos&=0
OB_FLAGS(pp_tree%,pp_up&)=BCLR(OB_FLAGS(pp_tree%,pp_up&),6)
ELSE
OB_FLAGS(pp_tree%,pp_up&)=BSET(OB_FLAGS(pp_tree%,pp_up&),6)
ENDIF
'
IF pp_pos&=pp_count&-pp_txt& OR pp_count&<pp_txt&
OB_FLAGS(pp_tree%,pp_dn&)=BCLR(OB_FLAGS(pp_tree%,pp_dn&),6)
ELSE
OB_FLAGS(pp_tree%,pp_dn&)=BSET(OB_FLAGS(pp_tree%,pp_dn&),6)
ENDIF
'
IF pp_count&>pp_txt& ! Ist notwendig, da sonst
' ! Division durch Null stattfinden
' ! könnte!
OB_Y(pp_tree%,pp_ib&)=(OB_H(pp_tree%,pp_ob&)-OB_H(pp_tree%,pp_ib&))*pp_pos&/(pp_count&-pp_txt&)
ELSE
OB_Y(pp_tree%,pp_ib&)=0
ENDIF
'
FOR a&=pp_txt0& TO pp_txt9&
CHAR{OB_SPEC(pp_tree%,a&)}=pp_field$(pp_pos&+a&-pp_txt0&)
NEXT a&
~OBJC_DRAW(pp_tree%,pp_txtbx&,1,0,0,0,0)
~OBJC_DRAW(pp_tree%,pp_ob&,1,0,0,0,0)
pp_sel!=FALSE
'
ENDIF
'
back&=BYTE(FORM_DO(pp_tree%,0))
'
SELECT back&
CASE pp_up& ! Einen Eintrag zurückblättern
pp_sel!=TRUE ! Befehl zum Neuzeichnen
DEC pp_pos&
'
CASE pp_dn& ! Einen Eintrag vorblättern
pp_sel!=TRUE ! Befehl zum Neuzeichnen
INC pp_pos&
'
CASE pp_ib&
'
IF pp_count&>pp_txt& ! Relativ Positionieren...
a&=GRAF_SLIDEBOX(pp_tree%,pp_ob&,pp_ib&,1) ! Slidebox aktivieren
a&=a&/1000*(pp_count&-pp_txt&) ! und auswerten
IF NOT a&=pp_pos&
pp_sel!=TRUE
pp_pos&=a&
ENDIF
ENDIF
'
CASE pp_txt0& TO pp_txt9&
exit!=TRUE ! Wenn angewählt, nix wie raus aus dem Dialog
pp_string$=CHAR{OB_SPEC(pp_tree%,back&)}
'
CASE pp_ob&
~OBJC_OFFSET(pp_tree%,pp_ib&,a&,b&)
~OBJC_OFFSET(pp_tree%,pp_ob&,c&,d&)
w&=OB_W(pp_tree%,pp_ob&)
h&=OB_H(pp_tree%,pp_ob&)
~EVNT_BUTTON(0,0,0,x&,y&,k&,s&)
IF y&<b&
IF pp_pos&>pp_txt&+1
SUB pp_pos&,pp_txt&-1
ELSE
pp_pos&=0
ENDIF
ELSE
IF pp_pos&>pp_count&-2*pp_txt&
pp_pos&=pp_count&-pp_txt&
ELSE
ADD pp_pos&,pp_txt&-1
ENDIF
ENDIF
pp_sel!=TRUE
'
ENDSELECT
'
LOOP UNTIL exit!=TRUE ! Wollen wir den Dialog beenden?
PUT pp_tx&,pp_ty&,a$ ! Bildschirm wieder hinzeichnen
SWAP *pp_field%,pp_field$() ! Feld mit Feldzeiger wieder zurücktauschen
' ! darf nicht vergessen werden
pp_posout&=pp_pos& ! Neue Position übergeben
RETURN
'
> PROCEDURE redraw(r_handle&)
LOCAL width&,height&,x&,y&,tx&,ty&,tw&,th&
'
font_id&=VAL(LEFT$(font_name$,5))
~@vst_font(r_handle&,font_id&)
font_size&=MIN(VAL(font_size$),32767) ! Wir haben nur Wortgrö₧e!!!!
font_size&=@vst_point(r_handle&,font_size&,dummy&,dummy&,dummy&,dummy&) ! Fontgrö₧e
~@vst_rotation(r_handle&,0) ! Fontlage
~@vst_effects(r_handle&,font_style&) ! Fontstil
@vqt_extend(r_handle&,font_char$,*extend&()) ! Zeichenma₧e
width&=MAX(extend&(2),extend&(4))-MIN(extend&(6),extend&(0)) ! Zeichenbreite
height&=MAX(extend&(3),extend&(5))-MIN(extend&(7),extend&(1)) ! Zeichenhoehe
'
~OBJC_OFFSET(tree1%,t1_chrbx&,x&,y&)
w&=OB_W(tree1%,t1_chrbx&)
h&=OB_H(tree1%,t1_chrbx&)
~OBJC_DRAW(tree1%,t1_chrbx&,0,0,0,0,0)
'
CHAR{{OB_SPEC(tree1%,t1_namet&)}}=font_name$ ! Fontname
CHAR{{OB_SPEC(tree1%,t1_sizet&)}}=STR$(font_size&,5)
CHAR{{OB_SPEC(tree1%,t1_chart&)}}=font_char$
~OBJC_DRAW(tree1%,t1_namet&,0,0,0,0,0)
~OBJC_DRAW(tree1%,t1_sizet&,0,0,0,0,0)
~OBJC_DRAW(tree1%,t1_chart&,0,0,0,0,0)
'
@vst_alignment(r_handle&,1,3,dummy&,dummy&)
~@vswr_mode(r_handle&,0)
'
'
CLIP x&+4,y&+4,w&-8,h&-8
'
ADD x&,(OB_W(tree1%,t1_chrbx&)/2)
ADD y&,(OB_H(tree1%,t1_chrbx&)/2)
ADD y&,(height&/2)
'
@v_justified(r_handle&,x&,y&,font_char$,width&,0,0)
'
RETURN
'
'
' ====== VDI-Prozeduren & -Funktionen ======================================
'
> PROCEDURE v_justified(handle&,x&,y&,string$,length&,word_space&,char_space&)
LOCAL n&,string%,i&
'
INTIN(0)=word_space&
INTIN(1)=char_space&
'
n&=LEN(string$)
string%=V:string$
'
FOR i&=0 TO n&
INTIN(i&+2)=BYTE{string%+i&}
NEXT i&
'
CONTRL(1)=2
CONTRL(2)=0
CONTRL(3)=n&+2
CONTRL(4)=0
CONTRL(5)=10
CONTRL(6)=handle&
'
PTSIN(0)=x&
PTSIN(1)=y&
PTSIN(2)=length&
PTSIN(3)=0
'
VDISYS 11
RETURN
'
FUNCTION vswr_mode(handle&,mode&) ! SET WRITING MODE
INTIN(0)=mode& ! 0=Replace, 1=Transparent, 3=XOR, 4=reverse Transparent
CONTRL(1)=0
CONTRL(2)=0
CONTRL(3)=1
CONTRL(6)=handle&
VDISYS 32
RETURN INTOUT(0)
ENDFUNC
'
FUNCTION vst_point(handle&,point&,VAR char_width&,char_height&,cell_width&,cell_height&)
PTSIN(0)=0
PTSIN(1)=point&
CONTRL(1)=0
CONTRL(2)=2
CONTRL(3)=1
CONTRL(4)=1
CONTRL(6)=handle&
'
INTIN(0)=point&
'
VDISYS 107
'
char_width&=PTSOUT(0)
char_height&=PTSOUT(1)
cell_width&=PTSOUT(2)
cell_height&=PTSOUT(3)
RETURN INTOUT(0)
ENDFUNC
'
FUNCTION vst_effects(handle&,effect&)
INTIN(0)=effect&
CONTRL(1)=0
CONTRL(3)=1
CONTRL(6)=handle&
VDISYS 106
RETURN INTOUT(0)
ENDFUNC
'
FUNCTION vst_font(handle&,font&)
INTIN(0)=font&
CONTRL(1)=0
CONTRL(3)=1
CONTRL(6)=handle&
VDISYS 21
RETURN INTOUT(0)
ENDFUNC
'
FUNCTION vst_rotation(handle&,angle&)
INTIN(0)=angle&
CONTRL(1)=0
CONTRL(3)=1
CONTRL(6)=handle&
VDISYS 13
RETURN INTOUT(0)
ENDFUNC
'
> PROCEDURE vst_alignment(handle&,hor_in&,vert_in&,VAR hor_out&,vert_out&)
INTIN(0)=hor_in&
INTIN(1)=vert_in&
CONTRL(1)=0
CONTRL(2)=0
CONTRL(3)=2
CONTRL(4)=2
CONTRL(6)=handle&
VDISYS 39
hor_out&=INTOUT(0)
vert_out&=INTOUT(1)
RETURN
> PROCEDURE vqt_extend(handle&,string$,extend%)
LOCAL a&,string%,n&
n&=LEN(string$)
string%=V:string$
SWAP *extend%,a&()
'
CONTRL(1)=0
CONTRL(2)=4
CONTRL(3)=LEN(string$)
CONTRL(4)=0
CONTRL(6)=handle&
'
'
FOR i&=0 TO n&
INTIN(i&+2)=BYTE{string%+i&}
NEXT i&
'
VDISYS 116
'
FOR a&=0 TO 7
a&(a&)=PTSOUT(a&)
NEXT a&
SWAP *extend%,a&()
'
RETURN
'
FUNCTION vqt_name(handle&,element_num&,VAR n.ame$)
LOCAL i&
'
INTIN(0)=element_num&
CONTRL(1)=0
CONTRL(3)=1
CONTRL(6)=handle&
VDISYS 130
'
n.ame$=""
i&=1
DO UNTIL INTOUT(i&)=0
n.ame$=n.ame$+CHR$(INTOUT(i&))
INC i&
LOOP
RETURN INTOUT(0)
ENDFUNC
'
> PROCEDURE prog
CHDRIVE "f:"
CHDIR "\prog\gfa\fontshow"
RETURN