Програмування з NCURSES/Колір

Матеріал з docs.linux.org.ua — збірника документації з Unix/Linux українською мовою.

Перейти до: навігація, пошук

Зміст

Колір

Основи

Життя здається сірим без кольорів. Curses включає хороший механізм для обробки кольорів. Давайте ознайомимось з загальними поняттями про кольори за допомогою невеликої програми.

 Приклад 9. Просте використання кольорів
 #include <ncurses.h>
 void print_in_middle(WINDOW *win, int starty, int startx, int width, 
                      char *string);
 int main(int argc, char *argv[])
 {       
     initscr();                      /* Start curses mode */
     if (has_colors() == FALSE)
     {       
         endwin();
         printf("Your terminal does not support color\n");
         exit(1);
     }
     start_color();                  /* Start color */
     init_pair(1, COLOR_RED, COLOR_BLACK);
     attron(COLOR_PAIR(1));
     print_in_middle(stdscr, LINES / 2, 0, 0, "Viola! In color...");
     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(). До них можна звернутися за визначеними константами, такими як COLOR_BLACK, COLOR_GREEN тощо. Тепер, щоб, власне, розпочати використання кольорів, вам необхідно означити кольорові пари. Кольори в curses завжди використовуються як пара. Це означає, що необхідно звернутися до функції init_pair() для визначення кольору переднього плану і кольору тла, позначаючи цю пару певним номером. Після цього, номер кольорової пари можна вживати як звичайний атрибут завдяки функції COLOR_PAIR(). Це може здатися обтяжливим спочатку, але насправді, таке елегантне рішення дозволяє легке керування кольоровими парами. Щоб оцінити його, ви можете заглянути до вихідних текстів програми dialog(1), - знаряддя для виводу вікон зі скриптів оболонки. Розробники цієї програми визначили всі кольори переднього плану і фону, які їм можуть знадобитися, ініціалізуючи їх напочатку. Це значно полегшує встановлення атрибутів, просто шляхом вказування кольорової пари, яку ми означили як стале.

В 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

Зміна визначень кольору

Щоб поміняти RGB-значення кольорів, визначене curses, можна використати ту саму функцію init_color(). Скажімо, ви хотіли би приглушити яскравість червоного кольору. В такому разі можна вказати

   init_color(COLOR_RED, 700, 0, 0);
   /* параметр 1: назва кольору
    * параметри 2, 3, 4: rgb-значення, мінімальне = 0, максимальне = 1000 */

Якщо ваш термінал не спроможний міняти визначення кольорів, ця функція поверне ERR. Можна попередньо використати функцію can_change_color(), щоб дізнатися, чи термінал дозволяє міняти означення кольорів, чи ні. RGB-начення кольору знаходяться в діапазоні між 0 і 1000. Початкове значення COLOR_RED, наприклад є рівним 1000 (червоний), 0 (зелений), 0 (синій).

Вміст кольору

Функції color_content() та pair_content() можна використати для того, щоб з'ясувати вміст кольору та комбінацію кольору переднього плану й фону кольорової пари.

Особисті інструменти