优化屏幕刷新
问题
刷新多个窗体需要一些繁琐,在一个慢速的链接上,屏幕的绘制相当的慢
目标就是要尽量减少要在屏幕上的绘制的字符数
基本函数
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:指定背景彩色

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

被折叠的 条评论
为什么被折叠?



