• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

C语言菜单源程序

发布: 2007-6-08 22:43 | 作者: seanhe | 来源: | 查看: 46次 | 进入软件测试论坛讨论

领测软件测试网
(根据楼下朋友提示修改后的,编译无错误)

#include <curses.h> 
#include <stdlib.h> 
#define ESC 27 
#define ENTER 10 

#define ITEM_NUM_1 3 
#define ITEM_NUM_2 2 
#define ITEM_NUM_3 3 
#define ITEM_NUM_4 4 

#define ITEM_NO_1 1 
#define ITEM_NO_2 2 
#define ITEM_NO_3 3 
#define ITEM_NO_4 4 

void init_curses(void); 
void Draw_menuhead(WINDOW *menuhead); 
WINDOW **Draw_menu(int start_cols,int itemNo); 
int view_menu(WINDOW **items,/*int itemNum,*/int start_cols,int itemNo); 
void Del_menu(WINDOW **items,int itemNum); 
int item_num(int itemNo); 

main() 

WINDOW *menuhead,*message; 
WINDOW **items;/*菜单项目指针,数组元素指向菜单项子项*/ 
int Key; 
int count;/*菜单子项的数目*/ 
int Re_item;/*菜单浏览返回值*/ 

init_curses(); 

wbkgd(stdscr,COLOR_PAIR(1)); 
menuhead=subwin(stdscr,1,80,0,0); 
message=subwin(stdscr,1,79,23,1); 

