[ncurses] 4. 색상 사용하기

색상을 설정하고, 글자와 윈도우의 색상을 변경하는 방법을 알아봅니다.


이제 ncurses의 꽃인 색상 사용 을 한번 해보도록 합시다.

Color Pair 지정하기

터미널에서 지정할 수 있는 색상의 종류는 글자색과 배경색 2가지가 있습니다. ncurses에서는 두 색깔을 Color pair(색상 짝) 이라는 개념으로 관리합니다. 미리 Color pair들을 지정해놓은 후, 출력 함수에서 해당 Color pair를 이용하게 되면 해당하는 글자색과 배경색으로 출력이 이루어지게 됩니다.

ncurses에서 색상 변경을 이용하려면, start_color() 함수를 먼저 호출해주어야 합니다.

initscr();
start_color();

그 후에, init_color() 함수를 이용하여 프로그램에서 사용할 Color pair들을 만듭니다. init_color() 함수는 번호, R, G, B의 4가지 인자가 들어갑니다.

init_color 함수에 R, G, B의 색상 값을 넣을 때는 0~255가 아닌 0~1000 사이의 값으로 넣어야 한다는 점입니다. 저는 8비트 색상 값에 \((1000/255)\)를 곱한 대략적인 값을 사용했습니다.

init_color(1, 0, 1000, 0);        // Color 1 : Green
init_color(2, 0, 0, 1000);        // Color 2 : Blue

이렇게 함수를 호출하면, R이 0, G가 1000, B가 1000인 초록색이 1번 색으로 지정됩니다. 또 R이 0, G가 0, B가 1000인 파랑색이 2번 색으로 지정됩니다.

이렇게 색상들에 번호를 붙여 지정해 준 후, init_pair() 함수를 이용해 Color pair를 지정해 줍니다. init_pair() 함수에는 번호, 글자색 pair 번호, 배경색 pair 번호가 순서대로 인자로 들어갑니다.

init_pair(1, 1, 2);        // pair 1 : 파란 배경에 초록 글자

이렇게 호출하면 1번 pair를 글자 색으로 하고 2번 pair를 배경색으로 하는 Color pair가 생성됩니다. 위에서 만든 컬러를 바탕으로 pair를 만들었으니, 글자색은 1번에 배경색 2번이므로 파란 배경에 초록 글자가 됩니다.

색상 지정해 문자 출력

이제 이 Color pair를 사용해서 문자를 출력해보겠습니다. 색상을 이용해서 출력할 때는 addch 류의 함수를 사용해야 합니다. 색상 짝을 불러오기 위해서는 COLOR_PAIR() 매크로를 사용합니다. COLOR_PAIR(number)에서 number에 원하는 Color pair의 번호를 지정할 수 있습니다. 보통 Color pair를 인자로 사용하는 함수에는 COLOR_PAIR() 매크로를 이용하여 인자를 넘겨줍니다.

#include <ncurses.h>

int main(void){
    initscr();
    start_color();
    init_color(1, 0, 1000, 0);      // 1번 색상(글자색): 초록색
    init_color(2, 0, 0, 1000);      // 2번 색상(배경색): 파랑색
    init_pair(1, 1, 2);             // 1번 Color pair를 초록 글자색과 파랑 배경색으로 지정
    
    WINDOW * win = newwin(20, 20, 10, 10);
    box(win, '|', '-');
    waddch(win, 'A' | COLOR_PAIR(1));   // 1번 Color pair를 적용해 문자 출력

    refresh();
    wrefresh(win);
    getch();
    endwin();
}

문자열 색상 변경

문자열 전체의 색상을 변경할때는 보통 attron()attroff() 함수를 사용하여 출력의 색상을 변경합니다. attron() 함수는 호출 이후 출력의 속성을 변경합니다. 색깔 말고도 Blink 등 여러 속성을 설정할 수 있습니다.

아래 코드에서는 attron 함수로 1번 Color pair를 사용하도록 변경한 후, 문자열 "Hello"를 출력하고 attroff로 속성을 해제합니다.

#include <ncurses.h>

int main(void){
    initscr();
    start_color();

    init_color(1, 0, 1000, 0);
    init_color(2, 0, 0, 1000);
    init_pair(1, 1, 2);

    attron(COLOR_PAIR(1));    // 출력 색상을 1번 Color pair로 변경
    printw("Hello");
    attroff(COLOR_PAIR(1));   // 속성 해제

    refresh();
    getch();
    endwin();
}

윈도우 내부에서 문자열 색싱을 변경할 때는 wattron()wattroff() 함수를 사용합니다.

#include <ncurses.h>

int main(void){
    initscr();
    start_color();

    init_color(1, 0, 1000, 0);
    init_color(2, 0, 0, 1000);
    init_pair(1, 1, 2);

    WINDOW * win = newwin(20, 20, 10, 10);
    box(win, '|', '-');

    wattron(win, COLOR_PAIR(1));    // win 윈도우 내 출력 색상을 1번 Color pair로 변경
    wprintw(win, "Hello");
    wattroff(win, COLOR_PAIR(1));   // 속성 해제

    refresh();
    wrefresh(win);
    getch();
    endwin();
}

윈도우 색상 변경

윈도우 전체의 색깔을 변경할 수도 있습니다. wbkgd 함수로 윈도우 전체에 Color pair를 적용 가능합니다. 보통 윈도우 전체의 배경색을 설정할 때 사용됩니다. 이 때 윈도우 내의 글자 색과 글자 배경색까지 모두 동일하게 변경되므로 주의합니다.

#include <ncurses.h>

int main(void){
    initscr();
    start_color();

    init_color(1, 0, 1000, 0);
    init_color(2, 0, 0, 1000);
    init_pair(1, 1, 2);

    WINDOW * win = newwin(20, 20, 5, 5);
    box(win, '|', '-');

    wbkgd(win, COLOR_PAIR(1));      // 1번 Color pair로 Window 색상 설정
    wprintw(win, "Hello");

    refresh();
    wrefresh(win);
    getch();
    endwin();
}