Linux - 可视化菜单界面设计

本文详细介绍了Linux系统中使用Curses库进行可视化菜单界面设计的方法,包括优化屏幕刷新、启用keypad模式、处理keypad模式的限制、彩色显示以及初始化和重新定义颜色对。同时,讲解了pad的使用以及如何创建和刷新菜单界面,包括draw_menubar()、draw_menu()和scroll_menu()等关键函数的实现,旨在帮助开发者构建高效且用户友好的字符界面应用。

优化屏幕刷新

问题
刷新多个窗体需要一些繁琐,在一个慢速的链接上,屏幕的绘制相当的慢
目标就是要尽量减少要在屏幕上的绘制的字符数

基本函数
int wnoutrefresh(WINDOW *window_ptr);
决定哪些字符需要发送到屏幕,但是并不实际的发送
int doupdate(void);
向终端发送实际的改变

说明
如果只是简单地调用wnoutrefresh,其后立即调用doupdate,其效果就如同调用wrefresh一样
如果希望重新绘制一个窗体栈,可以在每一个窗体(以正确的顺序)上调用wnoutrefresh函数,然而在最后一个wnoutrefresh函数之后调用doupdate函数
这使得curses按顺序在每一个窗体上执行屏幕更新计算,并且只输出更新的屏幕。这会使得curses尽量减少需要发送的字符数

WINDOW *subwin(WINDOW *parent, int lines, int cols, int y, int x);
subwin函数具有与newwin几乎相同的参数列表
子窗体的删除方式也与其他的窗体使用一个delwin调用方式相同
与新窗体类似,可以使用一系列的 mvw函数将数据写入子窗体中,但有一点重要区别
子窗体本身并不会存储一个单独的屏幕字符集,他们与子窗体创建时所指定的父窗体共享存储空间
这就意味着子窗体中的任何改动也同时会发生在底层的父窗体中,所以当一个子窗体被删除时,屏幕并不会发生变化
int delwin(WINDOW *window_to_delete);

在将sub_window_ptr指向subwin的调用结果之后,就将子窗体变得可以滚动
甚至是在子窗体被删除而基窗体(strdcr)已经刷新之后,屏幕上的文本仍然保持原样
这是因为子窗体实际更新的是stdscr的字符数据

keypad模式

功能键的处理
在大多数终端会发送一个以转义字符开始的字符串
这些程序所具有的不仅是单击Escape键和由按下一个功能键所引起的字符串之间区别的问题,而且必须使用相同逻辑按键的不同序列来处理不同的终端
curses提供了一个优雅的实用功能来管理这些功能按键
对于每一个终端,每一个功能键所发送的字符序列都会被存储,通常是存储在一个terminfo结构中
所包含的头文件curses.h具有一个以KEY_为前缀的定义部分定义了逻辑按键
当curses启动时,序列与逻辑按键之间的转换就被禁止,必须使用keypad函数来打开
int keypad(WINDOW *window_ptr, bool keypad_on);
如果函数调用成功则会返回OK,否则返回ERR

keypad模式的三个限制

转义序列的识别是时间相关的
许多网络协议将字符组装到数所包中(会导致不能正确识别转义序列)
或者是分割他们(从而会导致功能按键序列会被识别为Escape与单个的字符)
唯一解决办法
进行编程,使用信号来处理希望使用的每一个功能按键,为其发送单一、唯一的字符
为使curses可区分按下Escape与以Escape开头的键盘序列,必须等待一小段时间
有时,一旦打开keypad模式,Escape按键处理上的一个非常小的延时也会被注意到
curses不能处理不唯一的转义序列
如果终端有可以发送相同序列的两个不同的按键,curses只是简单的不处理这个序列,因为他不能确定应返回哪一个逻辑按键

彩色显示

大多数早期的curses版本不支持颜色
颜色被ncurses以及大多数现在的curses实现所支持
curses中的颜色支持有一些不同,其原因在于每一个字符的颜色并不是独立于其底色而定义的
所以必须同时定义前景色与背景色,即所谓的颜色对

bool has_colors(void);
如果支持颜色,has_colors就会返回真
int start_color(void);
进行颜色初始化,如果颜色初始化成功,则返回OK
初始化COLORS和COLOR_PAIR
COLORS:终端所支持的最多的颜色数目
COLOR_PAIR:用户可以定义的色彩对的最大数目
系统颜色
COLOR_BLACK 0 黑色
 COLOR_RED 1 红色
COLOR_GREEN 2 绿色
COLOR_YELLOW 3 黄色
COLOR_BLUE 4 蓝色
COLOR_MAGENTA 5 洋红色
COLOR_CYAN 6 蓝绿色, 青色
COLOR_WHITE 7 白色

初始化颜色对

int init_pair(short pair_number, short foreground, short background);
用于更改一个彩色对的定义
彩色对是Curses的一个概念,它用一个整型数值去标志一对前景/背景彩色
pair_number:彩色对数值,其范围从1到 COLOR_PAIRS-1
f:指定前景彩色
b:指定背景彩色
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值