Draw_menuhead(menuhead);/*绘制菜单头部*/ 
move(2,1); 
printw("Please F1--F4 Select Menu..."); 
move(3,1); 
printw("Please ESC Quit..."); 
do { 
Key=getch(); 
switch(Key) { 
case KEY_F(1): 
items=Draw_menu(3,ITEM_NO_1);/*第3列,第1菜单*/ 
Re_item=view_menu(items,/*ITEM_NUM_1,*/3,ITEM_NO_1); 
touchwin(stdscr); 
refresh(); 
break; 
case KEY_F(2): 
items=Draw_menu(23,ITEM_NO_2);/*第23列,第2菜单*/ 
Re_item=view_menu(items,/*ITEM_NUM_2,*/23,ITEM_NO_2); 
touchwin(stdscr); 
refresh(); 
break; 

case KEY_F(3): 
items=Draw_menu(43,ITEM_NO_3);/*第43列,第3菜单*/ 
Re_item=view_menu(items,/*ITEM_NUM_3,*/43,ITEM_NO_3); 
touchwin(stdscr); 
refresh(); 
break; 
case KEY_F(4): 
items=Draw_menu(63,ITEM_NO_4);/*第63列,第4菜单*/ 
Re_item=view_menu(items,/*ITEM_NUM_4,*/63,ITEM_NO_4); 
touchwin(stdscr); 
refresh(); 
break; 
default: break; 

} while(Key!=ESC); 

delwin(message); 
delwin(menuhead); 
endwin(); 
exit(0); 


void Draw_menuhead(WINDOW *menuhead) 

wbkgd(menuhead,COLOR_PAIR(2)); 
wrefresh(menuhead); 
wmove(menuhead,0,0); 
waddstr(menuhead,"菜单1"); 
wattron(menuhead,COLOR_PAIR(3)); 
waddstr(menuhead,"(F1)"); 
wattroff(menuhead,COLOR_PAIR(3)); 
wmove(menuhead,0,20); 
waddstr(menuhead,"菜单2"); 
wattron(menuhead,COLOR_PAIR(3)); 
waddstr(menuhead,"(F2)"); 
wattroff(menuhead,COLOR_PAIR(3)); 
wmove(menuhead,0,40); 
waddstr(menuhead,"菜单3"); 
wattron(menuhead,COLOR_PAIR(3)); 
waddstr(menuhead,"F(3)"); 
wattroff(menuhead,COLOR_PAIR(3)); 
wmove(menuhead,0,60); 
waddstr(menuhead,"菜单4"); 
wattron(menuhead,COLOR_PAIR(3)); 
waddstr(menuhead,"F(4)"); 
wattroff(menuhead,COLOR_PAIR(3)); 


void init_curses(void) 

initscr(); 
noecho(); 
keypad(stdscr,TRUE); 
/*intrflush(stdscr,FALSE);*/ 
start_color(); /*初始化*/ 
init_pair(1,COLOR_WHITE,COLOR_BLUE); 
init_pair(2,COLOR_BLUE,COLOR_WHITE); 
init_pair(3,COLOR_RED,COLOR_WHITE); 

curs_set(0); /*设置光标不可见*/ 


WINDOW **Draw_menu(int start_cols,int itemNo) 

WINDOW **items; 

switch(itemNo) { 
case 1: 
items=(WINDOW **)malloc((ITEM_NUM_1+1)*sizeof(WINDOW *)); 

items[0]=newwin(ITEM_NUM_1+2,19,1,start_cols); 
wbkgd(items[0],COLOR_PAIR(2)); 
box(items[0],ACS_VLINE,ACS_HLINE); 

items[1]=subwin(items[0],1,17,2,start_cols+1); 
wprintw(items[1],"子项A1"); 
items[2]=subwin(items[0],1,17,3,start_cols+1); 
wprintw(items[2],"子项A2"); 
items[3]=subwin(items[0],1,17,4,start_cols+1); 
wprintw(items[3],"子项A3"); 
/* items[4]=subwin(items[0],1,17,5,start_cols+1); 
wprintw(items[4],"子项A4");*/ 
break; 
case 2: 
items=(WINDOW **)malloc((ITEM_NUM_2+1)*sizeof(WINDOW *)); 

items[0]=newwin(ITEM_NUM_2+2,19,1,start_cols); 
wbkgd(items[0],COLOR_PAIR(2)); 
box(items[0],ACS_VLINE,ACS_HLINE); 

items[1]=subwin(items[0],1,17,2,start_cols+1); 
wprintw(items[1],"子项B1"); 
items[2]=subwin(items[0],1,17,3,start_cols+1); 
wprintw(items[2],"子项B2"); 
/* items[3]=subwin(items[0],1,17,4,start_cols+1); 
wprintw(items[3],"子项B3"); 
items[4]=subwin(items[0],1,17,5,start_cols+1); 
wprintw(items[4],"子项B4");*/ 
break; 
case 3: 
items=(WINDOW **)malloc((ITEM_NUM_3+1)*sizeof(WINDOW *)); 

items[0]=newwin(ITEM_NUM_3+2,19,1,start_cols); 
wbkgd(items[0],COLOR_PAIR(2)); 
box(items[0],ACS_VLINE,ACS_HLINE); 

items[1]=subwin(items[0],1,17,2,start_cols+1); 
wprintw(items[1],"子项C1"); 
items[2]=subwin(items[0],1,17,3,start_cols+1); 
wprintw(items[2],"子项C2"); 
items[3]=subwin(items[0],1,17,4,start_cols+1); 
wprintw(items[3],"子项C3"); 
/* items[4]=subwin(items[0],1,17,5,start_cols+1); 
wprintw(items[4],"子项C4");*/ 
break; 
case 4: 
items=(WINDOW **)malloc((ITEM_NUM_4+1)*sizeof(WINDOW *)); 

items[0]=newwin(ITEM_NUM_4+2,19,1,start_cols); 
wbkgd(items[0],COLOR_PAIR(2)); 
box(items[0],ACS_VLINE,ACS_HLINE); 

items[1]=subwin(items[0],1,17,2,start_cols+1); 
wprintw(items[1],"子项D1"); 
items[2]=subwin(items[0],1,17,3,start_cols+1); 
wprintw(items[2],"子项D2"); 
items[3]=subwin(items[0],1,17,4,start_cols+1); 
wprintw(items[3],"子项D3"); 
items[4]=subwin(items[0],1,17,5,start_cols+1); 
wprintw(items[4],"子项D4"); 
break; 
default: break; 

wbkgd(items[1],COLOR_PAIR(1)); 
wrefresh(items[0]); 
return items; 


view_menu(WINDOW **items,/*int itemNum,*/int start_cols,int itemNo) 

int select=0;/*适应求余算法,0--itemNum-1,对应1--itemNum*/ 
int Key; 
int itemNum; 

itemNo=itemNo-1;/*适应求余算法,0--3对应1--4*/ 
wrefresh(items[0]); 
A1: 
itemNum=item_num(itemNo+1); 
while(1) { 
Key=getch(); 
if(Key==KEY_DOWN || Key==KEY_UP) { 
wbkgd(items[select+1],COLOR_PAIR(2)); 
wnoutrefresh(items[select+1]); 
if (Key==KEY_DOWN) 
select=(select+1) % itemNum; 
else 
select=(select+itemNum-1) % itemNum; 
wbkgd(items[select+1],COLOR_PAIR(1)); 
wnoutrefresh(items[select+1]);/*select+1为第几项目1/2/3../itemNum*/ 
doupdate(); 

else { 
if (Key==KEY_LEFT || Key==KEY_RIGHT) { 
Del_menu(items,itemNum+1); 
touchwin(stdscr); 
refresh(); 
if (Key==KEY_RIGHT) 
if (start_cols<63){ 
itemNo=(itemNo+1) % 4; /*4: 一共4个菜单*/ 
start_cols=start_cols+20; /*20: 菜单之间原点间隔数*/ 

else{ 
itemNo=0; 
start_cols=3; 

else 
if (start_cols>3) { 
itemNo=(itemNo+4-1) % 4; 
start_cols=start_cols-20; 

else { 
itemNo=3; 
start_cols=63; 


items=Draw_menu(start_cols,itemNo+1);/*itemNo+1为菜单号1\2\3\4*/ 
select=0; 

goto A1; 
/*return view_menu(items,4,start_cols); */ 

if (Key==ESC) return -1; 
else 
if (Key==ENTER){ 
return 1; /* */ 






void Del_menu(WINDOW **items,int itemNum) 

int i; 
for (i=0;i<itemNum;i++) 

delwin(items[i]); 
free(items); 

}


item_num(int itemNo)/*根据菜单号找出对应项目数*/ 

switch(itemNo) { 
case 1: return ITEM_NUM_1; 
case 2: return ITEM_NUM_2; 
case 3: return ITEM_NUM_3; 
case 4: return ITEM_NUM_4; 

}

 jysww 回复于:2003-02-19 22:14:52
建议放到精华区吧!

 sdccf 回复于:2003-02-19 22:21:51
已在精华区.

 007xiong 回复于:2003-04-23 22:22:33
请问:哪里来的delwin函数?
谢谢!!

 geekchi 回复于:2003-04-25 12:56:18
请问:哪里来的delwin函数? 
谢谢!!

curses 中有

 guyp 回复于:2003-08-08 17:47:40
请问大侠们有没有多用户权限登录功能?

 kunrong 回复于:2003-09-25 09:13:17
程序最后有一行for (i=0;i delwin(items[i]); 有错误,
是否应改为for(i=0;i<delwin(items[i]);i++)  
我是初学,这样改后能编译后运行,但不敢保证完全正确,请各位指教!

 hseng 回复于:2004-01-05 12:09:40
void Del_menu(WINDOW **items,int itemNum) 

int i; 
for (i=0;i<itemNum;i++)
{
delwin(items[i]);
free(items); 
}
}

 zxczxc2005 回复于:2005-07-27 17:52:33
up

 yutian 回复于:2005-07-28 10:03:38
好东东

 zch 回复于:2005-08-05 08:54:01


 snow888 回复于:2005-08-07 14:38:00
好复杂!
没有必要这样做啊!
可以将菜单的显示项 Item 和调用项 proc 放入指针中,程序运行要快得多,而且程序代码也要简洁得多。
我经常这样做?
至于说上面用到的函数均是 C 中的标准窗口函数,必须要用到
#include <curses.h>
编译时必须用 -lcurses 参数

 sunlan 回复于:2005-08-07 22:45:01
可以作为示例,但在函数的封装、对二次开发的支持上还有欠缺。
应该再增加菜单的数据结构的定义。下面是我开发的一套字符界面开发库中对于菜单的一些定义,大家可以一起探讨一下:
[code:1:572e30830b]
/*********************************************
    MENU defines
*********************************************/

#define ITEM_NAME_MAX   20
#define ITEM_DESC_MAX   40

#define ITEM_LEVEL_0    0   /* no sub menu */
#define ITEM_LEVEL_1    1   /* have sub menu */
#define ITEM_SEPARATOR  -1  /* separate item */

#define MENU_QUIT   MAX_MENU_COMMAND+1
#define MENU_SELECT     MAX_MENU_COMMAND+2
#define REQ_P_LEFT_ITEM     MAX_MENU_COMMAND+3  /* left item of parent
                             menu*/
#define REQ_P_RIGHT_ITEM    MAX_MENU_COMMAND+4  /* right item of parent
                            menu */

typedef struct
{
    unsigned int id;
    char name[ITEM_NAME_MAX+1];
    char discrep[ITEM_DESC_MAX+1];
    unsigned int level;
    void (*action)();   /*action when enter pressed*/
} SDKITEM;

typedef struct SDKMENU
{
    WINDOW *win;        /*menu is in this window*/
    int begin_y,begin_x;    /*menu's top_left conner position*/
    int item_num;       /*menu's item number*/
    int item_curr;      /*current item index of the menu*/
    ITEM **items;
    MENU *border;
    SDKITEM *iteminfo;
    struct SDKMENU *parent; /*submenu's parent,
                if it's mainmenu parent==NULL
                */
} SDKMENU;

[/code:1:572e30830b]

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网