ncurses 与 menu
ncurses 与 menu
一下位ncurses和菜单库menu的demo程序
#include <menu.h>
#include <ncurses.h>
#include <stdlib.h>
#include <string.h>
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
#define CTRLD 4
char *choices[] = {
"Choice 1",
"Choice 2",
"Choice 3",
"Choice 4",
"Choice 5",
"Choice 6",
"Choice 7",
"Choice 8",
"Choice 9",
"Choice 10",
"Choice 11",
"Choice 12",
"Choice 13",
"Choice 14",
"Choice 15",
"Choice 16",
"Choice 17",
"Choice 18",
"Choice 19",
"Choice 20",
"Exit",
NULL,
};
void print_in_middle(WINDOW *win, int y, int startx, int width, char *string, chtype color);
int main(){
ITEM **my_items;
int c;
MENU *my_menu;
WINDOW *my_menu_win;
int n_choices;
initscr();
start_color();
cbreak();
noecho();
keypad(stdscr, TRUE);
curs_set(0);
init_pair(1, COLOR_RED, COLOR_BLACK);
n_choices = ARRAY_SIZE(choices);
my_items = (ITEM **)calloc(n_choices, sizeof(ITEM *));
for(int i = 0; i < n_choices; i++)
my_items[i] = new_item(choices[i], choices[i]);
item_opts_off(my_items[3], O_SELECTABLE);
my_menu = new_menu((ITEM **)my_items);
my_menu_win = newwin(10, 50, 4, 4);
keypad(my_menu_win, TRUE);
set_menu_win(my_menu, my_menu_win);
set_menu_sub(my_menu, derwin(my_menu_win, 6, 48, 3, 1));
set_menu_mark(my_menu, " * ");
menu_opts_off(my_menu, O_SHOWDESC);
menu_opts_off(my_menu, O_ONEVALUE);
set_menu_format(my_menu, 6, 2);
box(my_menu_win, 0, 0);
print_in_middle(my_menu_win, 1, 0, 50, "My Menu", COLOR_PAIR(1));
mvwhline(my_menu_win, 2, 1, ACS_HLINE, 48);
mvprintw(LINES - 2, 0, "F1 to exit");
refresh();
post_menu(my_menu);
wrefresh(my_menu_win);
while((c = wgetch(my_menu_win)) != 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;
case KEY_LEFT:
menu_driver(my_menu, REQ_LEFT_ITEM);
break;
case KEY_RIGHT:
menu_driver(my_menu, REQ_RIGHT_ITEM);
break;
case 'm':
menu_driver(my_menu, REQ_SCR_DPAGE);
break;
case 'n':
menu_driver(my_menu, REQ_SCR_UPAGE);
break;
case ' ':
menu_driver(my_menu, REQ_TOGGLE_ITEM);
break;
case '\n':{
int count = item_count(my_menu);
char tmp[200]= {};
ITEM **item = menu_items(my_menu);
for (int i=0; i < count; i++) {
if (item_value(item[i]) == TRUE) {
strcat(tmp, item_name(item[i]));
strcat(tmp, " ");
}
}
move(LINES - 3, 0);
clrtoeol();
mvprintw(LINES - 3, 0, "%s", tmp);
refresh();
break;
}
case 'u':{
ITEM *item = current_item(my_menu);
move(LINES - 3, 0);
clrtoeol();
mvprintw(LINES - 3, 0, "%s", item_name(item));
refresh();
break;
}
case 'r':{
set_current_item(my_menu, my_items[4]);
break;
}
}
wrefresh(my_menu_win);
}
unpost_menu(my_menu);
free_menu(my_menu);
for(int i = 0; i < n_choices; ++i)
free_item(my_items[i]);
free(my_items);
endwin();
}
void print_in_middle(WINDOW *win, int y, int startx, int width, char *string, chtype color) {
int x;
if(win == NULL)
win = stdscr;
if(y == 0)
getyx(win, y, x);
x = startx + (width - strlen(string)) / 2;
wattron(win, color);
mvwprintw(win, y, x, "%s", string);
wattroff(win, color);
refresh();
}
使用方向键可选择选中项,按空格勾选,按回车确定
按r显示当前选中项,n将选中Choice 5
ncurses 与 menu的更多相关文章
- 编译Openwrt的log
Openwrt配置: Target System (Ralink RT288x/RT3xxx) ---> Subtarget (MT7688 based boards) ---> Targ ...
- C语言图书管理借阅系统——ncurses库的使用
一.前言 作为一只大四狗,最近还跟着大二同学修了一门课(当然不是之前没通过啦),课程是高级语言课程设计,高级语言指的是C语言 :),内容是做一个XX管理系统,我选择了图书管理系统,先介绍下我做的系统: ...
- Android Studio —— 创建Menu菜单项
大多数android程序的右上角都会设置一个菜单按钮比如微信的界面右上角的加号. 这个需要在layout同级目录下新建文件夹命名为menu,再右击新建的menu新建xml文件:
- [转]NopCommerce How to add a menu item into the administration area from a plugin
本文转自:http://docs.nopcommerce.com/display/nc/How+to+code+my+own+shipping+rate+computation+method Go t ...
- Vertical Menu ver4
以前一直使div来创建Vertical菜单,也曾有过3个版本.http://www.cnblogs.com/insus/archive/2011/10/19/2217314.html 现今Insus. ...
- 菜单(Menu)的三中创建方式——Android开发之路2
菜单的三种创建方式 一.OptionsMenu---选项菜单 Android应用中的菜单默认是隐藏的,只有当用户点击手机上的MENU键,系统才会显示菜单.这种菜单叫做选项菜单(Options Menu ...
- jQuery ui autocomplete 与easyUI冲突解决办法(重命名ui的autocomplete 和menu部分)
http://jqueryui.com/download/ UI定制只选autocomplete 会自动把依赖的menu模块也加入进来--然而easyUI也有自己的menu,于是就-- 折腾了好久 ...
- 使用GRUB 添加新的启动项 (menu entry)
GRUB版本: Grub2 基础知识: 相关的文件和目录结构: A./etc/grub.d/ 上图中有一个40_custom的脚本: 可以通过修改40_custom脚本来加入自定义的启动项. B./e ...
- Menu与ActionBar的爱恨情仇
最近在开发一款音乐播放器,在开发过程中遇到了一点小麻烦,通过android API搞清楚了Menu与ActionBar的爱恨情仇,写了个小Demo祭奠一下那些年我们陷进去的坑,有不对的地方请大神们批评 ...
- WPF menu
MenuMenu的样式很简单,就是顶部的那个框,如下图 而其中的文字“文件”“图形”...是属于MenuItem的,要灵活使用MenuItem,就需要了解MenuItem.Role的作用 TopLev ...
随机推荐
- 2023 ICPC 网络赛 II
开场顺着读了 AC 不会,B 是 KDT 优化建图板子,让 zsy 确认了一下并制止他现在做.把 D 转化转化成了经典问题·,当时以为是网络流,所以 zsy 签完 M 就上去写了,写一半发现假了,问了 ...
- 3DMatch
详细描述链接:3DMatch 数据集.github(介绍非常详细) 官网主页: 主页 3DMatch数据集收集了来自于62个场景的数据,其中54个场景的数据用于训练,8个场景的数据用于评估,其具体名称 ...
- ASP.NET 6启动时自动创建MongoDB索引
大家好,我是Edison. 最近,在使用MongoDB时,碰到这样的一个需求:针对某个Collection手动在开发环境创建了索引,但在测试环境和生产环境不想再手动操作了,于是就想着通过代码的方式在A ...
- SYN泛洪攻击详解
SYN攻击利用的是TCP的三次握手机制,攻击端利用伪造的IP地址向被攻击端发出请求,而被攻击端发出的响应 报文将永远发送不到目的地,那么被攻击端在等待关闭这个连接的过程中消耗了资源,如果有成千上万的这 ...
- 素数是个什么东西 prime number
/** * ********************************************************************* * 只有1和它本身两个正因数的自然数,叫质数 ...
- node(1)
1.新建http.js //node搭建http服务器 let http=require('http'); //使用http建立服务请求 http.createServer(function(requ ...
- Python 面向对象编程:类、对象、初始化和方法详解
Python 是一种面向对象的编程语言.在 Python 中,几乎所有东西都是对象,都具有其属性和方法. 类似于对象构造函数或用于创建对象的"蓝图"的类. 创建一个类 要创建一个类 ...
- 【KMP】border 题解
题目描述 输入 输出 样例输入 abaabaa 样例输出 17 样例解释: f[2][a] = 1 f[3][a] = 1 f[4][a] = 1 f[4][b] = 2 f[5][a] = 1 f[ ...
- [C++]线段树 区间修改 区间查询
线段树 区间修改 区间查询 请先阅读上一篇Bolg 算法思想 这次要引入一个核心变量: lazy 懒标记 为了达到区间修改的目的 又为了减少运算量 所以就需要引入懒标记这个变量 用来满足 即用即推 没 ...
- 简单理解cookie/session机制(转)
http://www.woshipm.com/pd/864133.html cookie与session应用于互联网中的一项基本技术--会话(用户与客户端的交互)跟踪技术,用来跟踪用户的整个会话.简单 ...