Chinaunix首页 | 论坛 | 博客
  • 博客访问: 92240365
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: C/C++

2008-04-16 22:44:06

#include  
#include  
#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
delwin(items); 
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; 

}


/*编译命令: cc menu.c -o menu -lcurses  */
阅读(300) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~