'=========================================================================== ' Subject: MULTIFUNCTIONAL MENUING SYSTEM Date: 02-09-98 (23:18) ' Author: Sami Kyostila Code: QB, PDS ' Origin: hiteck@utanet.fi Packet: MENU.ABC '=========================================================================== 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' Q M E N U v1.0 - 1998 Sami Ky”stil„ (hiteck@utanet.fi) 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' ' Here's a pretty good menu system for QB 4.5 ' ' What makes this system different from many other menuing programs out there ' is that this program doesn't use precious memory for storing the menu items ' but a disk swap file. First you might think that is very slow, but see for ' your self, it's way fast enough. Secondly, the items can be added at ' run-time (See SUB Init.Menu). ' ' You can navigate the menu system with the keyboard (Press ALT to activate ' menu bar) or the mouse. This demo functions in text mode, but with a few ' minor adaptions you could make a graphical menu system. All you need to ' do is change the SUBs PokeChar and PeekChar to your own font routines, and ' replace the PCOPY's with some other screen saving system. ' ' To use the menu, be sure to call the SUB Main as often as possible. ' To read the pressed menu item, use the following variables: ' ' + Menuselected.Menu - The number of the selected menu ' + Menuselected.Item - The number of the selected item (Separator lines ' count too!) ' ' To find out info about the pressed menu item, use the SUB Get.MenuItemInfo ' ' ' You may use this code freely, as long as you give me some credit for it. 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ DECLARE SUB Create.MenuItem (Num%, Caption$, Style AS STRING, Selected AS STRING, Active AS STRING) DECLARE SUB Create.Menu (Num%, Caption$) DECLARE SUB Set.MenuTopic (Num%, Topic$) DECLARE SUB Main () DECLARE SUB Set.MenuItem (MenuNum%, Num%, Caption$, Active AS STRING, Style AS STRING, Selected AS STRING) DECLARE FUNCTION Get.MenuItem$ (MenuNum%, Num%) DECLARE SUB Get.MenuItemInfo (MenuNum%, Num%, Style AS STRING, Selected AS STRING, HelpText AS STRING) DECLARE SUB Draw.Menu () DECLARE SUB Init.Menu () DECLARE FUNCTION Exist% (file$) DECLARE SUB MStatus (x%, y%, B1%, B2%) DECLARE SUB UpdateMouse () DECLARE SUB PPrint (x%, y%, Text$, FCol%, BCol%) DECLARE SUB PokeChar (x%, y%, Char$, FCol%, BCol%) DECLARE FUNCTION PeekChar$ (x%, y%) DECLARE SUB Draw.Border (x%, y%, x2%, y2%, FCol%, BCol%) DECLARE FUNCTION Get.MenuTopic$ (Num%) DECLARE FUNCTION PopupMenu% (x%, y%, Num%, Click%) DECLARE SUB MHide () DECLARE SUB MShow () DECLARE FUNCTION MInit! () DEFINT A-Z TYPE RegType ax AS INTEGER bx AS INTEGER cx AS INTEGER dx AS INTEGER bp AS INTEGER si AS INTEGER di AS INTEGER flags AS INTEGER END TYPE TYPE MenuItemType Caption AS STRING * 40 Active AS STRING * 1 Style AS STRING * 1 Selected AS STRING * 1 END TYPE TYPE MenuType Topics AS INTEGER BarSize AS INTEGER MenuFCol AS INTEGER MenuBCol AS INTEGER MenuDisabled AS INTEGER END TYPE TYPE MenuSelectedType Menu AS INTEGER Item AS INTEGER END TYPE DIM SHARED Regs AS RegType CONST False = 0, True = NOT False DIM SHARED MenuItems(1 TO 40) AS INTEGER DIM SHARED MenuItem AS MenuItemType DIM SHARED QMenu AS MenuType DIM SHARED MenuSelected AS MenuSelectedType IF Exist("Menuswap.tmp") = True THEN KILL "menuswap.tmp" IF Exist("Itemswap.tmp") = True THEN KILL "itemswap.tmp" OPEN "Menuswap.tmp" FOR BINARY AS #250 OPEN "Itemswap.tmp" FOR BINARY AS #251 IF NOT MInit THEN PRINT " þ Mouse not found, using keyboard...": DO: LOOP UNTIL INKEY$ <> "" SCREEN 0: WIDTH 80, 50 COLOR 7, 1: CLS Draw.Border 1, 2, 80, 50, 7, 1 COLOR 1, 7 LOCATE 2, 20: PRINT " Welcome to QMENU v1.0 by Sami Ky”stil„! " COLOR 7, 1 LOCATE , 2: PRINT "" LOCATE , 2: PRINT "DECLARE SUB Create.MenuItem (Num%, Caption$, Style AS STRING, Selected AS STRI" LOCATE , 2: PRINT "DECLARE SUB Create.Menu (Num%, Caption$)" LOCATE , 2: PRINT "DECLARE SUB Set.MenuTopic (Num%, Topic$)" LOCATE , 2: PRINT "DECLARE SUB Main ()" LOCATE , 2: PRINT "DECLARE SUB Set.MenuItem (MenuNum%, Num%, Caption$, Active AS STRING, Style AS" LOCATE , 2: PRINT "DECLARE FUNCTION Get.MenuItem$ (MenuNum%, Num%)" LOCATE , 2: PRINT "DECLARE SUB Get.MenuItemInfo (MenuNum%, Num%, Style AS STRING, Selected AS STR" LOCATE , 2: PRINT "DECLARE SUB Draw.Menu ()" LOCATE , 2: PRINT "DECLARE SUB Init.Menu ()" LOCATE , 2: PRINT "DECLARE FUNCTION Exist% (File$)" LOCATE , 2: PRINT "DECLARE SUB MStatus (x%, y%, B1%, B2%)" LOCATE , 2: PRINT "DECLARE SUB UpdateMouse ()" LOCATE , 2: PRINT "DECLARE SUB PPrint (x%, y%, Text$, FCol%, BCol%)" LOCATE , 2: PRINT "DECLARE SUB PokeChar (x%, y%, Char$, FCol%, BCol%)" LOCATE , 2: PRINT "DECLARE FUNCTION PeekChar$ (x%, y%)" LOCATE , 2: PRINT "DECLARE SUB Draw.Border (x%, y%, x2%, y2%, FCol%, BCol%)" LOCATE , 2: PRINT "DECLARE FUNCTION Get.MenuTopic$ (Num%)" LOCATE , 2: PRINT "DECLARE FUNCTION PopupMenu% (x%, y%, Num%, Click%)" LOCATE , 2: PRINT "DECLARE SUB MHide ()" LOCATE , 2: PRINT "DECLARE SUB MShow ()" LOCATE , 2: PRINT "DECLARE FUNCTION MInit! ()" LOCATE , 2: PRINT "DEFINT A-Z" LOCATE , 2: PRINT "" LOCATE , 2: PRINT "TYPE RegType" LOCATE , 2: PRINT " ax AS INTEGER" LOCATE , 2: PRINT " bx AS INTEGER" LOCATE , 2: PRINT " cx AS INTEGER" LOCATE , 2: PRINT " dx AS INTEGER" LOCATE , 2: PRINT " bp AS INTEGER" LOCATE , 2: PRINT " si AS INTEGER" LOCATE , 2: PRINT " di AS INTEGER" LOCATE , 2: PRINT " flags AS INTEGER" LOCATE , 2: PRINT "END TYPE" LOCATE , 2: PRINT "" LOCATE , 2: PRINT "TYPE MenuItemType" LOCATE , 2: PRINT " Caption AS STRING * 40" LOCATE , 2: PRINT " HelpText AS STRING * 80" LOCATE , 2: PRINT " Style AS STRING * 1" LOCATE , 2: PRINT " Selected AS STRING * 1" LOCATE , 2: PRINT "END TYPE" MShow Init.Menu DO Main IF MenuSelected.Menu <> 0 THEN COLOR 14, 1 LOCATE 47, 3: PRINT STRING$(77, " ") LOCATE 47, 3 PRINT "You selected item"; MenuSelected.Item; "("; Get.MenuItem$(MenuSelected.Menu, MenuSelected.Item); ") "; PRINT "from menu"; MenuSelected.Menu; "("; Get.MenuTopic$(MenuSelected.Menu); ")" END IF LOOP UNTIL MenuSelected.Menu = 1 AND MenuSelected.Item = 15 MHide CLOSE #250 CLOSE #251 IF Exist("Menuswap.tmp") = True THEN KILL "menuswap.tmp" IF Exist("Itemswap.tmp") = True THEN KILL "itemswap.tmp" SUB Create.Menu (Num, Caption$) 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' Creates a main menu number Num, with the text Caption$ 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ IF Num >= QMenu.Topics THEN QMenu.Topics = QMenu.Topics + 1 Num = QMenu.Topics END IF Set.MenuTopic Num, Caption$ Draw.Menu END SUB SUB Create.MenuItem (Num, Caption$, Style AS STRING, Selected AS STRING, Active AS STRING) 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' Adds a menuitem into the menu Num with the text Caption$ 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' ' Style - "1" or "0" - If 1, then Item can be toggled on/off ' else it is a normal menu item ' ' Selected - "1" or "0" - If Style = "1", then you can choose whether the ' item is initially selected or not (1/0) ' ' Active - "1" or "0" - Specifies if the menu item is active, or ' grayed out. ' 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Set.MenuItem Num, MenuItems(Num) + 1, Caption$, Active, Style, Selected MenuItems(Num) = MenuItems(Num) + 1 END SUB SUB Draw.Border (x, y, x2, y2, FCol, BCol) 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' Draws the menu border 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ FOR i = x + 1 TO x2 - 1 PokeChar i, y, "Ä", FCol, BCol PokeChar i, y2, "Ä", FCol, BCol NEXT FOR i = y + 1 TO y2 - 1 PokeChar x, i, "³", FCol, BCol PokeChar x2, i, "³", FCol, BCol NEXT PokeChar x, y, "Ú", FCol, BCol PokeChar x2, y, "¿", FCol, BCol PokeChar x, y2, "À", FCol, BCol PokeChar x2, y2, "Ù", FCol, BCol END SUB SUB Draw.Menu 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' Draws the menu bar at the top of the screen 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ MHide IF QMenu.Topics > 0 THEN xx = 1 yy = 1 FOR i = 1 TO QMenu.Topics Menu$ = Get.MenuTopic$(i) IF xx + LEN(Menu$) + 2 < 81 THEN PPrint xx, yy, " " + Menu$ + " ", QMenu.MenuFCol, QMenu.MenuBCol xx = xx + LEN(Menu$) + 2 ELSE PPrint xx, yy, STRING$(80 - xx + 1, " "), QMenu.MenuFCol, QMenu.MenuBCol yy = yy + 1 xx = x PPrint xx, yy, " " + Menu$ + " ", QMenu.MenuFCol, QMenu.MenuBCol xx = xx + LEN(Menu$) + 2 END IF PPrint xx, yy, STRING$(80 - xx + 1, " "), QMenu.MenuFCol, QMenu.MenuBCol NEXT QMenu.BarSize = yy END IF MShow END SUB FUNCTION Exist% (file$) 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' Checks if a file exists 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' ' File$ - File to check ' 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' Returns True if file exists, else False 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ IF file$ = "" THEN Exist = False: EXIT FUNCTION Checkfile = FREEFILE OPEN file$ FOR BINARY AS #Checkfile IF LOF(Checkfile) = 0 THEN Exist = False CLOSE #Checkfile KILL file$ ELSE Exist = True CLOSE #Checkfile END IF END FUNCTION FUNCTION Get.MenuItem$ (MenuNum, Num) 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' Returns the menu item number Num caption in menu number MenuNum 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ SEEK #251, (CLNG(MenuNum - 1) * 6100) + (Num * 122) GET #251, , MenuItem Temp$ = MenuItem.Caption Temp2$ = "" FOR i = 1 TO LEN(Temp$) IF NOT MID$(Temp$, i, 1) = CHR$(0) THEN Temp2$ = Temp2$ + MID$(Temp$, i, 1) ELSE EXIT FOR NEXT Get.MenuItem$ = LTRIM$(RTRIM$(Temp2$)) END FUNCTION SUB Get.MenuItemInfo (MenuNum, Num, Style AS STRING, Selected AS STRING, Active AS STRING) 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' Returns info about item number Num in menu MenuNum ' See SUB Create.MenuItem for info on menu item variables. 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ SEEK #251, (CLNG(MenuNum - 1) * 6100) + (Num * 122) GET #251, , MenuItem Style = MenuItem.Style Selected = MenuItem.Selected Active = MenuItem.Active END SUB FUNCTION Get.MenuTopic$ (Num) 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' Returns the caption of a main menu item number Num 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ SEEK #250, CLNG(Num) * 16 Temp$ = SPACE$(16) GET #250, , Temp$ Temp2$ = "" FOR i = 1 TO LEN(Temp$) IF NOT MID$(Temp$, i, 1) = CHR$(0) THEN Temp2$ = Temp2$ + MID$(Temp$, i, 1) ELSE EXIT FOR NEXT Get.MenuTopic$ = LTRIM$(RTRIM$(Temp2$)) END FUNCTION SUB Init.Menu 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' Call this at the start of your programs, initializes the menu 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ QMenu.MenuFCol = 0 QMenu.MenuBCol = 7 QMenu.MenuDisabled = 8 Create.Menu 1, "File" Create.Menu 2, "Edit" Create.Menu 3, "View" Create.Menu 4, "Search" Create.Menu 5, "Run" Create.Menu 6, "Debug" Create.Menu 7, "Calls" Create.Menu 8, "Options" Create.Menu 9, "Help" 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Create.MenuItem 1, "New Program", "0", "0", "1" Create.MenuItem 1, "Open Program...", "0", "0", "1" Create.MenuItem 1, "Merge...", "0", "0", "1" Create.MenuItem 1, "Save", "0", "0", "1" Create.MenuItem 1, "Save As...", "0", "0", "1" Create.MenuItem 1, "Save All", "0", "0", "1" Create.MenuItem 1, "-", "0", "0", "1" Create.MenuItem 1, "Create File...", "0", "0", "1" Create.MenuItem 1, "Load File...", "0", "0", "1" Create.MenuItem 1, "Unload File...", "0", "0", "1" Create.MenuItem 1, "-", "0", "0", "1" Create.MenuItem 1, "Print", "0", "0", "1" Create.MenuItem 1, "DOS Shell", "0", "0", "1" Create.MenuItem 1, "-", "0", "0", "1" Create.MenuItem 1, "Exit", "0", "0", "1" 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Create.MenuItem 2, "Undo Alt+Backspace", "0", "0", "0" Create.MenuItem 2, "Cut Shift+Del", "0", "0", "0" Create.MenuItem 2, "Copy Ctrl+Inst", "0", "0", "0" Create.MenuItem 2, "Paste Shift+Inst", "0", "0", "0" Create.MenuItem 2, "Clear Del", "0", "0", "0" Create.MenuItem 2, "-", "0", "0", "1" Create.MenuItem 2, "New SUB...", "0", "0", "1" Create.MenuItem 2, "New FUNCTION...", "0", "0", "1" 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Create.MenuItem 3, "SUBS... F2", "0", "0", "1" Create.MenuItem 3, "Next SUB Shift+F2", "0", "0", "1" Create.MenuItem 3, "Split", "0", "0", "1" Create.MenuItem 3, "-", "0", "0", "1" Create.MenuItem 3, "Next Statement", "0", "0", "1" Create.MenuItem 3, "Output Screen F4", "0", "0", "1" Create.MenuItem 3, "-", "0", "0", "1" Create.MenuItem 3, "Included File", "0", "0", "1" Create.MenuItem 3, "Included Lines", "0", "0", "1" 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Create.MenuItem 4, "Find... ", "0", "0", "1" Create.MenuItem 4, "Selected Text Ctrl+\", "0", "0", "1" Create.MenuItem 4, "Repeat Last Find F3", "0", "0", "1" Create.MenuItem 4, "Change...", "0", "0", "1" Create.MenuItem 4, "Label...", "0", "0", "1" 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Create.MenuItem 5, "Start Shift+F5", "0", "0", "1" Create.MenuItem 5, "Restart", "0", "0", "1" Create.MenuItem 5, "Continue F5", "0", "0", "1" Create.MenuItem 5, "Modify COMMAND$...", "0", "0", "1" Create.MenuItem 5, "-", "0", "0", "1" Create.MenuItem 5, "Make EXE File...", "0", "0", "1" Create.MenuItem 5, "Make Library...", "0", "0", "1" Create.MenuItem 5, "-", "0", "0", "1" Create.MenuItem 5, "Set Main Module...", "0", "0", "1" 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Create.MenuItem 6, "Add Watch...", "0", "0", "1" Create.MenuItem 6, "Instant Watch... Shift+F9", "0", "0", "1" Create.MenuItem 6, "Watchpoint...", "0", "0", "1" Create.MenuItem 6, "Delete Watch...", "0", "0", "1" Create.MenuItem 6, "Delete All Watch...", "0", "0", "1" Create.MenuItem 6, "-", "0", "0", "1" Create.MenuItem 6, "Trace On", "1", "0", "1" Create.MenuItem 6, "History On", "1", "0", "1" Create.MenuItem 6, "-", "0", "0", "1" Create.MenuItem 6, "Toggle Breakpoints F9", "0", "0", "1" Create.MenuItem 6, "Clear All Breakpoints", "0", "0", "1" Create.MenuItem 6, "Break On Errors", "1", "0", "1" Create.MenuItem 6, "Set Next Statement", "0", "0", "1" 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Create.MenuItem 7, "QMENU.BAS", "0", "0", "1" 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Create.MenuItem 8, "Display...", "0", "0", "1" Create.MenuItem 8, "Set Paths...", "0", "0", "1" Create.MenuItem 8, "Right Mouse...", "0", "0", "1" Create.MenuItem 8, "Syntax Checking", "1", "1", "1" Create.MenuItem 8, "Full Menus", "1", "1", "1" 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Create.MenuItem 9, "Index", "0", "0", "1" Create.MenuItem 9, "Contents", "0", "0", "1" Create.MenuItem 9, "Topic: QMENU F1", "0", "0", "1" Create.MenuItem 9, "Help On Help Shift+F1", "0", "0", "1" END SUB SUB Main 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' Handles the mouse and menu. ' Call this once per frame. 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ STATIC Click MenuSelected.Menu = 0 MenuSelected.Item = 0 MStatus HiiriX%, HiiriY%, HiiriV%, HiiriO% Mx = HiiriX% \ 8 + 1 My = HiiriY% \ 8 + 1 Ml = HiiriV% Mr = HiiriO% IF Ml = 0 AND Click = -1 THEN Click = 1 ELSE IF Ml = 0 THEN Click = 0 IF Ml = -1 AND Click = 0 THEN Click = -1 DEF SEG = &H40 IF ((PEEK(&H17) AND &H8) / &H8) AND DragWin = 0 THEN Mx = 1 My = 1 Click = 1 END IF DEF SEG IF My <= QMenu.BarSize AND Click = 1 THEN IF QMenu.Topics > 0 THEN xx = 1 yy = 1 FOR i = 1 TO QMenu.Topics Menu$ = Get.MenuTopic$(i) IF xx + LEN(Menu$) + 2 < 81 THEN xx = xx + LEN(Menu$) + 2 ELSE yy = yy + 1 xx = 1 xx = xx + LEN(Menu$) + 2 END IF IF Mx >= xx - LEN(Menu$) - 2 AND Mx < xx AND My = yy THEN NewPopup = i DO MHide PPrint xx - LEN(Menu$) - 2, yy, " " + Menu$ + " ", QMenu.MenuBCol, QMenu.MenuFCol MShow NewPopup = PopupMenu(xx - LEN(Menu$) - 2, yy + 1, NewPopup, Click) MStatus HiiriX%, HiiriY%, HiiriV%, HiiriO% Mx = HiiriX% \ 8 + 1 My = HiiriY% \ 8 + 1 MHide PPrint xx - LEN(Menu$) - 2, yy, " " + Menu$ + " ", QMenu.MenuFCol, QMenu.MenuBCol MShow IF NewPopup <> 0 OR Click = 1 THEN xx = 1 yy = 1 FOR ii = 1 TO QMenu.Topics Menu$ = Get.MenuTopic$(ii) IF xx + LEN(Menu$) + 2 < 81 THEN xx = xx + LEN(Menu$) + 2 ELSE yy = yy + 1 xx = 1 xx = xx + LEN(Menu$) + 2 END IF IF Click = 1 AND Mx >= xx - LEN(Menu$) - 2 AND Mx < xx AND My = yy THEN NewPopup = ii IF ii = NewPopup THEN EXIT FOR NEXT END IF LOOP UNTIL NewPopup = 0 EXIT FOR END IF NEXT END IF END IF END SUB DEFSNG A-Z SUB MHide 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' Hides the mouse 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Regs.ax% = 2 CALL INTERRUPT(&H33, Regs, Regs) END SUB FUNCTION MInit 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' Initializes the mouse ' Returns -1 if mouse is present, 0 if it isn't 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Regs.ax% = 0 CALL INTERRUPT(&H33, Regs, Regs) MInit = Regs.ax% END FUNCTION SUB MShow 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' Shows the mouse after hiding 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Regs.ax% = 1 CALL INTERRUPT(&H33, Regs, Regs) WAIT &H3DA, 8 WAIT &H3DA, 8, 8 END SUB DEFINT A-Z SUB MStatus (x, y, B1, B2) 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' Returns location of mouse & status of buttons 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Regs.ax% = 3 CALL INTERRUPT(&H33, Regs, Regs) x = Regs.cx% y = Regs.dx% B1 = (Regs.bx% AND 1) <> 0 B2 = (Regs.bx% AND 2) <> 0 END SUB FUNCTION PeekChar$ (x, y) 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' Returns the character stored at x,y 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ DEF SEG = &HB800 PeekChar$ = CHR$(PEEK((y - 1) * 160 + (x - 1) * 2)) DEF SEG END FUNCTION SUB PokeChar (x, y, Char$, FCol, BCol) 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' Writes the characted Char$ at x,y in color FCol,BCol 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ DEF SEG = &HB800 POKE ((y - 1) * 160 + (x - 1) * 2), ASC(Char$) POKE ((y - 1) * 160 + (x - 1) * 2) + 1, FCol + (BCol * 16) DEF SEG END SUB FUNCTION PopupMenu (x, y, Num, Click) 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' Handles the menu when popped up, called by SUB Main 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ items = MenuItems(Num) IF items > 0 THEN DIM Menu$(1 TO items) Longest = 0 FOR i = 1 TO items Menu$(i) = Get.MenuItem$(Num, i) IF LEN(Menu$(i)) > Longest THEN Longest = LEN(Menu$(i)) NEXT MHide PCOPY 0, 1 SCREEN , , 0, 1 IF x + Longest > 78 THEN x = 78 - Longest - 3 IF items > 0 THEN Draw.Border x, y, x + Longest + 3, y + items + 1, QMenu.MenuFCol, QMenu.MenuBCol x2 = x + Longest + 3 y2 = y + items + 1 FOR i = y + 1 TO y2 + 1 PokeChar x2 + 1, i, PeekChar$(x2 + 1, i), 8, 0 PokeChar x2 + 2, i, PeekChar$(x2 + 2, i), 8, 0 NEXT FOR i = x + 1 TO x2 PokeChar i, y2 + 1, PeekChar$(i, y2 + 1), 8, 0 NEXT FOR i = 1 TO items Get.MenuItemInfo Num, i, Style$, Selected$, Active$ IF Active$ = "1" THEN IF Menu$(i) = "-" THEN PPrint x, y + i, CHR$(195) + STRING$(Longest + 2, "Ä") + CHR$(180), QMenu.MenuFCol, QMenu.MenuBCol ELSE IF Style$ = "0" THEN PPrint x + 1, y + i, " " + Get.MenuItem$(Num, i) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, i))), QMenu.MenuFCol, QMenu.MenuBCol ELSE IF Selected$ = "1" THEN PPrint x + 1, y + i, CHR$(7) + Get.MenuItem$(Num, i) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, i))), QMenu.MenuFCol, QMenu.MenuBCol ELSE PPrint x + 1, y + i, " " + Get.MenuItem$(Num, i) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, i))), QMenu.MenuFCol, QMenu.MenuBCol END IF END IF END IF ELSE IF Menu$(i) = "-" THEN PPrint x, y + i, CHR$(195) + STRING$(Longest + 2, "Ä") + CHR$(180), QMenu.MenuFCol, QMenu.MenuBCol ELSE IF Style$ = "0" THEN PPrint x + 1, y + i, " " + Get.MenuItem$(Num, i) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, i))), QMenu.MenuDisabled, QMenu.MenuBCol ELSE IF Selected$ = "1" THEN PPrint x + 1, y + i, CHR$(7) + Get.MenuItem$(Num, i) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, i))), QMenu.MenuDisabled, QMenu.MenuBCol ELSE PPrint x + 1, y + i, " " + Get.MenuItem$(Num, i) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, i))), QMenu.MenuDisabled, QMenu.MenuBCol END IF END IF END IF END IF NEXT Selected = 1 Get.MenuItemInfo Num, Selected, Style$, Selected$, Active$ IF Style$ = "0" THEN PPrint x + 1, y + Selected, " " + Get.MenuItem$(Num, Selected) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, Selected))), QMenu.MenuBCol, QMenu.MenuFCol ELSE IF Selected$ = "1" THEN PPrint x + 1, y + Selected, CHR$(7) + Get.MenuItem$(Num, Selected) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, Selected))), QMenu.MenuBCol, QMenu.MenuFCol ELSE PPrint x + 1, y + Selected, " " + Get.MenuItem$(Num, Selected) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, Selected))), QMenu.MenuBCol, QMenu.MenuFCol END IF END IF END IF SCREEN , , 0, 0 MShow OldSelected = 0 MStatus HiiriX%, HiiriY%, HiiriV%, HiiriO% Mx = HiiriX% \ 8 + 1 My = HiiriY% \ 8 + 1 Ml = HiiriV% Mr = HiiriO% OldMx = Mx OldMy = My DO Key$ = INKEY$ MStatus HiiriX%, HiiriY%, HiiriV%, HiiriO% Mx = HiiriX% \ 8 + 1 My = HiiriY% \ 8 + 1 Ml = HiiriV% Mr = HiiriO% IF OldMx <> Mx OR OldMy <> My THEN MouseMove = 1 ELSE MouseMove = 0 IF Ml = 0 AND Click = -1 THEN Click = 1 ELSE IF Ml = 0 THEN Click = 0 IF Ml = -1 AND Click = 0 THEN Click = -1 IF Key$ = CHR$(0) + "K" THEN NewMenu = Num - 1 IF NewMenu < 1 THEN NewMenu = QMenu.Topics PopupMenu = NewMenu END IF IF Key$ = CHR$(0) + "M" THEN NewMenu = Num + 1 IF NewMenu > QMenu.Topics THEN NewMenu = 1 PopupMenu = NewMenu END IF OldSelected = Selected IF items > 0 THEN IF Key$ = CHR$(0) + "P" THEN Selected = Selected + 1 IF Selected > items THEN Selected = 1 IF Menu$(Selected) = "-" THEN Selected = Selected + 1 IF Selected > items THEN Selected = 1 Key$ = "" END IF IF Key$ = CHR$(0) + "H" THEN Selected = Selected - 1 IF Selected < 1 THEN Selected = items IF Menu$(Selected) = "-" THEN Selected = Selected - 1 IF Selected < 1 THEN Selected = items Key$ = "" END IF IF Key$ = CHR$(13) THEN Get.MenuItemInfo Num, Selected, Style$, Selected$, Active$ IF Active$ = "1" THEN MenuSelected.Menu = Num MenuSelected.Item = Selected IF Style$ = "1" THEN IF Selected$ = "0" THEN Selected$ = "1" ELSEIF Selected$ = "1" THEN Selected$ = "0" END IF Set.MenuItem Num, Selected, Get.MenuItem$(Num, Selected), Active$, Style$, Selected$ END IF ELSE Key$ = "" END IF END IF END IF IF items > 0 AND (MouseMove = 1 OR Click = 1) THEN IF Mx > x AND Mx < x + Longest + 3 AND My > y AND My <= y + items THEN Selected = My - y IF Click = 1 THEN Get.MenuItemInfo Num, Selected, Style$, Selected$, Active$ IF Active$ = "1" AND Get.MenuItem$(Num, Selected) <> "-" THEN MenuSelected.Menu = Num MenuSelected.Item = Selected MenuSelected.Menu = Num MenuSelected.Item = Selected IF Style$ = "1" THEN IF Selected$ = "0" THEN Selected$ = "1" ELSEIF Selected$ = "1" THEN Selected$ = "0" END IF Set.MenuItem Num, Selected, Get.MenuItem$(Num, Selected), Active$, Style$, Selected$ END IF EXIT DO ELSE Click = 0 END IF END IF END IF END IF IF OldSelected <> Selected THEN IF Menu$(Selected) = "-" THEN Selected = OldSelected ELSE MHide Get.MenuItemInfo Num, Selected, Style$, Selected$, Active$ IF Style$ = "0" THEN PPrint x + 1, y + Selected, " " + Get.MenuItem$(Num, Selected) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, Selected))), QMenu.MenuBCol, QMenu.MenuFCol ELSE IF Selected$ = "1" THEN PPrint x + 1, y + Selected, CHR$(7) + Get.MenuItem$(Num, Selected) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, Selected))), QMenu.MenuBCol, QMenu.MenuFCol ELSE PPrint x + 1, y + Selected, " " + Get.MenuItem$(Num, Selected) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, Selected))), QMenu.MenuBCol, QMenu.MenuFCol END IF END IF Get.MenuItemInfo Num, OldSelected, Style$, Selected$, Active$ IF Active$ = "1" THEN FCol = QMenu.MenuFCol ELSE FCol = QMenu.MenuDisabled END IF IF Style$ = "0" THEN PPrint x + 1, y + OldSelected, " " + Get.MenuItem$(Num, OldSelected) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, OldSelected))), FCol, QMenu.MenuBCol ELSE IF Selected$ = "1" THEN PPrint x + 1, y + OldSelected, CHR$(7) + Get.MenuItem$(Num, OldSelected) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, OldSelected))), FCol, QMenu.MenuBCol ELSE PPrint x + 1, y + OldSelected, " " + Get.MenuItem$(Num, OldSelected) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, OldSelected))), FCol, QMenu.MenuBCol END IF END IF MShow END IF END IF OldMx = Mx OldMy = My LOOP UNTIL Click = 1 OR Key$ <> "" Key$ = "" MHide PCOPY 1, 0 MShow END FUNCTION SUB PPrint (x, y, Text$, FCol, BCol) 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' Prints text Text$ at x,y in color FCol, BCol 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ xx = x FOR i = 1 TO LEN(Text$) PokeChar xx, y, MID$(Text$, i, 1), FCol, BCol xx = xx + 1 NEXT END SUB SUB Set.MenuItem (MenuNum, Num, Caption$, Active AS STRING, Style AS STRING, Selected AS STRING) 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' Sets menu item Num in menu MenuNum information variables, see ' SUB Create.MenuItem for information about the menu item variables. 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ SEEK #251, (CLNG(MenuNum - 1) * 6100) + (Num * 122) Temp$ = LEFT$(Caption$, 50) Temp$ = Temp$ + SPACE$(50 - LEN(Temp$)) MenuItem.Caption = Caption$ MenuItem.Active = Active MenuItem.Style = Style MenuItem.Selected = Selected PUT #251, , MenuItem END SUB SUB Set.MenuTopic (Num, Topic$) 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' Sets the main menu topic number Num to text Topic$ 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ SEEK #250, CLNG(Num) * 16 Temp$ = LEFT$(Topic$, 16) Temp$ = Temp$ + SPACE$(16 - LEN(Temp$)) PUT #250, , Temp$ END SUB SUB Toggle.MenuItem (MenuNum, Num, State) 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' Sets the menu item Num in menu number MenuNum active or disabled ' ' State: True - Active, False - Disabled 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Caption$ = Get.MenuItem$(MenuNum, Num) Get.MenuItemInfo MenuNum, Num, Style$, Selected$, Active$ IF State THEN Set.MenuItem MenuNum, Num, Caption$, "1", Style$, Selected$ ELSE Set.MenuItem MenuNum, Num, Caption$, "0", Style$, Selected$ END IF END SUB