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的更多相关文章

  1. 编译Openwrt的log

    Openwrt配置: Target System (Ralink RT288x/RT3xxx) ---> Subtarget (MT7688 based boards) ---> Targ ...

  2. C语言图书管理借阅系统——ncurses库的使用

    一.前言 作为一只大四狗,最近还跟着大二同学修了一门课(当然不是之前没通过啦),课程是高级语言课程设计,高级语言指的是C语言 :),内容是做一个XX管理系统,我选择了图书管理系统,先介绍下我做的系统: ...

  3. Android Studio —— 创建Menu菜单项

    大多数android程序的右上角都会设置一个菜单按钮比如微信的界面右上角的加号. 这个需要在layout同级目录下新建文件夹命名为menu,再右击新建的menu新建xml文件:

  4. [转]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 ...

  5. Vertical Menu ver4

    以前一直使div来创建Vertical菜单,也曾有过3个版本.http://www.cnblogs.com/insus/archive/2011/10/19/2217314.html 现今Insus. ...

  6. 菜单(Menu)的三中创建方式——Android开发之路2

    菜单的三种创建方式 一.OptionsMenu---选项菜单 Android应用中的菜单默认是隐藏的,只有当用户点击手机上的MENU键,系统才会显示菜单.这种菜单叫做选项菜单(Options Menu ...

  7. jQuery ui autocomplete 与easyUI冲突解决办法(重命名ui的autocomplete 和menu部分)

    http://jqueryui.com/download/   UI定制只选autocomplete 会自动把依赖的menu模块也加入进来--然而easyUI也有自己的menu,于是就-- 折腾了好久 ...

  8. 使用GRUB 添加新的启动项 (menu entry)

    GRUB版本: Grub2 基础知识: 相关的文件和目录结构: A./etc/grub.d/ 上图中有一个40_custom的脚本: 可以通过修改40_custom脚本来加入自定义的启动项. B./e ...

  9. Menu与ActionBar的爱恨情仇

    最近在开发一款音乐播放器,在开发过程中遇到了一点小麻烦,通过android API搞清楚了Menu与ActionBar的爱恨情仇,写了个小Demo祭奠一下那些年我们陷进去的坑,有不对的地方请大神们批评 ...

  10. WPF menu

    MenuMenu的样式很简单,就是顶部的那个框,如下图 而其中的文字“文件”“图形”...是属于MenuItem的,要灵活使用MenuItem,就需要了解MenuItem.Role的作用 TopLev ...

随机推荐

  1. Solution Set -「ABC 205」

    应该是最近最水的 ABC 了吧. 「ABC 205A」kcal Link. 略 #include <bits/stdc++.h> using ll = long long; #define ...

  2. mpi转以太网连接200plc以太网监控同时与步科触摸屏通信

    西门子PLC200 226PLC转以太网通过PPI-ETH-XD1.0集中采集不占用编程口同时与步科触摸屏通信 现有设备及联网要求客户车间内有6台纺机设备,控制系统采用西门子PLC,型号为CPU226 ...

  3. 基于go语言gin框架的web项目骨架

    该骨架每个组件之间可单独使用,组件之间松耦合,高内聚,组件的实现基于其他三方依赖包的封装. 目前该骨架实现了大多数的组件,比如事件,中间件,日志,配置,参数验证,命令行,定时任务等功能,目前可以满足大 ...

  4. #POWERBI_指标监控(第二部分,周期内下降天数及日期明细)

    在指标监控的第一部分文章中,我们已经讲了,如何用DAX去查询一段周期内连续下降或者上升指标. 需要复习的同学可以点击下方链接: https://www.cnblogs.com/simone331/p/ ...

  5. QQ机器人整理合集

    QQ机器人有什么用呢? QQ机器人可以实现包括自动回复.定时推送.发送图片QQ机器人,营销圈用的比较多,可以开发各种自动功能等等.用其制作的QQ机器人程序 机器人框架+插件 小栗子机器人 官网:htt ...

  6. .NET Core使用SkiaSharp快速生成二维码( 真正跨平台方案)

    前言 在.NET 6之前我们一直是使用QRCoder来生成二维码(QRCoder是一个非常强大的生成二维码的组件,用到了System.Drawing.Common 包),然后从.NET 6开始,当为非 ...

  7. 【matplotlib 实战】--饼图

    饼图,或称饼状图,是一个划分为几个扇形的圆形统计图表.在饼图中,每个扇形的弧长(以及圆心角和面积)大小,表示该种类占总体的比例,且这些扇形合在一起刚好是一个完全的圆形. 饼图最显著的功能在于表现&qu ...

  8. Pandas 读取Eexcel - 间隔N行,读取某列数据

    间隔N行,读取某列数据 import pandas as pd def read_vertical(sheet_name, col_idx, gap): """ 竖着读数 ...

  9. Mybatis-plus 生成代码

    引入依赖 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-g ...

  10. 设置Eclipse自动补全变量名

    具体配置步骤如下: Windows -> Preferences -> Java -> Editor -> Content Assist 选中 Enable auto-acti ...