*/ --------------------------------------------------------------------------------------
*/ 出自: 编程中国 http://www.bc-cn.net
*/ 作者: kxhui QQ:200885811
*/ 时间: 2007-10-30 编程论坛首发
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------
C语言菜单编程,
初学C语言,请大家多多指点。
//=====================================================
// 程序:Menu v1.0 (C语言版)
// 时间:2007-10-28
// 作者:kxhui
//=====================================================
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#define ESC_KEY 1
#define UP_KEY 72
#define DOWN_KEY 80
#define LEFT_KEY 75
#define RIGHT_KEY 77
#define ENTER_KEY 28
#define IDENTER 1
#define IDCLOSE 0
#define ID_FILE 1
#define ID_NEW 0
#define ID_OPEN 1
#define ID_EXIT 2
#define ID_EDIT 2
#define ID_CUT 0
#define ID_COPY 1
#define ID_PASTE 2
#define BG_COLOR 2
#define XLMENU_SEL_COLOR 4
#define XLMENU_BG_COLOR 9
void MsgBox(char *msg);
void ircmd_exit(void);
void ircmd_up(void);
void ircmd_down(void);
void ircmd_left(void);
void ircmd_right(void);
void ircmd_select(void);
void K_Button();
void Window(char *pch, int x, int y, int w, int h,int color);
void DMenu();
void XLMenu();
void Set_Button();
void clsMsg();
int sbf = 1; // 消息框按钮
int sif = 0; // 子菜单
int szf = 0; // 主菜单
int menu_onoff = 0;
int Msg_onoff = 0;
int Msgx,Msgy,Msgw,Msgh;
char *Button[2] = {"Enter","Close"};
char *Menu[][4]=
{
{"File","Open","Save","Exit",},
{"Edit","Cut","Copy","Paste"}
};
//===========================================================
// 读按键码
//===========================================================
int get_key()
{
union REGS rg;
rg.h.ah=0;
int86(0x16,&rg,&rg);
return rg.h.ah;
}
//===========================================================
// 初始化显示
//===========================================================
void init()
{
/* request auto detection */
int gdriver = DETECT, gmode, errorcode;
registerbgidriver(EGAVGA_driver);/*如果没有连接图库,可删去此行*/
/* initialize graphics and local variables */
initgraph(&gdriver,&gmode,"");
errorcode = graphresult();
if (errorcode != grOk) /* an error occurred */
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1); /* terminate with an error code */
}
}
int main(void)
{
int key;
Msgx = Msgy = Msgw = Msgh = 0;
init();
Window("Menu v1.0",0,0,getmaxx(),getmaxy(),15);
while(1)
{
key = get_key();
switch(key)
{
case ESC_KEY:
if(Msg_onoff) //消息框已经打开
clsMsg();
else
ircmd_exit();
break;
case UP_KEY:
ircmd_up();
break;
case DOWN_KEY:
ircmd_down();
break;
case LEFT_KEY:
ircmd_left();
break;
case RIGHT_KEY:
ircmd_right();
break;
case ENTER_KEY:
ircmd_select();
break;
}
}
getch();
closegraph();
return 0;
}
//===========================================================
// 主窗口
//===========================================================
void Window(char *pt, int x, int y, int w, int h,int color)
{
setfillstyle(1,BG_COLOR);
/* fill a bar */
bar3d(x, y, w, h, 0, 0);
//标题字体颜色
setcolor(4);
outtextxy(10, 7, pt);
//设置主窗口颜色
setcolor(color);
//画一条直线,标题栏
line(0, 20,w,20);
//画矩形,主窗口
rectangle(x,y,w,h);
rectangle(x+2,y+2,w-2,20-2);
line(0, 40,getmaxx(),40);
DMenu();
}
//===========================================================
// 主菜单
//===========================================================
void DMenu()
{
int i;
for(i = 0; i < 2; i++)
{
if(szf == (i+1)) //选中项,调整颜色
setcolor(4);
else
setcolor(15);
outtextxy(15+60*i, 20+7, Menu[i][0]);
rectangle(2+60*i,22,60*(i+1),38);
}
}
//===========================================================
// 退出
//===========================================================
void ircmd_exit(void)
{
MsgBox("Exit?");
}
//===========================================================
// 上键
//===========================================================
void ircmd_up(void)
{
if(sif == 0)
{
//szf = 1;
menu_onoff = 1;
DMenu();
XLMenu();
}
if(sif > 0)
{
sif --;
XLMenu();
}
}
//===========================================================
// 下键
//===========================================================
void ircmd_down(void)
{
if(sif < 2)
{
if(menu_onoff)
sif = 0;
else
sif ++;
menu_onoff = 0;
XLMenu();
}
}
//===========================================================
// 左键
//===========================================================
void ircmd_left(void)
{
sif = 0;
if(Msg_onoff)
{
if(sbf > 1)
sbf --;
Set_Button();
}
else if(szf > 1)
{
szf --;
DMenu();
XLMenu();
}
}
//===========================================================
// 右键
//===========================================================
void ircmd_right(void)
{
sif = 0;
if(Msg_onoff)
{
if(sbf < 2)
sbf ++;
Set_Button();
}
else if(szf < 2)
{
szf ++;
DMenu();
XLMenu();
}
}
//===========================================================
// 确定键
//===========================================================
void ircmd_select(void)
{
if(Msg_onoff)//消息框获取焦点
{
if(sbf == IDENTER)
{
closegraph();
exit(1);
}
else
{
clsMsg();
}
}
else if((szf == ID_FILE) && (sif == ID_EXIT))
{
ircmd_exit();
}
}
//===========================================================
// 弹出式消息框
//===========================================================
void MsgBox(char *msg)
{
int x,y,w,h;
int id = 1;
Msg_onoff = 1;
Msgx = getmaxx()/2-100;
Msgy = getmaxy()/2-50;
Msgw = Msgx ;
Msgh = Msgy ;
outtextxy(Msgx + 5, Msgy + 4, " Msg..."); //标题
outtextxy(Msgx + (Msgw-textwidth(msg)) / 2, Msgh + 5 + 20, msg);
rectangle(Msgx, Msgy, Msgw + 200, Msgh + 100);
rectangle(Msgx - 2,Msgy - 2,Msgw + 200 + 2,Msgh + 100 + 2);
rectangle(Msgx, Msgy, Msgw + 200, Msgh + 15);
//按钮选项
Set_Button();
}
//===========================================================
// 按钮选项
//===========================================================
void Set_Button()
{
int i;
for(i = 0; i < 2; i++)
{
if(sbf == (i+1)) //选中项,调整颜色
setcolor(4);
else
setcolor(15);
outtextxy(Msgx + 80 * (i + 1) - 20 * i + 5, Msgy + 102 - 27 + 5, Button[i]); //标题
rectangle(Msgx + 80 * (i + 1) - 20 * i, Msgy + 102 - 10, Msgx + 80 + 48 * (i + 1) + 12 * i, Msgy + 102 - 27);
}
}
//===========================================================
// 下拉菜单
//===========================================================
void XLMenu()
{
int i;
//刷新显示
setcolor(BG_COLOR);
setfillstyle(1,BG_COLOR);
bar3d(2, 42, 80*2, 42+18*3, 0, 0);
setcolor(15);
if(!menu_onoff)
{
for (i = 0; i < (sizeof(Menu)>>2) -1; i++)
{
setfillstyle(1,XLMENU_BG_COLOR);
if(szf == ID_FILE)
{
if(sif == i) //选中项,调整颜色
setfillstyle(1,XLMENU_SEL_COLOR);
bar3d(2, 42+18*i, 80, 42+18*(i+1), 0, 0);
outtextxy(25, 42+18*(i+1) - 12, Menu[0][i+1]);
}
else if(szf == ID_EDIT)
{
if(sif == i) //选中项,调整颜色
setfillstyle(1,XLMENU_SEL_COLOR);
bar3d(60+2, 42+18*i, 60+80, 42+18*(i+1), 0, 0);
outtextxy(60+25, 42+18*(i+1) - 12, Menu[1][i+1]);
}
}
}
}
//===========================================================
// 清消息框
//===========================================================
void clsMsg()
{
Msg_onoff = 0;
setcolor(BG_COLOR);
setfillstyle(1,BG_COLOR);
bar3d(getmaxx()/2-100-2, getmaxy()/2-50-2, getmaxx()/2+100+2,getmaxy()/2+50+2, 0, 0);
}