Menu
This document describes the changes you must make to add a menu to your project.
Changes to myio.h
/*** MENU.C ***/
typedef struct _tagMENUITEM {
char *Selection, *Description;
int HotKey, ID;
int (*Func2Call)(int);
struct _tagMENUITEM *Menu2Call;
} MENUITEM;
void DrawMenu( MENUITEM MenuList[], int Row, int Col, int RegColor, int HiColor, int Item );
void ClearMenu( MENUITEM MenuList[], int Row, int Col, int Back );
int Menu( MENUITEM MenuList[], int Row, int Col, int RegColor, int HiColor, int Back, int AllowEsc );
MENU.C
The following represents the MENU.C module, it should be added
to your poroject:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dos.h>
#include "myio.h"
void DrawMenu( MENUITEM MenuList[], int Row, int Col, int RegColor, int HiColor, int Item )
{
unsigned int i, Width, Height;
for( Width=Height=0;MenuList[Height].Selection; Height++ )
Width=max(Width, strlen(MenuList[Height].Selection) );
Box( Row, Col, Height+1, Width+3, RegColor );
for(i=0; MenuList[i].Selection; i++ )
{
Locate( Row+i+1, Col+2 );
CPrintStr(MenuList[i].Selection, i!=(unsigned)Item?RegColor:HiColor );
}
}
void ClearMenu( MENUITEM MenuList[], int Row, int Col, int Back )
{
unsigned int Width, Height;
for( Width=Height=0;MenuList[Height].Selection; Height++ )
Width=max(Width, strlen(MenuList[Height].Selection) );
ClearBox( Row, Col, Height+1, Width+3, Back );
}
int Menu( MENUITEM MenuList[], int Row, int Col, int RegColor, int HiColor, int Back, int AllowEsc )
{
int Ch, CurItem=0, LastItem, i;
for(LastItem=0; MenuList[LastItem].Selection; LastItem++)
;
DrawMenu( MenuList, Row, Col, RegColor, HiColor, CurItem );
StatusMsg( MenuList[CurItem].Description );
HideCursor();
while ( 1 )
{
if( (Ch=GetKey())==ESC && AllowEsc )
break;
if( Ch==ENTER )
{
if( MenuList[CurItem].Func2Call!=NULL )
{
if( (*MenuList[CurItem].Func2Call)(MenuList[CurItem].ID)==0 )
break;
DrawMenu( MenuList, Row, Col, RegColor, HiColor, CurItem );
StatusMsg( MenuList[CurItem].Description );
}
else if( MenuList[CurItem].Menu2Call!=NULL )
{
Menu( MenuList[CurItem].Menu2Call, Row+CurItem+1, Col+1, RegColor, HiColor, Back, 1 );
DrawMenu( MenuList, Row, Col, RegColor, HiColor, CurItem );
StatusMsg( MenuList[CurItem].Description );
}
else
break;
HideCursor();
}
else
{
Locate( Row+CurItem+1, Col+2 );
CPrintStr(MenuList[CurItem].Selection, RegColor );
HideCursor();
if( (Ch==CURUP && CurItem-- == 0) || Ch==END )
CurItem=LastItem-1;
else
if( (Ch==CURDN && ++CurItem == LastItem) || Ch == HOME )
CurItem=0;
else
{
if( Ch>='a' && Ch<='z' )
Ch=toupper(Ch);
for(i=0; MenuList[i].Selection && MenuList[i].HotKey!=Ch; i++)
;
if( MenuList[i].Selection )
CurItem=i;
}
Locate( Row+CurItem+1, Col+2 );
CPrintStr(MenuList[CurItem].Selection, HiColor );
StatusMsg( MenuList[CurItem].Description );
HideCursor();
}
}
ClearMenu( MenuList, Row, Col, Back );
return( Ch );
}