(根据楼下朋友提示修改后的,编译无错误)
#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/