一个图形菜单程序(最新注释版+目标文件下载)
在TC中编译时要先链接图库,运行后用方向键移动光标(发亮的菜单表示被选中),按回车回到主菜单,有兴趣的朋友还可以添加一些子程序以实现相应的功能;此程序运行后按退出。
多赐教拉!
最近写了一个画图的工具加在“DESIGN”项下,只要输入函数表达式和X的最大值和最小值(最好为正数),就能画出其曲线,如果在"DO YOU WANT TO CONTINUE(Y/N)"后输入S(不回显),可以将几个曲线叠加显示,现在将目标文件上传供大家交流!多多支持……。。
#include<graphics.h>
#include<stdio.h>
#include<dos.h>
#include<malloc.h>
char *str1[4][8],*str2[4][8];
int x,y;
void mamenu(int n)/*这个用来生成主菜单项*/
{ setcolor(BROWN);
rectangle(10+64*(n-1),1,64*n,10);
floodfill(11+64*(n-1),2,BROWN);
};
void secmenu(int n,int n1)/*这个用来生成下级菜单项*/
{setcolor(YELLOW);
rectangle(10+64*(n-1),12+12*(n1-1),26+64*n,22+12*(n1-1));
floodfill(11+64*(n-1),13+12*(n1-1),YELLOW);
};
void low_bar(int n,int n1)/*这个函数用来为菜单项着暗色,表示未被选中*/
{void *buf;
int size;
setactivepage(1);
cleardevice();
setfillstyle(1,BLUE);
if(n1==0){
mamenu(n);
outtextxy(12+64*(n-1),3,str1[n][n1]);
size=imagesize(10+64*(n-1),1,64*n,10);
buf=malloc(size);
getimage(10+64*(n-1),1,64*n,10,buf);
setactivepage(0);
putimage(10+64*(n-1),1,buf,0);
free(buf);}
else {
secmenu(n,n1);
outtextxy(12+64*(n-1),14+12*(n1-1),str2[n][n1]);
size=imagesize(10+64*(n-1),12+12*(n1-1),26+64*n,22+12*(n1-1));
buf=malloc(size);
getimage(10+64*(n-1),12+12*(n1-1),26+64*n,22+12*(n1-1),buf);
setactivepage(0);
putimage(10+64*(n-1),12+12*(n1-1),buf,0);
free(buf);}
setvisualpage(0);
};
void light_bar(int n,int n1)/*这个函数用来为菜单项着亮色,表示被选中*/
{void *buf;
int size;
setactivepage(1);
cleardevice();
setfillstyle(1,LIGHTBLUE);
if(n1==0){
mamenu(n);
outtextxy(12+64*(n-1),3,str1[n][n1]);
size=imagesize(10+64*(n-1),1,64*n,10);
buf=malloc(size);
getimage(10+64*(n-1),1,64*n,10,buf);
setactivepage(0);
putimage(10+64*(n-1),1,buf,0);
free(buf);}
else {
secmenu(n,n1);
outtextxy(12+64*(n-1),14+12*(n1-1),str2[n][n1]);
size=imagesize(10+64*(n-1),12+12*(n1-1),26+64*n,22+12*(n1-1));
buf=malloc(size);
getimage(10+64*(n-1),12+12*(n1-1),26+64*n,22+12*(n1-1),buf);
setactivepage(0);
putimage(10+64*(n-1),12+12*(n1-1),buf,0);
free(buf);}
setvisualpage(0);
};
void move_bar(int flag)/*移动光条*/
{ int n,n1;
n=x;
n1=y;
switch(flag)
{
case 1:
if(n<2)
{low_bar(n,n1);
light_bar(n+1,n1);
x=n+1;y=n1;}
else {low_bar(n,n1);
light_bar(1,n1);
x=1;y=n1;}
break;
case 2:
if(n>1)
{low_bar(n,n1);
light_bar(n-1,n1);
x=n-1;y=n1;}
else {low_bar(n,n1);
light_bar(2,n1);
x=2;y=n1;}
break;
case 3:
if(n1<4)
{low_bar(n,n1);
light_bar(n,n1+1);
x=n;y=n1+1;}
else {low_bar(n,n1);
light_bar(n,1);
x=n;y=1;}
break;
case 4:
if(n1>1)
{low_bar(n,n1);
light_bar(n,n1-1);
x=n;y=n1-1;}
else {low_bar(n,n1);
light_bar(n,4);
x=n;y=4;}
break;
}
};
int read_key()/*读取键盘扫描码*/
{union REGS rg;
rg.h.ah=0;
int86(0x16,&rg,&rg);
return(rg.h.ah);
};
void tsr()
{;
/*restorecrtmode();
;
setgraphmode;*/
};
main()
{char s1[15],s2[15];
unsigned uparten;
int graphdriver=DETECT;
int graphmode,flag,key,eflag;
registerbgidriver(EGAVGA_driver);/*如果没有连接图库,可删去此行*/
initgraph(&graphdriver,&graphmode,"");
settextstyle(0,0,1);
setlinestyle(0,uparten,1);
cleardevice();
setviewport(0,0,400,300,0);
str1[2][0]="EDIT";
str1[1][0]="FILE";
str2[1][1]="text";
str2[1][2]="music";
str2[1][3]="dir:";
str2[1][4]="quit";
str2[2][1]="copy";
str2[2][2]="cut";
str2[2][3]="paste";
str2[2][4]="cancel";
mamenu(1);
mamenu(2);
low_bar(1,0);
low_bar(2,0);
light_bar(1,0);
x=1;y=0;
do{
eflag=0;
do{key=read_key();
if(key==77){flag=1;eflag=1;}
if(key==75){flag=2;eflag=1;}
if(key==80){flag=3;eflag=1;}
if(key==72){flag=4;eflag=1;}
if(key==28){flag=5; eflag=1;}
if(key==15)exit(0);}while(eflag!=1);
if(flag==5)
{ if(y==0)
{cleardevice();
low_bar(1,0);
low_bar(2,0);
low_bar(x,y);
light_bar(x,1);
low_bar(x,2);
low_bar(x,3);
low_bar(x,4);
y=1;}
else
{cleardevice();
low_bar(1,0);
low_bar(2,0);
light_bar(x,0);
y=0;}
}
else if((flag==1||flag==2)&&y!=0)
{cleardevice();
if(flag==1&&x<2)x=x+1;
else if(flag==1&&x==2) x=1;
else if(flag==2&&x>1)x=x-1;
else x=2;
low_bar(1,0);
low_bar(2,0);
low_bar(x,1);
low_bar(x,2);
low_bar(x,3);
low_bar(x,4);
light_bar(x,y);
}
else if((flag==3||flag==4)&&y==0)continue;
else move_bar(flag);
}while(1);
}
大家多提意见哦,不要客气!
[此贴子已经被作者于2005-12-21 13:42:32编辑过]