INSTALL @lib$+"STRINGLIB" REM set global button tracker string array REM response1$ is your response from the buttons. It must remain global for users program. response1$="" DIM BTTNLIST$(50):REM 50 buttons should be enough for any program? REM !!! MAKE SURE IN BBC BASIC OPTIONS TO DISABLE Lower Case Keywords ( OR you will have keyword errors ) REM SET GRAPHICS MODE TO 8 USING VDU VDU 22,8 REM SET LINE THICKNESS TO 3 VDU 23,23,1| REM Turn off the text cursor _ OFF VDU 5 : REM Treat text as graphics (transparent background) REPEAT BTTNLIST$(0)="OK 500 500 ":REM Activate the button first then name the button and make start coordinates (also tells mouse where to look) BTTNLIST$(1)="CANCEL 200 800 ":REM I did it like this because I think a user can just manually switch this on BTTNLIST$(2)="QUIT 200 400 " PROC_monitorbuttons UNTIL response1$="QUIT" WAIT 0 END REM this procedure will display and monitor the buttons you want ( that is pretty cool eh?) DEF PROC_monitorbuttons LOCAL hh%,vv%,exitcondition%,activepwrsave%(),buttonlist%,checkstr$ LOCAL initialwd$,moub%,mouy%,moux%,x,n%,i% DIM activepwrsave%(50) exitcondition%=0 buttonlist%=0 FOR x=0 TO 50 activepwrsave%(x)=1 NEXT REPEAT REM Display the buttons first initialwd$=BTTNLIST$(buttonlist%) n% = FN_split(initialwd$, " ", array$()) FOR i% = n%-1 TO 0 STEP -1 hh%=VAL(array$(1)):vv%=VAL(array$(2)) REM MOUSE b-- 1-rightbttn 2-mid bttn 4-left bttn MOUSE moux%,mouy%,moub% checkstr$=array$(0) IF LEN(checkstr$)>1 AND activepwrsave%(buttonlist%)=0 THEN IF moux%>hh% AND mouy%>vv%-30 AND moux%<hh%+140 AND mouy%<vv%+15 THEN PROC_button(hh%,vv%,0,array$(0)+" ",255,255,255):activepwrsave%(buttonlist%)=1 IF LEN(checkstr$)>1 AND activepwrsave%(buttonlist%)=1 THEN IF moux%<hh% OR mouy%<vv%-30 OR moux%>hh%+140 OR mouy%>vv%+15 THEN PROC_button(hh%,vv%,0,array$(0)+" ",200,200,200):activepwrsave%(buttonlist%)=0 IF LEN(checkstr$)>1 THEN IF moux%>hh% AND mouy%>vv%-30 AND moux%<hh%+140 AND mouy%<vv%+15 AND moub%=4 THEN response1$=array$(0):exitcondition%=1:activepwrsave%(buttonlist%)=0 NEXT buttonlist%=buttonlist%+1:IF LEN(BTTNLIST$(buttonlist%))<1 THEN buttonlist%=0 IF buttonlist%>50 THEN buttonlist%=0 UNTIL exitcondition%=1 PROC_color("b",0,0,0):CLG MOVE 0,500:PROC_color("f",255,255,255) PRINT "YOU CLICKED ON :";response1$ PRINT "H string ";array$(1);" number ";hh% MOVE 0,450 PRINT "V string";array$(2);" number ";vv% ENDPROC REM PUT YOUR PROCEDURES AND FUNCTIONS BELLOW THE MAIN PROGRAM END **************** REM ***********************this is my super custom text box tool *********************** REM X,Y,text color,boarder color,message,r,g,b REM ************************************************************************ DEF PROC_button(x%,y%,c%,msg$,r%,g%,b%) LOCAL initialx%,tx%,reduction%,fxx% initialx%=LEN(msg$) LET tx%= x%+initialx%+25 reduction%=0 COLOUR 0,r%,g%,b% GCOL 0 reduction%=initialx%/2 reduction%=reduction%*6 IF initialx%<20 THEN reduction%=reduction%/2 initialx%=initialx%*22-reduction% FOR fxx%=17 TO 49 LINE x%+3,y%+20-fxx%,x%+initialx%,y%+20-fxx% NEXT fxx% PROC_color("f",0,0,0) MOVE tx%,y% PRINT msg$ GCOL c% MOVE 0,0 REM hide that thing ENDPROC REM ******************this is a custom Foreground and Background control tool (too much?) ***************** REM color "F"or"B", r,g,b DEF PROC_color(fb$,r%,g%,b%) IF fb$="f" OR fb$="F" THEN COLOUR 0,r%,g%,b% : GCOL 0 IF fb$="b" OR fb$="B" THEN COLOUR 1,r%,g%,b% : GCOL 128+1 ENDPROC