linux ncurse 菜单

#include  < curses.h >
#include 
< stdlib.h >
#define  ENTER 10
#define  ESCAPE 27
void  init_curses()
{
       initscr();
       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);
       noecho();
       keypad(stdscr,TRUE);
}

void  draw_menubar(WINDOW  * menubar)
{
       wbkgd(menubar,COLOR_PAIR(
2));
       waddstr(menubar,
"第一个菜单");
       wattron(menubar,COLOR_PAIR(
3));
       waddstr(menubar,
"(F1)");
       wattroff(menubar,COLOR_PAIR(
3));
       wmove(menubar,
0,20);
       waddstr(menubar,
"第二个菜单");
       wattron(menubar,COLOR_PAIR(
3));
       waddstr(menubar,
"(F2)");
       wattroff(menubar,COLOR_PAIR(
3));
}

WINDOW 
** draw_menu( int  start_col)
{
       
int i;
       WINDOW 
**items;
       items
=(WINDOW **)malloc(9*sizeof(WINDOW *));

       items[
0]=newwin(10,19,1,start_col);
       wbkgd(items[
0],COLOR_PAIR(2));
       box(items[
0],ACS_VLINE,ACS_HLINE);
       items[
1]=subwin(items[0],1,17,2,start_col+1);
       items[
2]=subwin(items[0],1,17,3,start_col+1);
       items[
3]=subwin(items[0],1,17,4,start_col+1);
       items[
4]=subwin(items[0],1,17,5,start_col+1);
       items[
5]=subwin(items[0],1,17,6,start_col+1);
       items[
6]=subwin(items[0],1,17,7,start_col+1);
       items[
7]=subwin(items[0],1,17,8,start_col+1);
       items[
8]=subwin(items[0],1,17,9,start_col+1);
       
for (i=1;i<9;i++)
               wprintw(items[i],
"菜单项目%d",i);
       wbkgd(items[
1],COLOR_PAIR(1));
       wrefresh(items[
0]);
       
return items;
}

void  delete_menu(WINDOW  ** items, int  count)
{
       
int i;
       
for (i=0;i<count;i++)
               delwin(items[i]);
       free(items);
}

int  scroll_menu(WINDOW  ** items, int  count, int  menu_start_col)
{
       
int key;
       
int selected=0;
       
while (1{
               key
=getch();
               
if (key==KEY_DOWN || key==KEY_UP) {
                       wbkgd(items[selected
+1],COLOR_PAIR(2));
                       wnoutrefresh(items[selected
+1]);
                       
if (key==KEY_DOWN) {
                               selected
=(selected+1% count;
                       }
 else {
                               selected
=(selected+count-1% count;
                       }

                       wbkgd(items[selected
+1],COLOR_PAIR(1));
                       wnoutrefresh(items[selected
+1]);
                       doupdate();
               }
 else if (key==KEY_LEFT || key==KEY_RIGHT) {
                       delete_menu(items,count
+1);
                       touchwin(stdscr);
                       refresh();
                       items
=draw_menu(20-menu_start_col);
                       
return scroll_menu(items,8,20-menu_start_col);
               }
 else if (key==ESCAPE) {
                       
return -1;
               }
 else if (key==ENTER) {
                       
return selected;
               }

       }

}

int  main()
{
   
int key;
   WINDOW 
*menubar,*messagebar;
   
   init_curses();
   
   bkgd(COLOR_PAIR(
1));
   menubar
=subwin(stdscr,1,80,0,0);
   messagebar
=subwin(stdscr,1,79,23,1);
   draw_menubar(menubar);
   move(
2,1);
   printw(
"Press F1 or F2 to open the menus. ");
   printw(
"ESC quits.");
   refresh();

   
do {
       
int selected_item;
       WINDOW 
**menu_items;
       key
=getch();
       werase(messagebar);
       wrefresh(messagebar);
       
if (key==KEY_F(1)) {
           menu_items
=draw_menu(0);
           selected_item
=scroll_menu(menu_items,8,0);
           delete_menu(menu_items,
9);
           
if (selected_item<0)
               wprintw(messagebar,
"You haven't selected any item.");
           
else
               wprintw(messagebar,
                 
"You have selected menu item %d.",selected_item+1);
           touchwin(stdscr);
           refresh();
       }
 else if (key==KEY_F(2)) {
           menu_items
=draw_menu(20);
           selected_item
=scroll_menu(menu_items,8,20);
           delete_menu(menu_items,
9);
           
if (selected_item<0)
               wprintw(messagebar,
"You haven't selected any item.");
           
else
               wprintw(messagebar,
                 
"You have selected menu item %d.",selected_item+1);
           touchwin(stdscr);
           refresh();
       }

   }
 while (key!=ESCAPE);
   
   delwin(menubar);
   delwin(messagebar);
   endwin();
   
return 0;
}
编译链接:
gcc -o testmenu  testmenu.c -lncurses
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值