| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 325 人关注过本帖
标题:[原创]C语言菜单编程
只看楼主 加入收藏
kxhui
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2007-10-26
收藏
 问题点数:0 回复次数:1 
[原创]C语言菜单编程

*/ --------------------------------------------------------------------------------------
*/ 出自: 编程中国 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);
}

搜索更多相关主题的帖子: C语言 菜单 
2007-10-30 00:37
chen17981
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2007-10-26
收藏
得分:0 
你想说明什么?

2007-10-30 06:41
快速回复:[原创]C语言菜单编程
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025014 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved