Skip to content

10. Цвета

lomaster edited this page Apr 15, 2023 · 2 revisions

Жизнь кажется скучной без красок? В Curses есть хороший механизм для работы с цветами. Давайте разберемся в этом с помощью небольшой программы.

10.1 Пример 9

#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 

10.2. Изменение определений цвета

Функция 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).

10.3. Содержание цвета

Функции color_content() и pair_content() могут быть использованы для поиска цветового содержания и комбинации переднего плана и фона для пары.