Ncurses学习经历(十二)菜单库

      菜单库对cureses 基础库进行了很好的扩展。你可以通过这个库所提供的函数方便的创建菜
单。如果你想让它更美观,可以定制它的显示效果。下面我们就来看看这个库。
菜单是一个用来帮助用户选择子菜单项的屏幕。简而言之,菜单就是一个菜单项的集合,使
你可以方便的从中选择相应的菜单命令。curses 菜单库还提供编制多选菜单的功能。有些
读者可能不了解多选菜单。这个我们稍后讨论,我们先来了解一下菜单库的基础知识。
17.1 基础知识
要创建菜单,你首先要建立菜单项,然后发送并显示菜单。接下来,所有处理用户响应的工
作就交给功能强大的menu_driver()函数来完成。这个函数是整个菜单库的核心。
一个菜单程序大致的控制流程如下:
1. 初始化curses。
2. 用函数new_item()创建菜单项,同时为菜单项指定名称并且描述其相应的功能。
3. 用函数new_menu()创建菜单,同时指定要添加的菜单项。
4. 用函数post_menu()递送菜单并刷新屏幕
5. 用一个循环处理用户的菜单请求。并用menu_driver()函数对菜单做必要的更新。
6. 用unpost_menu()取消菜单递送。
7. 用free_menu()释放分配给菜单的内存
8. 用free_item()释放分配给菜单项的内存
9. 结束curses

现在我们看一个简单菜单的示例程序,它是用方向键来更新当前菜单项的。

例18 菜单基础知识示例
#include <curses.h>
#include <menu.h>
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
#define CTRLD 4
NCURSES Programming HOWTO 中文版(第二版)
64
char *choices[] = {
"Choice 1",
"Choice 2",
"Choice 3",
"Choice 4",
"Exit",
};
int main()
{ ITEM **my_items;
int c;
MENU *my_menu;
int n_choices, i;
ITEM *cur_item;
initscr();
cbreak();
noecho();
keypad(stdscr, TRUE);
n_choices = ARRAY_SIZE(choices);
my_items = (ITEM **)calloc(n_choices + 1, sizeof(ITEM *));
for(i = 0; i < n_choices; ++i)
my_items[i] = new_item(choices[i], choices[i]);
my_items[n_choices] = (ITEM *)NULL;
my_menu = new_menu((ITEM **)my_items);
mvprintw(LINES 2,
0, "F1 to Exit");
post_menu(my_menu);
refresh();
while((c = getch()) != KEY_F(1))
{ switch(c)
{ case KEY_DOWN:
menu_driver(my_menu, REQ_DOWN_ITEM);
break;
case KEY_UP:
menu_driver(my_menu, REQ_UP_ITEM);
break;
}
}
free_item(my_items[0]);
free_item(my_items[1]);
free_menu(my_menu);
endwin();
}
        这个程序演示了用菜单库创建菜单的基本步骤。首先用new_item()函数建立菜单项,然后
用new_menu()函数把这些菜单项添加到菜单。当递送了菜单并刷新屏幕后,主循环就开始
处理。它读取用户的输入并进行相应的操作。函数menu_driver()是菜单系统的核心函数。
这个函数的第二个参数是相应菜单操作宏。menu_driver()函数根据参数执行相应的操作。
参数的值可以是菜单的导航请求、一个ASCII 码或与鼠标事件相关的一个特定
KEY_MOUSE 值。
menu_driver()函数可以接受以下导览请求:(就是第二个参数)
REQ_LEFT_ITEM 左移一个菜单项。
REQ_RIGHT_ITEM 右移一个菜单项。
REQ_UP_ITEM 上移一个菜单项。
REQ_DOWN_ITEM 下移一个菜单项。
REQ_SCR_ULINE 向上滚动一行。
REQ_SCR_DLINE 向下滚动一行。
REQ_SCR_DPAGE 下翻一页。
REQ_SCR_UPAGE 上翻一页
REQ_FIRST_ITEM 跳到首项。
REQ_LAST_ITEM 跳到最末一项。
REQ_NEXT_ITEM 跳到下一项。
REQ_PREV_ITEM 跳到上一项。
REQ_TOGGLE_ITEM 选择/取消选择一项。
REQ_CLEAR_PATTERN 清空菜单模式缓冲区。
REQ_BACK_PATTERN 删除菜单模式缓冲区的前面一个字符。
REQ_NEXT_MATCH 跳到下一个与模式匹配的项。
REQ_PREV_MATCH 跳到上一个与模式匹配的项。


        千万不要被这么多的操作请求吓倒,稍后我们会一个一个地讲解。在这个例子中,最有趣的
是REQ_UP_ITEM 和REQ_DOWN_ITEM。当这两个选项传给menu_driver()函数时,
menu_driver()函数将会通过重新刷新屏幕上移或下移一个菜单项。
17.3 Menu

猜你喜欢

转载自blog.csdn.net/zhanganliu/article/details/80587427