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 ...
随机推荐
- Record - Nov. 27st, 2020 - Exam. REC & SOL
Problem. 1 Junior - Thinking Desc. & Link. 注意到值域乘范围刚好能过. 然后就存两个桶即可...(数组开小飞了半天才调出来...) Problem. ...
- mpi转以太网连接300PLC在气动系统中的应用
mpi转以太网连接300PLC在气动系统中的应用 某企业装备有限公司 摘要 工业通讯迅速发展的今天,MPI转以太网通讯已经发展为成熟,稳定,高效通讯 方式,兴达易控自主研发的MPI转以太网模块MPI- ...
- 2023 ICPC 网络赛 II
开场顺着读了 AC 不会,B 是 KDT 优化建图板子,让 zsy 确认了一下并制止他现在做.把 D 转化转化成了经典问题·,当时以为是网络流,所以 zsy 签完 M 就上去写了,写一半发现假了,问了 ...
- Python 列表操作指南1
Python 列表 mylist = ["apple", "banana", "cherry"] 列表用于在单个变量中存储多个项目.列表是 ...
- Linux系列教程——Linux基本权限、Linux特殊权限、LinuxACL控制、Linux输入输出
@ 目录 1 Linux基本权限 1.权限基本概述 1.什么是权限? 2.为什么要有权限? 3.权限与用户之间的关系? 4.权限中的rwx分别代表什么含义? 2.权限设置示例 1.为什么要设定权限,我 ...
- svn: E200007: Retrieval of mergeinfo unsupported解决
http://blog.csdn.net/intlgj/article/details/39080605 svn: E200007: Retrieval of mergeinfo unsupport ...
- 【matplotlib 实战】--堆叠柱状图
堆叠柱状图,是一种用来分解整体.比较各部分的图.与柱状图类似,堆叠柱状图常被用于比较不同类别的数值.而且,它的每一类数值内部,又被划分为多个子类别,这些子类别一般用不同的颜色来指代. 柱状图帮助我们观 ...
- ACAM 学习笔记 | 附 YbtOJ 全部题解
怎么有人现在才学 ACAM 呢. 好像比 SAM 简单挺多啊,也不记得当时是哪里看不懂. AC 自动机() 自动 AC 机(✘) 概述 ACAM(Aho–Corasick Automaton),是用来 ...
- DFS(深度优先搜索)洛谷P1162
看大佬们dfs一遍就出结果,蒟蒻的我dfs了三遍,当然这题也可以用bfs做,但是dfs不用队列代码短一些. #include <iostream> #include <vector& ...
- 飞码LowCode前端技术:如何便捷配置出页面
简介 飞码是京东科技平台研发部研发的低代码产品,可使营销运营域下web页面快速搭建.本文将从三个方面来讲解如何便捷配置出页面,第一部分从数据.事件.业务支持三个方面进行分析,第二部分从模板与页面收藏与 ...