📄 menu.h
字号:
//头文件
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<bios.h>
#include<dos.h>
//宏定义
//宏定义菜单信息
#define FILE 1
#define NEWBUILD 2
#define EDIT 3
#define BIOPT 4
#define HELP 5
#define FILE_FRESH 11
#define FILE_NEW 12
#define FILE_OPEN 13
#define FILE_SAVE 14
#define FILE_SAVEAS 15
#define FILE_EXIT 16
#define NEWBUILD_RNDNUM 21
#define NEWBUILD_INPUTNUM 22
#define EDIT_SEARCH 31
#define EDIT_ADD 32
#define EDIT_DEL 33
#define BIOPT_RANDNUM 41
#define BIOPT_COMPOUND 42
#define BIOPT_DEPART 43
#define HELP_HELP 51
#define HELP_ABOUT 52
//宏定义键盘键位信息
#define UP_KEY 0x4800
#define DOWN_KEY 0x5000
#define LEFT_KEY 0x4b00
#define RIGHT_KEY 0x4d00
#define F10_KEY 0x4400
#define RETURN_KEY 0x1c0d
#define BS_KEY 0x0e08
#define ESC_KEY 0x011b
//菜单结构定义
typedef struct menu{
int ID;
int x,y;
int active;
char content[20];
struct menu *pSubMenu;
int n_SubMenu;
}MENU;
//主菜单及子菜单初始化
MENU FileSub[6]={
{ FILE_FRESH,3,2,0,"Refresh",NULL,0},
{ FILE_NEW,3,3,0,"New",NULL,0},
{ FILE_OPEN,3,4,0,"Open..",NULL,0},
{ FILE_SAVE,3,5,0,"Save",NULL,0},
{ FILE_SAVEAS,3,6,0,"Save As..",NULL,0},
{ FILE_EXIT,3,7,0,"Exit",NULL,0}
};
MENU NewBuildSub[2]={
{ NEWBUILD_RNDNUM,16,2,0,"RandData",NULL,0},
{ NEWBUILD_INPUTNUM,16,3,0,"InputData",NULL,0},
};
MENU EditSub[3]={
{ EDIT_SEARCH,33,2,0,"Search-Node",NULL,0},
{ EDIT_ADD,33,3,0,"Add-Node",NULL,0},
{ EDIT_DEL,33,4,0,"Delete-Node",NULL,0}
};
MENU BiOperateSub[3]={
{ BIOPT_RANDNUM,48,2,0,"Rnd-Data",NULL,0},
{ BIOPT_COMPOUND,48,3,0,"Compound-Tree",NULL,0},
{ BIOPT_DEPART,48,4,0,"Depart-Tree",NULL,0}
};
MENU HelpSub[2]={
{ HELP_HELP,65,2,0,"Help",NULL,0},
{ HELP_ABOUT,65,3,0,"About..",NULL,0}
};
MENU MainMenu[5]={
{ FILE,3,1,0,"File",FileSub,6},
{ NEWBUILD,16,1,0,"NewBuild",NewBuildSub,2},
{ EDIT,33,1,0,"Edit",EditSub,3},
{ BIOPT,48,1,0,"BiOperate",BiOperateSub,3},
{ HELP,65,1,0,"Help",HelpSub,2}
};
//绘制菜单
void MenuDraw(MENU *pMenu,int n)
{
window(1,1,80,25);
for(;n>0;n--){
textbackground(pMenu->active? GREEN:WHITE);
textcolor(RED);
gotoxy(pMenu->x,pMenu->y);
cprintf("%s",pMenu->content);
pMenu++;
}
}
//绘制主菜单
void MenuDraw_M(MENU *pMenu,int n)
{
window(1,1,80,25);
for(;n>0;n--){
textbackground(pMenu->active? GREEN:CYAN);
textcolor(RED);
gotoxy(pMenu->x,pMenu->y);
cprintf("%s",pMenu->content);
pMenu++;
}
}
//绘制界面框架
void FrameDraw()
{
int i,j;
textbackground(BLUE);
clrscr();
_setcursortype(_NOCURSOR);
window(1,1,80,1);
textbackground(CYAN);
clrscr();
window(1,25,80,25);
clrscr();
textbackground(WHITE);
textcolor(BLACK);
window(1,2,80,2);
clrscr();
window(1,24,80,24);
clrscr();
window(1,2,1,24);
clrscr();
window(80,2,80,24);
clrscr();
window(1,1,80,25);
for(i=2;i<80;i++){
gotoxy(i,2);
cprintf("%c",205);
gotoxy(i,24);
cprintf("%c",205);
}
for(j=3;j<24;j++){
gotoxy(1,j);
cprintf("%c",186);
gotoxy(80,j);
cprintf("%c",186);
}
gotoxy(1,2);cprintf("%c",201);
gotoxy(80,2);cprintf("%c",187);
gotoxy(1,24);cprintf("%c",200);
gotoxy(80,24);cprintf("%c",188);
textbackground(LIGHTBLUE);
window(2,3,54,23);
clrscr();
textbackground(YELLOW);
window(56,3,79,12);
clrscr();
textbackground(GREEN);
window(56,14,79,23);
clrscr();
window(1,1,80,25);
textcolor(BLUE);
textbackground(WHITE);
for(j=3;j<24;j++){
gotoxy(55,j);
cprintf("%c",186);
}
for(i=56;i<80;i++){
gotoxy(i,13);
cprintf("%c",205);
}
gotoxy(55,2);cprintf("%c",203);
gotoxy(55,24);cprintf("%c",202);
gotoxy(55,13);cprintf("%c",204);
textcolor(BLACK);
gotoxy(80,13);cprintf("%c",185);
textcolor(BLUE);
gotoxy(60,2);cprintf("Input Information");
gotoxy(60,13);cprintf("Node Information");
textbackground(CYAN);
textcolor(BLUE);
gotoxy(4,25);
cprintf("F10--(Menu)");
gotoxy(19,25);
cprintf("%c",26);
gotoxy(20,25);
cprintf("%c",27);
gotoxy(21,25);
cprintf("%c",24);
gotoxy(22,25);
cprintf("%c",25);
gotoxy(23,25);
cprintf("--(Move)");
gotoxy(35,25);
cprintf("%c",25);
gotoxy(36,25);
cprintf("--(RandNum)");
gotoxy(53,25);
cprintf("Enter--(OK)");
gotoxy(67,25);
cprintf("ESC--(Back)");
MenuDraw_M(MainMenu,5);
}
//查找活动菜单
int SearchActiveMenu(MENU *pMenu,int n)
{
for(n--;n>=0;n--){
if(pMenu[n].active)
break; }
return(n);
}
//选择菜单
int MenuSelect()
{
int b_Exit=0;
int result=0;
int b_SubMenu=0;
int left=1,top=1,right=1,bottom=1,n;
char buffer[500];
MainMenu[0].active=1;
MenuDraw_M(MainMenu,5);
while(!b_Exit){
switch(bioskey(0)){
case F10_KEY:
if(b_SubMenu){
b_SubMenu=0;
puttext(left,top,right,bottom,buffer);
}
break;
case ESC_KEY:
n=SearchActiveMenu(MainMenu,5);
MainMenu[n].active=0;
if(b_SubMenu)
puttext(left,top,right,bottom,buffer);
MenuDraw_M(MainMenu,5);
result=0;
b_Exit=1;
break;
case UP_KEY:
if(b_SubMenu){
int m;
n=SearchActiveMenu(MainMenu,5);
m=SearchActiveMenu(MainMenu[n].pSubMenu,MainMenu[n].n_SubMenu);
(MainMenu[n].pSubMenu+m)->active=0;
if(m==0)
(MainMenu[n].pSubMenu+MainMenu[n].n_SubMenu-1)->active=1;
else
(MainMenu[n].pSubMenu+m-1)->active=1;
MenuDraw(MainMenu[n].pSubMenu,MainMenu[n].n_SubMenu);
}
break;
case DOWN_KEY:
if(b_SubMenu){
int m;
n=SearchActiveMenu(MainMenu,5);
m=SearchActiveMenu(MainMenu[n].pSubMenu,MainMenu[n].n_SubMenu);
(MainMenu[n].pSubMenu+m)->active=0;
if(m==(MainMenu[n].n_SubMenu-1))
MainMenu[n].pSubMenu->active=1;
else
(MainMenu[n].pSubMenu+m+1)->active=1;
MenuDraw(MainMenu[n].pSubMenu,MainMenu[n].n_SubMenu);
}
n=SearchActiveMenu(MainMenu,5);
if(!b_SubMenu){
b_SubMenu=1;
left=MainMenu[n].pSubMenu->x;
top=2;
right=left+15;
bottom=top+MainMenu[n].n_SubMenu-1;
gettext(left,top,right,bottom,buffer);
window(left,top,right,bottom);
textbackground(WHITE);
clrscr();
MenuDraw(MainMenu[n].pSubMenu,MainMenu[n].n_SubMenu);
}
break;
case LEFT_KEY:
n=SearchActiveMenu(MainMenu,5);
MainMenu[n].active=0;
n=(n==0)?4:(n-1);
MainMenu[n].active=1;
MenuDraw_M(MainMenu,5);
if(b_SubMenu){
puttext(left,top,right,bottom,buffer);
left=MainMenu[n].pSubMenu->x;
top=2;
right=left+15;
bottom=top+MainMenu[n].n_SubMenu-1;
gettext(left,top,right,bottom,buffer);
window(left,top,right,bottom);
textbackground(WHITE);
clrscr();
MenuDraw(MainMenu[n].pSubMenu,MainMenu[n].n_SubMenu);
}
break;
case RIGHT_KEY:
n=SearchActiveMenu(MainMenu,5);
MainMenu[n].active=0;
n=(n+1)%5;
MainMenu[n].active=1;
MenuDraw_M(MainMenu,5);
if(b_SubMenu){
puttext(left,top,right,bottom,buffer);
left=MainMenu[n].pSubMenu->x;
top=2;
right=left+15;
bottom=top+MainMenu[n].n_SubMenu-1;
gettext(left,top,right,bottom,buffer);
window(left,top,right,bottom);
textbackground(WHITE);
clrscr();
MenuDraw(MainMenu[n].pSubMenu,MainMenu[n].n_SubMenu);
}
break;
case RETURN_KEY:
n=SearchActiveMenu(MainMenu,5);
if(!b_SubMenu){
b_SubMenu=1;
left=MainMenu[n].pSubMenu->x;
top=2;
right=left+15;
bottom=top+MainMenu[n].n_SubMenu-1;
gettext(left,top,right,bottom,buffer);
window(left,top,right,bottom);
textbackground(WHITE);
clrscr();
MenuDraw(MainMenu[n].pSubMenu,MainMenu[n].n_SubMenu);
}
else{
int m;
m=SearchActiveMenu(MainMenu[n].pSubMenu,MainMenu[n].n_SubMenu);
result=(MainMenu[n].pSubMenu+m)->ID;
MainMenu[n].active=0;
puttext(left,top,right,bottom,buffer);
MenuDraw_M(MainMenu,5);
b_Exit=1;
}
break;
}
}
return (result);
}
//输出帮助界面
void printhelp()
{
textbackground(GREEN);
textcolor(BLACK);
window(1,2,80,25);
clrscr();
gotoxy(20,4);
cprintf("This is a programe about balances bi-tree.");
gotoxy(20,6);
cprintf("You may prefer to the following tips:");
gotoxy(20,9);
cprintf("F10-----Menu");
gotoxy(20,11);
cprintf("%c%c%c%c-----Move",26,27,24,25);
gotoxy(20,13);
cprintf("%c-----RndNum",25);
gotoxy(20,15);
cprintf("Enter-----OK");
gotoxy(20,17);
cprintf("ESC-----Back");
gotoxy(20,19);
cprintf("Before adding or deleting, you must creat tree.");
_setcursortype(_NOCURSOR);
}
//输出关于界面
void printabout()
{
textbackground(GREEN);
textcolor(RED);
window(1,2,80,25);
clrscr();
gotoxy(25,5);
cprintf("Balances Bi-Tree Display System");
gotoxy(33,10);
cprintf("(Version 1.0)");
gotoxy(27,23);
cprintf("Copyright @ Hawkyang 9-2005");
_setcursortype(_NOCURSOR);
}
//输出封面
void printcover()
{
textbackground(CYAN);
textcolor(RED);
window(1,1,80,25);
clrscr();
gotoxy(32,4);
cprintf("Welcome To The");
gotoxy(25,7);
cprintf("Balances Bi-Tree Display System");
gotoxy(33,12);
cprintf("(Version 1.0)");
gotoxy(29,23);
cprintf("Press any key . . . . . .");
_setcursortype(_NOCURSOR);
getch();
}
//输出结点
void printnode(int x,int y,int data,int bf)
{
if(data>99){
printf("\nError!\n");
return;
}
else{
textcolor(WHITE);
gotoxy(x,y);
cprintf("%c",218);
gotoxy(x+3,y);
cprintf("%c",196);
gotoxy(x+4,y);
cprintf("%c",191);
gotoxy(x,y+1);
cprintf("%c",179);
gotoxy(x,y+2);
cprintf("%c",192);
gotoxy(x+1,y+2);
cprintf("%c",196);
gotoxy(x+2,y+2);
cprintf("%c",196);
gotoxy(x+3,y+2);
cprintf("%c",196);
gotoxy(x+4,y+1);
cprintf("%c",179);
gotoxy(x+4,y+2);
cprintf("%c",217);
gotoxy(x+2,y+1);
cprintf("%d",data);
gotoxy(x+2,y);
textcolor(RED);
cprintf("%d",bf);
textcolor(WHITE);
}
}
//输出结点(用于查找)
void printtnode(int x,int y,int data,int bf)
{
if(data>99){
printf("\nError!\n");
return;
}
else{
textcolor(RED);
gotoxy(x,y);
cprintf("%c",218);
gotoxy(x+3,y);
cprintf("%c",196);
gotoxy(x+4,y);
cprintf("%c",191);
gotoxy(x,y+1);
cprintf("%c",179);
gotoxy(x,y+2);
cprintf("%c",192);
gotoxy(x+1,y+2);
cprintf("%c",196);
gotoxy(x+2,y+2);
cprintf("%c",196);
gotoxy(x+3,y+2);
cprintf("%c",196);
gotoxy(x+4,y+1);
cprintf("%c",179);
gotoxy(x+4,y+2);
cprintf("%c",217);
gotoxy(x+2,y+1);
cprintf("%d",data);
gotoxy(x+2,y);
textcolor(GREEN);
cprintf("%d",bf);
textcolor(WHITE);
}
}
//输出平衡二叉树的结点
void printree(int x,int y,int a[32],int d[32],int v[32])
{
int i;
clrscr();
for(i=16;i<31;i++)
if(a[i]==1){
textcolor(WHITE);
textbackground(LIGHTBLUE);
window(3,3,54,23);
clrscr();
gotoxy(4,5);
printf("Sorry! Nodes are too many.");
gotoxy(4,7);
printf("They can't be displayed correctly!");
return;
}
if(x<22 || y>10){
printf("\nError!\n");
return;
}
else{
if(a[1])
printnode(x,y,d[1],v[1]);
if(a[2]){
gotoxy(x-2,y+3);
cprintf("%c",47);
printnode(x-9,y+4,d[2],v[2]);}
if(a[3]){
gotoxy(x+6,y+3);
cprintf("%c",92);
printnode(x+9,y+4,d[3],v[3]);}
if(a[4]){
gotoxy(x-11,y+7);
cprintf("%c",47);
printnode(x-17,y+8,d[4],v[4]);}
if(a[5]){
gotoxy(x-4,y+7);
cprintf("%c",92);
printnode(x-6,y+8,d[5],v[5]);}
if(a[6]){
gotoxy(x+8,y+7);
cprintf("%c",47);
printnode(x+5,y+8,d[6],v[6]);}
if(a[7]){
gotoxy(x+15,y+7);
cprintf("%c",92);
printnode(x+17,y+8,d[7],v[7]);}
if(a[8]){
gotoxy(x-18,y+11);
cprintf("%c",47);
printnode(x-21,y+12,d[8],v[8]);}
if(a[9]){
gotoxy(x-14,y+11);
cprintf("%c",92);
printnode(x-16,y+12,d[9],v[9]);}
if(a[10]){
gotoxy(x-6,y+11);
cprintf("%c",47);
printnode(x-9,y+12,d[10],v[10]);}
if(a[11]){
gotoxy(x-2,y+11);
cprintf("%c",92);
printnode(x-4,y+12,d[11],v[11]);}
if(a[12]){
gotoxy(x+5,y+11);
cprintf("%c",47);
printnode(x+3,y+12,d[12],v[12]);}
if(a[13]){
gotoxy(x+9,y+11);
cprintf("%c",92);
printnode(x+8,y+12,d[13],v[13]);}
if(a[14]){
gotoxy(x+17,y+11);
cprintf("%c",47);
printnode(x+15,y+12,d[14],v[14]);}
if(a[15]){
gotoxy(x+21,y+11);
cprintf("%c",92);
printnode(x+20,y+12,d[15],v[15]);}
}
}
//查找平衡二叉树中的结点
void printsearchtree(int x,int y,int a[32],int d[32],int v[32],int &snode)
{
clrscr();
if(x<22 || y>10){
printf("\nError!\n");
return;
}
else{
if(a[1])
if(d[1]==snode)
printtnode(x,y,d[1],v[1]);
else
printnode(x,y,d[1],v[1]);
if(a[2]){
gotoxy(x-2,y+3);
cprintf("%c",47);
if(d[2]==snode)
printtnode(x-9,y+4,d[2],v[2]);
else
printnode(x-9,y+4,d[2],v[2]);
}
if(a[3]){
gotoxy(x+6,y+3);
cprintf("%c",92);
if(d[3]==snode)
printtnode(x+9,y+4,d[3],v[3]);
else
printnode(x+9,y+4,d[3],v[3]);
}
if(a[4]){
gotoxy(x-11,y+7);
cprintf("%c",47);
if(d[4]==snode)
printtnode(x-17,y+8,d[4],v[4]);
else
printnode(x-17,y+8,d[4],v[4]);
}
if(a[5]){
gotoxy(x-4,y+7);
cprintf("%c",92);
if(d[5]==snode)
printtnode(x-6,y+8,d[5],v[5]);
else
printnode(x-6,y+8,d[5],v[5]);
}
if(a[6]){
gotoxy(x+8,y+7);
cprintf("%c",47);
if(d[6]==snode)
printtnode(x+5,y+8,d[6],v[6]);
else
printnode(x+5,y+8,d[6],v[6]);
}
if(a[7]){
gotoxy(x+15,y+7);
cprintf("%c",92);
if(d[7]==snode)
printtnode(x+17,y+8,d[7],v[7]);
else
printnode(x+17,y+8,d[7],v[7]);
}
if(a[8]){
gotoxy(x-18,y+11);
cprintf("%c",47);
if(d[8]==snode)
printtnode(x-21,y+12,d[8],v[8]);
else
printnode(x-21,y+12,d[8],v[8]);
}
if(a[9]){
gotoxy(x-14,y+11);
cprintf("%c",92);
if(d[9]==snode)
printtnode(x-16,y+12,d[9],v[9]);
else
printnode(x-16,y+12,d[9],v[9]);
}
if(a[10]){
gotoxy(x-6,y+11);
cprintf("%c",47);
if(d[10]==snode)
printtnode(x-9,y+12,d[10],v[10]);
else
printnode(x-9,y+12,d[10],v[10]);
}
if(a[11]){
gotoxy(x-2,y+11);
cprintf("%c",92);
if(d[11]==snode)
printtnode(x-4,y+12,d[11],v[11]);
else
printnode(x-4,y+12,d[11],v[11]);
}
if(a[12]){
gotoxy(x+5,y+11);
cprintf("%c",47);
if(d[12]==snode)
printtnode(x+3,y+12,d[12],v[12]);
else
printnode(x+3,y+12,d[12],v[12]);
}
if(a[13]){
gotoxy(x+9,y+11);
cprintf("%c",92);
if(d[13]==snode)
printtnode(x+8,y+12,d[13],v[13]);
else
printnode(x+8,y+12,d[13],v[13]);
}
if(a[14]){
gotoxy(x+17,y+11);
cprintf("%c",47);
if(d[14]==snode)
printtnode(x+15,y+12,d[14],v[14]);
else
printnode(x+15,y+12,d[14],v[14]);
}
if(a[15]){
gotoxy(x+21,y+11);
cprintf("%c",92);
if(d[15]==snode)
printtnode(x+20,y+12,d[15],v[15]);
else
printnode(x+20,y+12,d[15],v[15]);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -