使用curses管理基于文本的屏幕--(六)

摘要:
一开始,很少有哑终端支持颜色,所以大多数早期的curses版本不支持颜色。不幸的是,curses哑屏的起源已经深深地影响了API,因此curses使用了一种特殊的严格方法来支持颜色,这也反映了早期彩色终端的能力不足。curses中的颜色支持是不同的,因为每个字符的颜色不是独立于其背景颜色定义的。在我们可以在curses中使用颜色函数之前,我们必须检查当前终端是否支持颜色,然后初始化curses的颜色例程。

颜色
最初,很少有哑终端可以支持颜色,所以大多数早期的curses版本并不会支持颜色。现在,颜色是大家所期望的,而且被ncurses以及大多数现在的curses实现所支持。不幸的,curses的哑屏幕的起源深深影响了API,所以curses使用一种特殊严格的方法来支持颜色,这也反映了早期颜色终端的能力不足。
屏幕上的每一个字符都可以使用许多不同的颜色显示在屏幕上,而不是使用各种不同的背景底色。例如,我们可以在红色的背景上使用绿色来显示文本。
curses中的颜色支持有一些不同,其原因在于每一个字符的颜色并不是独立于其底色而定义的。所以我们必须同时定义前景色与背景色,不要惊奇,这就是所谓的颜色对。
在我们可以使用curses中的颜色功能之间,我们必须检测当前的终端是否支持颜色,然后初始化curses的颜色例程。为了完成这个任务,我们可以使用一个函数对:has_colors与start_color。
#include <curses.h>
bool has_colors(void);
int start_color(void);
如果支持颜色,has_colors就会返回真。然后我们应调用start_color,如果颜色成功的进行了初始化就会返回OK。一旦调用了start_color进行了颜色的初始化,变量COLOR_PAIRS就会被设置为终端可以支持的最大颜色对。通常限制为64颜色对。变是COLORS定义了可用的最大的颜色数量,通常为8。由0开始的数字对于每一个可用的颜色而言起到了唯一ID的作用。
在我们可以将颜色作为属性使用之前,我们必须初始化我们希望使用的颜色对。我们可以使用init_pair函数来完成这个任务。颜色属性可以通过COLOR_PAIR函数来访问。
#include <curses.h>
int init_pair(short pair_number, short foreground, short background);
int COLOR_PAIR(int pair_number);
int pair_content(short pair_number, short *foreground, short *background);
curses.h通常定义了一些以COLOR_开头的基本颜色。另外一个函数,pair_content,可以允许我们取得前面定义的颜色对的信息。
要定义颜色对1,使其背景色为绿色而前景色为红色,我们可以用下面的函数语句:
init_pair(1, COLOR_RED, COLOR_GREEN);
我们可以使用COLOR_PAIR将这个颜色作为一个属性来进行访问:
wattron(window_ptr, COLOR_PAIR(1));
这样就可以将屏幕设置为绿色的背景色以及红色的前景色。
因为COLOR_PAIR是一个属性,所以我们可以将其与其他的属性进行组合。在PC上,我们经常可以通过使用位或操作符组合COLOR_PAIR属性与A_BOLD属性来获得屏幕的亮度:
wattron(window_ptr, COLOR_PAIR(1) | A_BOLD);
下面我们来看一下例子程序color.c中函数:
试验--颜色
1 首先,我们需要检测程序的显示终端是否支持颜色。如果支持,则开始颜色显示。
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <curses.h>
int main()
{
int i;
initscr();
if (!has_colors()) {
endwin();
fprintf(stderr, “Error - no color support on this terminal/n”);
exit(1);
}
if (start_color() != OK) {
endwin();
fprintf(stderr, “Error - could not initialize colors/n”);
exit(2);
}
2 现在我们可以打印出允许的颜色数与颜色对。我们创建七个颜色对并且同时显示。
clear();
mvprintw(5, 5, “There are %d COLORS, and %d COLOR_PAIRS available”,
COLORS, COLOR_PAIRS);
refresh();
init_pair(1, COLOR_RED, COLOR_BLACK);
init_pair(2, COLOR_RED, COLOR_GREEN);
init_pair(3, COLOR_GREEN, COLOR_RED);
init_pair(4, COLOR_YELLOW, COLOR_BLUE);
init_pair(5, COLOR_BLACK, COLOR_WHITE);
init_pair(6, COLOR_MAGENTA, COLOR_BLUE);
init_pair(7, COLOR_CYAN, COLOR_WHITE);
for (i = 1; i <= 7; i++) {
attroff(A_BOLD);
attrset(COLOR_PAIR(i));
mvprintw(5 + i, 5, “Color pair %d”, i);
attrset(COLOR_PAIR(i) | A_BOLD);
mvprintw(5 + i, 25, “Bold color pair %d”, i);
refresh();
sleep(1);
}
endwin();
exit(EXIT_SUCCESS);
}
重新定义颜色
早期的哑终端一次只可以很显示很少的颜色,但是却允许将激活的颜色设置为可配置的,curses允许使用init_color函数来重新定义颜色。
#include <curses.h>
int init_color(short color_number, short red, short green, short blue);
这允许一个已经存在的颜色可以使用0到1000之间的值进行重新定义。这与定义GIF格式图像文件的颜色有一些类似。

免责声明:文章转载自《使用curses管理基于文本的屏幕--(六)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇STM32 库函数 初学笔记vue踩坑:axios使用this指针下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用curses管理基于文本的屏幕--(八)

CD管理程序现在我们已经了解了curses所提供了功能,我们可以继续开发我们的例子程序。在这里所展示是一个使用curses库的C语言版本。他提供了一些高级的特性,包括更为清晰的屏幕信息显示以及用于跟踪列表的滚动窗口。完整的程序共页长,所以我们将其分为几部分,在每一部分中介绍一些函数。试验--一个新的CD管理程序1 首先,我们包含所有的头文件以及一些全局常量...

2048小游戏代码解析 C语言版

2048小游戏,也算是风靡一时的益智游戏。其背后实现的逻辑比较简单,代码量不算多,而且趣味性强,适合作为有语言基础的童鞋来加强编程训练。本篇分析2048小游戏的C语言实现代码。 前言 游戏截图:  游戏实现原理: 使用终端图形库文件curses绘制终端里的图形。 使用一个二维数组保存4 x 4 空格中的变量。 键盘输入控制移动,经过逻辑判断,二维数组数...

curses库--libncurses5-dev--游标移动及屏幕的显示

curses是一个在Linux/Unix下广泛应用的图形函数库.,作用是可以绘制在DOS下的用户界面和漂亮的图形。 curses的名字起源于"cursor optimization",即光标优化。它最早由有美国伯克利大学的Bill Joy和Ken Arnold编写的,用来处理一个游戏rogue的屏幕显示。后来贝尔实验室的Mark Horton在System...

[C++]Linux之图形界面编程库[curses库]之入门教程

0. 环境 x86 / 64bit Linux Ubuntu 16.04 1. 安装 //方法一 sudo apt-get install libncurses5-dev 【 ubuntu 16.04:亲测有效】 //方法二 sudo apt-get install ncurses-dev //方法三【手动,ubuntu 16.04 测试:ncur...