-
Notifications
You must be signed in to change notification settings - Fork 0
10. Цвета
Жизнь кажется скучной без красок? В Curses есть хороший механизм для работы с цветами. Давайте разберемся в этом с помощью небольшой программы.
#include <ncurses.h>
#include <string.h>
void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string);
int main(int argc, char *argv[])
{
initscr(); /* Запуск режима curses */
if (has_colors() == FALSE)
{
endwin();
printf("Ваш терминал не поддерживает цвет\n");
exit(1);
}
start_color(); /* Стартовый цвет */
init_pair(1, COLOR_RED, COLOR_BLACK);
attron(COLOR_PAIR(1));
print_in_middle(stdscr, LINES / 2, 0, 0, "Viola !!! В цвете ...");
attroff(COLOR_PAIR(1));
getch();
endwin();
}
void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string)
{
int length, x, y;
float temp;
if (win == NULL)
win = stdscr;
getyx(win, y, x);
if (startx != 0)
x = startx;
if (starty != 0)
y = starty;
if (width == 0)
width = 80;
length = strlen(string);
temp = (width - length) / 2;
x = startx + (int)temp;
mvwprintw(win, y, x, "%s", string);
refresh();
}
Как видите, чтобы начать использовать цвет, необходимо сначала вызвать функцию
start_color()
. После этого вы можете использовать цветовые возможности ваших
терминалов с помощью различных функций. Чтобы узнать, поддерживает терминал
цвет или нет, можно использовать функцию has_colors()
, которая возвращает FALSE
,
если терминал не поддерживает цвет.
Curses инициализирует все цвета, поддерживаемые терминалом, при вызове
start_color()
. Доступ к ним можно получить с помощью констант define
, таких как
COLOR_BLACK
и т.д. Теперь, чтобы начать использовать цвета, необходимо определить
пары. Цвета всегда используются парами. Это означает, что вы должны использовать
функцию init_pair()
для определения переднего и заднего плана для заданного номера
пары. После этого номер пары можно использовать как обычный атрибут с помощью
функции COLOR_PAIR()
. Поначалу это может показаться громоздким. Но это элегантное
решение позволяет нам очень легко управлять цветовыми парами. Чтобы оценить это,
нужно заглянуть в исходный код "dialog"
, утилиты для отображения диалоговых окон из
сценариев оболочки. Разработчики определили комбинации переднего плана и фона
для всех цветов, которые могут понадобиться, и инициализировали их в самом начале.
Это позволяет очень легко устанавливать атрибуты, просто обращаясь к паре, которую
мы уже определили как константу.
Следующие цвета определены в curses.h
. Вы можете использовать их в качестве
параметров для различных функций цвета:
COLOR_BLACK 0
COLOR_RED 1
COLOR_GREEN 2
COLOR_YELLOW 3
COLOR_BLUE 4
COLOR_MAGENTA 5
COLOR_CYAN 6
COLOR_WHITE 7
Функция init_color()
может быть использована для изменения значений rgb
для цветов,
определенных curses
изначально. Допустим, вы хотите немного ослабить интенсивность
красного цвета. Тогда вы можете использовать эту функцию следующим образом:
init_color(COLOR_RED, 700, 0, 0);
/* параметр 1 : color name
* параметр 2, 3, 4 : rgb content min = 0, max = 1000 *
Если ваш терминал не может изменять цветовые определения, функция возвращает
ERR
. Функция can_change_color()
может быть использована для выяснения того, имеет ли
терминал возможность изменять цветовое содержимое или нет. Содержимое rgb
масштабируется от 0 до 1000. Первоначально определяется цвет RED
с содержанием
1000(r)
, 0(g)
, 0(b)
.
Функции color_content()
и pair_content()
могут быть использованы для поиска цветового
содержания и комбинации переднего плана и фона для пары.
Перевод lomaster & oldteam