NCURSE 로 만들어 보는 유저 인터페이스(UI) - 5회 폰트에 색(COLOR)을 입히자 - 2009/02/09 17:12

이번 시간은 컬러 문자 출력 방법을 알아 볼 것 입니다.

리스팅1은 예로써 사용될 NCURSE 프로그램이며 아래의 그림은 그 실행 결과(예제 color 실행 결과)입니다.

 
예제 color 실행 결과
 
리스팅 1


#include <ncurses.h>

/*
사용 가능한 색상의 속성 필드
======================================
#define COLOR_BLACK     0
#define COLOR_RED       1
#define COLOR_GREEN     2
#define COLOR_YELLOW    3
#define COLOR_BLUE      4
#define COLOR_MAGENTA   5
#define COLOR_CYAN      6
#define COLOR_WHITE     7
*/

//
// Ncurse 폰트 컬러 속성
//
int main(void)
{
        int y, x;

        initscr();

        /* set default init mode */
        noecho();
        raw();

// sector #01
        if(has_colors() == FALSE)
        {
                endwin();
                printf("Your terminal does not support color\n");
                exit(1);
        }
        start_color();

// sector #02
        if(init_color(COLOR_BLUE, 0, 0, 300) == ERR)
        {
                printw("your terminal cannot change the color definitions\n");
                printw("press any key to continue . . .\n");
                getch(); move(0,0);
        }

// sector #03
        init_pair(1, COLOR_RED, COLOR_BLACK);
        init_pair(2, COLOR_GREEN, COLOR_BLACK);
        init_pair(3, COLOR_YELLOW, COLOR_BLACK);
        init_pair(4, COLOR_BLUE, COLOR_BLACK);
        init_pair(5, COLOR_MAGENTA, COLOR_BLACK);
        init_pair(6, COLOR_CYAN, COLOR_BLACK);
        init_pair(7, COLOR_WHITE, COLOR_BLACK);
        init_pair(8, COLOR_CYAN, COLOR_MAGENTA);

// sector #04
        attron(A_BOLD);

// sector #05
        attron(COLOR_PAIR(1));
        printw("What's your favorite color(COLOR_RED)\n");
        attron(COLOR_PAIR(2));
        printw("What's your favorite color(COLOR_GREEN)\n");
        attron(COLOR_PAIR(3));
        printw("What's your favorite color(COLOR_YELLOW)\n");
        attron(COLOR_PAIR(4));
        printw("What's your favorite color(COLOR_BLUE)\n");
        attron(COLOR_PAIR(5));
        printw("What's your favorite color(COLOR_MAGENTA)\n");
        attron(COLOR_PAIR(6));
        printw("What's your favorite color(COLOR_CYAN)\n");
        attron(COLOR_PAIR(7));
        printw("What's your favorite color(COLOR_WHITE)\n");
        attron(COLOR_PAIR(8));
        printw("What's your favorite color(NORMAL)\n");

        attrset(A_BOLD);
        getmaxyx(stdscr,y,x);
        mvprintw(y-1,0,"%s","Enter the any button to exit!");
        getch();

        endwin();
        return 0;
}

/* 04_color.c */



 
본 칼럼에서 사용된 예제를 직접 동작 시켜보기 위하여는 '04_color.c' 라는 새 파일을 만드신 후 리스트1의 소스를 카피 해 넣으시고 아래의 컴파일및 실행요령을 따라 하시면 되겠습니다.
 
컴파일및 실행요령

gcc -o color 04_color.c -lncurses

./color [엔터]


 
 
소스해설
 
has_colors()
리스팅1의 [sector #01]을 보시면 has_colors 라는 함수가 사용된 것을 알 수 있습니다. 현재의 단말기(Terminal)이 컬러를 지원 하는지 유무를 확인하는 함수 입니다. 단말기가 컬러를 표현하지 못한다면 당연지사 금번 칼럼에서의 예제는 정상 동작 하지 못하겠지요.
 
start_color()
이 함수는 컬러폰트를 사용 하기에 앞서 항상 해 줘야 하는 초기화 함수로 이해 하시면 됩니다.

init_pair()
[sector #03]을 먼저 설명 하도록 하지요. 리스트1의 상단을 보시면 컬러 값들이 상수 정의 된 것을 보실 수 있을 것입니다. 결론을 먼저 말씀 드리자면 ncurse 에서 사용 가능한 폰트 색상은 8가지 로 제한됩니다. 다만, 이들 컬러를 이용하여 폰트 전경색, 배경색 조합하여 다양한 표현을 할 수는 있습니다.
init_pair 함수는 이 색상 테이블을 만들때 사용 하는 함수입니다. 일종의 폰트 색상 팔레트로 보시면 정확 할 듯 싶군요.
하나만 예를 들어 보자면, init_pair(1, COLOR_RED, COLOR_BLACK); 의 경우 팔레트 넘버 '1'로서 폰트의 전경색(Fore ground color)은 적색으로 그리고 배경색(Back ground color)은 검정색으로 선언 하고 있습니다.
만들 수 있는 팔레트의 최대(MAX) 갯수는 해 보지 않아서 모르겠습니다. 관심 있으신 분은 실제로 만들어 보시면 확인 하 실수 있겠습니다. [sector #03]에서는 실제로 팔레트를 8개 까지만 만들고 있지만 그 이상도 얼마든지 만들 수 있다는 이야기 였습니다.
 
COLOR_PAIR()
COLOR_PAIR 함수와 이전 시간에 공부 하였던 attron 함수의 합작품이군요. [sector #05]을 보시죠. 원하는 색상을 내가 만든 색상 팔레트에서 찾아서 그 팔레트 번호를 확인하여 이런 식으로 사용 하면 됩니다.
attron(COLOR_PAIR(1)); 폰트의 색상을 팔레트 '1'을 참조 하였으니까?. 그러니까 . . . 적색이겠군요. 그 배경색은 BLACK 이겠구요.
하나만 더 해 볼까요? attron(COLOR_PAIR(6)); 팔레트 '6'번 이군요. 그러니까 CYAN 이겠습니다.
 
지금까지 ncurse의 출력 함수들을 다루어 보았으며 이로서 ncurse 가 하는 일(용도)의 윤곽이 어느 정도 드러난 셈이 되었습니다.
따라서 이제 부터 이야기의 전개가 한결 편해 질 듯 싶군요.

NEXT . . .
posted by 가일(GUILE)

♡ 포스팅이 유익 하셨다면 E-mail로 가일의 임베디드 스쿨을 구독하세요->

Trackback Address :: http://www.hongikcom.com/trackback/25 관련글 쓰기
Name
Password
Homepage
Secret
< PREV |  1  |  ...  104  |  105  |  106  |  107  |  108  |  109  |  110  |  111  |  112  |  ...  131  |  NEXT >