求助:用C语言如何实现图形菜单界面
我想用C语言实现一个菜单图形界面,可是怎么都做不好.下面的程序,总有问题.高手帮帮忙,可以吗?谢谢啦.
#include "graphics.h"
#include "stdio.h"
#define ALT_F 33
#define ALT_E 18
#define ALT_X 45
#define KEY_ESC 27
#define KEY_LEFT 75
#define KEY_RIGHT 77
#define KEY_UP 72
#define KEY_DOWN 80
#define KEY_ENTER 13
#define HIGH 15
#define WIDTH 50
void main(){
int graphdriver=DETECT;
int graphmode,x,y,size;
float i,j,x1,x2,y1,y2,n=0,m=0;
char c,c1;
char s[2][10]={"File","Edit"};
char s1[][10]={"New","Load","Quit"};
char s2[][10]={"Copy","Paste","Find"};
int mcount=2;
void* buff=NULL;
detectgraph( &graphdriver, &graphmode);
print("%d %d\n",graphdriver,graphmode);
registerbgidriver(EGAVGA_driver);
initgraph(&graphdriver,&graphmode,"");
cleardevice();
setviewport(0,0,300,250,1);
setcolor(WHITE);
rectangle(0,0,250,200);
setfillstyle(1,BLUE);
floodfill(1,1,WHITE);
setfillstyle(1,LIGHTGRAY);
bar(1,1,249,16);
setcolor(YELLOW);
settextstyle(0,0,1);
for(i=0;i<mcount;i++)
outtextxy(10+i*WIDTH,3,s[i]);
for(;;){
c=getch();
switch(c){
case ALT_X:
if(buff!=NULL)free(buff);
closegraph();
exit(0);
case ALT_F:
if(buff!=NULL){
putimage(0,0,buff,COPY_PUT);
free(buff);
}
buff=imagebuff(10,1,100,100);
submenu(100,3,1,s1);
m=1;
n=1;
break;
case ALT_E:
if(buff!=NULL){
putimage(0,0,buff,COPY_PUT);
free(buff);
}
buff=imagebuff(10+WIDTH,1,100,100);
submenu(100,3,1,s2);
m=1;
n=2;
break;
case KEY_ESC:
if(buff!=NULL){
putimage(0,0,buff,COPY_PUT);
free(buff);
}
m=0;
n=0;
break;
case KEY_LEFT:
case KEY_RIGHT:
if(0==n)break;
putimage(0,0,buff,COPY_PUT);
free(buff);
if(1==n){
buff=imagebuff(10+WIDTH,1,100,100);
submenu(100,3,1,s2);
m=1;
n=2;
}
else{
buff=imagebuff(10,1,100,100);
submenu(100,3,1,s1);
m=1;
n=1;
}
break;
case KEY_UP:
if(0==m ¦ ¦m<=1)break;
m--;
if(1==n)
submenu(100,3,m,s1);
else
submenu(100,3,m,s2);
break;
case KEY_DOWN:
if(0==m ¦ ¦m>=3)break;
m++;
if(1==n)submenu(100,3,m,s1);
else submenu(100,3,m,s2);
break;
case KEY_ENTER:
if(0==m)break;
putimage(0,0,buff,COPY_PUT);
free(buff);
buff=imagebuff(5,20,240,175);
switch(m){
case 1:
if(1==n)
outtextxy(50,50,"File-->New");
else
outtextxy(50,50,"Edit-->Copy");
break;
case 2:
if(1==n)
outtextxy(50,50,"File-->Load");
else
outtextxy(50,50,"Edit-->Paste");
break;
case 3:
if(1==n){
free(buff);
closegraph();
exit(0);}
else
outtextxy(50,50,"Edit-->Find");
break;}
m=0;
n=0;
break;
}
}
closegraph();
}
void submenu(int w,int n,int m,char s[][10]){
int i,mw,mh;
mw=w;
mh=n*HIGH+20;
setfillstyle(1,LIGHTGRAY);
bar(0,15,w,mh);
rectangle(5,16,mw-5,mh-5);
for(i=0;i<n;i++)
outtextxy(8,i*15+18,s[i]);
setfillstyle(1,DARKGRAY);
bar(7,(m-1)*15+18,mw-7,m*15+17);
outtextxy(8,(m-1)*15+20,s[m-1]);
}
void *imagebuff(int x1,int x2,int w,int h){
void *buff;
int size;
setviewport(x1,y1,x1+w,y1+h,1);
size=imagesize(0,0,w,h);
buff=malloc(size);
getimage(0,0,w,h,buff);
return buff;
}