📄 图形式下拉菜单.txt
字号:
#include <graphics.h>
#include <alloc.h>
#include <process.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <dos.h>
#include <bios.h>
#include <conio.h>
#include <ctype.h>
#define INSERT 0x5200
#define ESC 0x001b
#define TAB 0x0f09
#define RETURN 0x000d
#define RIGHT 0x4d00
#define LEFT 0x4b00
#define UP 0x4800
#define DOWN 0x5000
#define ALT_X 11520
#define INUM 10
typedef struct menu
{
int coor[4]; /*定义子菜单的坐标位置*/
int itemcoor[4*INUM];
int itemdispxy[2*INUM];
int select;
int itemnum; /*定义菜单中包含多少项*/
char **itemname;
int COMMAND_ID[INUM];
}MENUTYPE;
static char *MainMenuItem[]={"File","Export","Import","Search","Grade","Change",0};
static char *SubMenuItem1[]={"New File","Load File","Last File","Quit",0};
static char *SubMenuItem2[]={"All Data","All Mark","Order","Chart",0};
static char *SubMenuItem3[]={"Datas","Marks",0};
static char *SubMenuItem4[]={"By Name","By Num",0};
static char *SubMenuItem5[]={"Good","Bad",0};
static char *SubMenuItem6[]={"Delect","Modify",0};
void initialgraphics(void);
void loadmainmenu(void);
void loadsubcoor(void);
void loadsubmenu(char **name,int ord);
int managesubmenu(void);
void managemainmenu(void);
void displaymainmenu(void);
int displaysubmenu(int ord);
void help_page_show(void){return;};
void exitmenu(int);
void in_activemainmenuitem(int select ,int in_active);
void in_activesubmenuitem(int ord ,int select,int in_active);
int getkey(void);
void funcproc(int id);
MENUTYPE mainmenu,submenu[INUM]; /*mainmenu.select是你当前选择的主菜单值*/
int maxx,texth,textw;
void *menuimagebuf;
/********************************************************************/
struct student
{long int num;
char name[20];
int class;
char sex[7];
int age;
char add[30];
long int tel;
};
struct mark
{long int num;
char name[20];
float court[5];
float aver;
};
void begin(void);
void end(void);
void load(char *fname);
void new_old_file(void);
void lookfile(void);
void all_mark(void);
void all_data(void);
void order(void);
void subchart(void);
void modify_data(void);
void modify_mark(void);
void savedata(struct student stu_data[10]);
void loaddata(struct student dnote[10]);
void savemark(struct mark stu_mark[10]);
void loadmark(struct mark mnote[10]);
void searchname(void);
void searchnum(void);
void data(struct student dnote[10]);
void mark(struct mark mnote[10]);
void students_mark(struct mark mnote[10]);
void good(void);
void bad(void);
void modify(void);
void delect(void);
void clearblue(void);
static char d[20]={"d:\\tc\\w\\data1"}; /*使用说明必须先在c:\\tc\\下建立一个w文件夹*/
static char m[20]={"d:\\tc\\w\\mark1"};
/*********************************************************************************/
void main(void)
{
initialgraphics(); /*系统初始化*/
/*begin();*/
/*loadmainmenu();*/
loadsubcoor();
managemainmenu();
}
/*******************************************************/
void managemainmenu(void)
{
unsigned key;
int id;
displaymainmenu();
for (key=0;;) /*无限循环内部有开口*/
{
key=getkey();
switch(key)
{
case LEFT : in_activemainmenuitem(mainmenu.select,0); /*0表示将结束对它的选择*/
if (mainmenu.select<1)
mainmenu.select=mainmenu.itemnum-1;
else mainmenu.select--;
in_activemainmenuitem(mainmenu.select,1); break;
case RIGHT :in_activemainmenuitem(mainmenu.select,0);
if (mainmenu.select>mainmenu.itemnum-2) /*如果在最后一项选择它则回到第一项*/
mainmenu.select=0;
else mainmenu.select++;
in_activemainmenuitem(mainmenu.select,1);break;
case DOWN :
case RETURN :
id=managesubmenu();
if (id>=0) funcproc(id);
break;
}
}
}
/************************************************************************/
void funcproc(int id)
{
switch (id)
{case 0: new_old_file();break;
case 1: new_old_file();break;
case 2: lookfile();break;
case 3: end();exit(0);
case 100: all_data();break;
case 101: all_mark();break;
case 102: order();break;
case 103: subchart();break;
case 200: modify_data();break;
case 201: modify_mark();break;
case 300: searchname();break;
case 301: searchnum();break;
case 400: good();break;
case 401: bad();break;
case 500: delect();break;
case 501: modify();break;
default:
break;
}
}
/***********************************/
int managesubmenu(void)
{
MENUTYPE *mn=&submenu[mainmenu.select];
unsigned key;
if (displaysubmenu(mainmenu.select)) return -2; /*如果子菜单显示不成功返回-2*/
for (key=0;;)
{
key=getkey();
switch(key)
{
case ESC:exitmenu(mainmenu.select);
return -1;
case UP:in_activesubmenuitem(mainmenu.select,mn->select,0);
if (mn->select>0)
mn->select--;
else mn->select=mn->itemnum-1;
in_activesubmenuitem(mainmenu.select,mn->select,1);break;
case DOWN:in_activesubmenuitem(mainmenu.select,mn->select,0);
if (mn->select<mn->itemnum-1) mn->select++;
else mn->select=0;
in_activesubmenuitem(mainmenu.select,mn->select,1);break;
case LEFT:exitmenu(mainmenu.select);
in_activemainmenuitem(mainmenu.select,0);
if (mainmenu.select<1) mainmenu.select=mainmenu.itemnum-1;
else mainmenu.select--;
in_activemainmenuitem(mainmenu.select,1);
if (displaysubmenu(mainmenu.select)) return -2;
mn=&submenu[mainmenu.select];
break;
case RIGHT:exitmenu(mainmenu.select);
in_activemainmenuitem (mainmenu.select,0);
if (mainmenu.select>mainmenu.itemnum-2) mainmenu.select=0;
else mainmenu.select++;
in_activemainmenuitem(mainmenu.select,1);
if (displaysubmenu(mainmenu.select)) return -2;
mn=&submenu[mainmenu.select];
break;
case RETURN:exitmenu(mainmenu.select);
return mn->COMMAND_ID[mn->select];
}
}
}
/*********************************************************************/
void loadmainmenu(void)
{ int i;
mainmenu.itemnum=6; /*设置菜单中有6项*/
for (i=0;i<6;i++)
mainmenu.COMMAND_ID[i]=i;
mainmenu.itemname=MainMenuItem; /*给指针付地址主菜单的6项*/
}
/**********************************************************************/
void loadsubcoor(void) /*在该函数中将submenu[i].COMMAND_ID[j]覆值特定值以便由它来判断执行何函数*/
{int i,j,k;
submenu[0].itemname=SubMenuItem1;
submenu[1].itemname=SubMenuItem2;
submenu[2].itemname=SubMenuItem3;
submenu[3].itemname=SubMenuItem4;
submenu[4].itemname=SubMenuItem5;
submenu[5].itemname=SubMenuItem6;
for(i=0;i<2;i++)
{submenu[i].coor[0]=30+i*100;
submenu[i].coor[1]=105;
submenu[i].coor[2]=130+i*100;
submenu[i].coor[3]=169;
}
for(i=2;i<6;i++)
{submenu[i].coor[0]=30+i*100;
submenu[i].coor[1]=105;
submenu[i].coor[2]=130+i*100;
submenu[i].coor[3]=137;
}
for(j=0;j<2;j++)
for(i=0;i<6;i++)
{submenu[i].itemcoor[j*4]=30+i*100;
submenu[i].itemcoor[j*4+1]=105+j*16;
submenu[i].itemcoor[j*4+2]=130+i*100;
submenu[i].itemcoor[j*4+3]=105+j*16+16;
submenu[i].itemdispxy[j*2]=(submenu[i].itemcoor[j*4]+submenu[i].itemcoor[j*4+2])/2;
submenu[i].itemdispxy[j*2+1]=(submenu[i].itemcoor[j*4+1]+submenu[i].itemcoor[j*4+3])/2;
submenu[i].COMMAND_ID[j]=i*100+j;
}
for(j=2;j<4;j++)
for(i=0;i<2;i++)
{submenu[i].itemcoor[j*4]=30+i*100;
submenu[i].itemcoor[j*4+1]=105+j*16;
submenu[i].itemcoor[j*4+2]=130+i*100;
submenu[i].itemcoor[j*4+3]=105+j*16+16;
submenu[i].itemdispxy[j*2]=(submenu[i].itemcoor[j*4]+submenu[i].itemcoor[j*4+2])/2;
submenu[i].itemdispxy[j*2+1]=(submenu[i].itemcoor[j*4+1]+submenu[i].itemcoor[j*4+3])/2;
submenu[i].COMMAND_ID[j]=i*100+j;
}
submenu[0].itemnum=submenu[1].itemnum=4;
for(k=2;k<6;k++)
submenu[k].itemnum=2;
}
/***************************************************************/
void displaymainmenu(void)
{
int i;
cleardevice();
setbkcolor(BLUE);
setcolor(LIGHTRED);
rectangle(0,0,getmaxx(),getmaxy());
setcolor(WHITE);
setfillstyle(SOLID_FILL,CYAN);
setlinestyle(0,GREEN,30);
bar3d(0,55,634,104,5,3);
for(i=0;i<6;i++)
{
setfillstyle(SOLID_FILL,GREEN);
fillellipse(70+i*100,77,40,15);
}
setcolor(LIGHTRED);
for (i=0;i<mainmenu.itemnum;i++)
{
if (mainmenu.select==i)
in_activemainmenuitem(i,1);
else setcolor(BLACK);
settextstyle(0,0,1);
settextjustify(1,1);
outtextxy(70+i*100,77,mainmenu.itemname[i]);
}
setfillstyle(SOLID_FILL,GREEN);
bar3d(0,460,635,477,5,1);
setcolor(YELLOW);
settextstyle(3,HORIZ_DIR,4);
settextjustify(1,1);
outtextxy(320,27,"Student Datas Managing System");
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
settextjustify(LEFT_TEXT,CENTER_TEXT);
outtextxy(100,468,"Alt-x :exit ESC :return the last menu");
setcolor(RED);line(0,104,639,104);
}
/*******************************************************************/
int displaysubmenu(int ord) /*ord值为你当前选择值*/
{ /*调用成功返回0*/
unsigned size,i;
MENUTYPE *mn=&submenu[ord];
size=imagesize(mn->coor[0],mn->coor[1],mn->coor[2],mn->coor[3]);
if (NULL==(menuimagebuf=(unsigned char *)malloc(size)))
{
clearviewport();
outtextxy(100,100,"Out of memroy!");
outtextxy(100,110,"Press any key...");
getch();
return 1;
}
getimage (mn->coor[0],mn->coor[1],mn->coor[2],mn->coor[3],menuimagebuf);
setcolor (WHITE);
setfillstyle(SOLID_FILL,CYAN);
bar3d(mn->coor[0],mn->coor[1],mn->coor[2],mn->coor[3],0,0);
for (i=0;i<mn->itemnum;i++)
{
if (i==mn->select) in_activesubmenuitem(ord,i,1);
else
{setcolor(YELLOW);
settextstyle(0,0,1);
settextjustify(1,1);
outtextxy(mn->itemdispxy[i*2],mn->itemdispxy[i*2+1],mn->itemname[i]);
}
}
return 0;
}
/**************************************************************************/
static void exitmenu(int ord)
{
MENUTYPE *mn=&submenu[ord];
if (menuimagebuf)
{
putimage(mn->coor[0],mn->coor[1],menuimagebuf,COPY_PUT);
free(menuimagebuf);
}
}
/*************************************************************/
void in_activemainmenuitem(int select,int in_active)
{
if(in_active==0)
{
setfillstyle (SOLID_FILL,GREEN);
fillellipse(70+select*100,77,40,15);
setcolor(BLACK);
settextstyle(0,0,1);
settextjustify(1,1);
outtextxy(70+select*100,77,mainmenu.itemname[select]);
}
else
{
setfillstyle(SOLID_FILL,RED);
fillellipse(70+select*100,77,40,15);
setcolor(YELLOW);
settextstyle(0,0,1);
settextjustify(1,1);
outtextxy(70+select*100,77,mainmenu.itemname[select]);
}
}
/************************************************************/
void in_activesubmenuitem(int ord,int select,int in_active)
{
MENUTYPE *tp=&submenu[ord];
int start,end ,bot,top;
start=tp->itemcoor[select*4]+2;
top=tp->itemcoor[select*4+1]+1;
end=tp->itemcoor[select*4+2]-2;
bot=tp->itemcoor[select*4+3]-1;
if (in_active==0)
{
setfillstyle (SOLID_FILL,CYAN);
bar(start,top,end,bot);
setcolor(YELLOW);
settextstyle(0,0,1);
settextjustify(1,1);
outtextxy(tp->itemdispxy[select*2],tp->itemdispxy[select*2+1],tp->itemname[select]);
}
else
{
setfillstyle(SOLID_FILL,RED);
bar(start,top,end,bot);
setcolor(YELLOW);
settextstyle(0,0,1);
settextjustify(1,1);
outtextxy(tp->itemdispxy[select*2],tp->itemdispxy[select*2+1],tp->itemname[select]);
}
}
/*************************************/
void initialgraphics(void)
{
int driver=VGA,mode=VGAHI;
int errorcode;
initgraph(&driver,&mode,"d:\\tc");
errorcode=graphresult();
if (errorcode!=grOk)
{
printf ("Graphics error:%s\n",grapherrormsg(errorcode));
printf ("Press any key to halt:");
getch();
}
setbkcolor(BLUE);
}
/******************************************/
int getkey(void)
{
int key;
key=bioskey(0);
if (key==ALT_X)
end();
else if (key<<8)
{
key=key&0x00ff;
if (isalpha(key)) /*验证key是否为字母若是其他的返回零*/
key=toupper(key); /*若是字母将其变为大写的若是其他的不变*/
}
return (key);
}
/*********************************************/
void data(struct student dnote[10])
{int i;
for(i=0;i<10;i++) /*将student数据清零*/
{dnote[i].num=0;
strcpy(dnote[i].name,"\0");
strcpy(dnote[i].sex,"\0");
dnote[i].age=0;
strcpy(dnote[i].add,"\0");
dnote[i].tel=0;
}
}
/****************************************************/
void mark(struct mark mnote[10])
{int i,j;
for(i=0;i<10;i++)
{mnote[i].num=0;
strcpy(mnote[i].name,"\0"); /*将mark数据清零*/
for(j=0;j<5;j++)
mnote[i].court[j]=0.0;
mnote[i].aver=0.0;
}
}
/******************************************************/
/*modify_data fuction */ /* here use stu_data[10] */
void modify_data(void)
{ char *dataitem[]={"Number","Name","Class(1--3)","Sex","Age","Address","Telephone"};
char flagsave,flagsure,tt[40];
int i,flagcontinue,j=0;
unsigned size;
void *pinfo=NULL;
struct student temp,stu_data[10];
data(stu_data);
clearblue();
setcolor(RED);
setfillstyle(SOLID_FILL,LIGHTGRAY);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,1);
settextjustify(RIGHT_TEXT,CENTER_TEXT);
bar(210,180,430,450);
for(i=0;i<7;i++)
{ outtextxy(320,190+i*30+15,dataitem[i]) ;
setfillstyle(SOLID_FILL,BLACK);
bar(323,177+i*30+15,420,180+i*30+37);
}
size=imagesize(210,180,430,450);
pinfo=malloc(size);
getimage(210,180,430,450,pinfo);
flagcontinue=1;
while(flagcontinue==1)
{ putimage(210,180,pinfo,COPY_PUT);
settextjustify(CENTER_TEXT,CENTER_TEXT);
setcolor(YELLOW);
outtextxy(290,150,"Please input the Information");
setcolor(RED);
{ gotoxy(42,13);
gets(tt);temp.num=atol(tt);
gotoxy(42,13+1*2);
gets(temp.name);
gotoxy(42,13+2*2);
gets(tt);temp.class=atoi(tt);
gotoxy(42,13+3*2);
gets(temp.sex);
gotoxy(42,13+4*2);
gets(tt);temp.age=atoi(tt);
gotoxy(42,13+5*2);
gets(temp.add);
gotoxy(42,13+6*2);
gets(tt);temp.tel=atol(tt);
}
clearblue();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -