#include #include #include #define MAXNIV 7 #define MAXOPC 15 #define MAXNOM 9 #define MAXLIT 41 #define MAXCOM 81 #define MENUINICIAL "MENU" #define NOMDEF "LOSMENUS.DAT" #define REVERSE 1 #define NORMAL 0 #define ARRIBA 72 #define ABAJO 80 #define ESCAPE 27 #define ENTER 13 #define ANORM 6 #define AREVE 38 #define ATITU 4 char nomb[MAXNIV][MAXNOM]; char opci[MAXNIV]; char sele[MAXNIV]; char lite[MAXNIV][MAXOPC][MAXLIT]; char coma[MAXNIV][MAXOPC][MAXCOM]; char sigmenu[MAXNOM]; char buff[4096]; int nivel; void dibuja_opcion(int n,int sel,int atr) { gotoxy(2,2+sel); textattr(atr==REVERSE?AREVE:ANORM); cprintf("%s",lite[n][sel]); textattr(ANORM); } void dibuja_menu(char *tit,int mx,int my,int an,int al,int n) { int i; window(mx,my,mx+an-1,my+al); textattr(ANORM); clrscr(); gotoxy(1,1); putch('Ú'); for(i=2;iopci[n]) sele[n]=0; } } int cargar_menu(char *menu) { FILE *fp; char linea[128]; int est=0,opc=0; if((fp=fopen(NOMDEF,"r"))==NULL) return(1); while(est!=9) { if(fgets(linea,100,fp)==NULL) { strcpy(linea,"@@"); est=8; } else linea[strlen(linea)-1]=0; switch(est) { case 0: if(linea[0]=='@') if(!strcmp(menu,&linea[1])) { strcpy(nomb[nivel],menu); est=1; } break; case 1: if(linea[0]=='@') { est=8; break; } strcpy(lite[nivel][opc],linea); strcpy(coma[nivel][opc],""); est=2; break; case 2: if(linea[0]=='@') { est=8; break; } strcpy(coma[nivel][opc],linea); opc++; if(opc==MAXOPC) est=8; else est=1; break; case 8: opci[nivel]=opc-1; sele[nivel]=0; est=9; } } fclose(fp); return(!opc); } void cuerpo_programa(char *menu) { int nivel_ant=-1; nivel=0; strcpy(sigmenu,menu); do { if(nivel>nivel_ant) if(cargar_menu(sigmenu)) { nivel--; continue; } nivel_ant=nivel; nivel+=procesar_menu(nivel); if(nivel==MAXNIV) { nivel--; /* OVERFLOW */ } } while(nivel>=0); } void pantalla_inicial() { window(1,1,80,25); textattr(ANORM); clrscr(); } main() { pantalla_inicial(); cuerpo_programa(MENUINICIAL); return(0); }