NCURSE 로 만들어 보는 유저 인터페이스(UI) - 7회 윈도우를 만들어 보자 - 2009/02/09 17:13

이번 시간은 커스를 이용한 윈도우 생성 방법과 그 의의를 알아 볼 것 입니다.

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

 
예제 window 실행 결과
 
리스팅 1


#include <ncurses.h>

//
// 가상 윈도우를 만들어 본다
//
#include <ncurses.h>

WINDOW *create_newwin(int height, int width, int starty, int startx);
void destroy_win(WINDOW *local_win);


int main(void)
{
        WINDOW *my_win;
        int startx, starty, width, height;
        int ch;


        initscr(); /* Start curses mode */

        keypad(stdscr, TRUE); /* I need that nifty F8 */

// sector #01
        cbreak(); /* Line buffering disabled, Pass on everty thing to me */

        height = 9;
        width = 30;

        starty = (LINES - height) / 2; /* Calculating for a center placement */
        startx = (COLS - width) / 2; /* of the window */

        printw("Press F8 to exit");
        refresh();

// sector #02
        my_win = create_newwin(height, width, starty, startx);

// sector #03
        while((ch = getch()) != KEY_F(8))
        {
                switch(ch)
                {
                        case KEY_LEFT:
// sector #04
                                destroy_win(my_win);
                                my_win = create_newwin(height, width, starty, --startx);
// sector #05
                                wprintw(my_win,"left");
                                wrefresh(my_win);
                                break;
                        case KEY_RIGHT:
                                destroy_win(my_win);
                                my_win = create_newwin(height, width, starty,++startx);
                                wprintw(my_win,"right");
                                wrefresh(my_win);
                                break;
                        case KEY_UP:
                                destroy_win(my_win);
                                my_win = create_newwin(height, width, --starty,startx);
                                wprintw(my_win,"up");
                                wrefresh(my_win);
                                break;
                        case KEY_DOWN:
                                destroy_win(my_win);
                                my_win = create_newwin(height, width, ++starty,startx);
                                wprintw(my_win,"down");
                                wrefresh(my_win);
                                break;
                }
        }
        endwin(); /* End curses mode */
        return 0;
}


WINDOW *create_newwin(int height, int width, int starty, int startx)
{
        WINDOW *local_win;

// sector #06
        local_win = newwin(height, width, starty, startx);

// sector #07
#if 1
        box(local_win, 0 , 0); /* 0, 0 gives default characters for the vertical and horizontal lines */
#else
        wborder(local_win, '|', '|', '.', '.', '+', '+', '+', '+');
#endif
        wrefresh(local_win); /* Show that box */
        return local_win;
}


void destroy_win(WINDOW *local_win)
{
        /* box(local_win, ' ', ' '); : This won't produce the desired
        * result of erasing the window. It will leave it's four corners
        * and so an ugly remnant of window.
        */
// sector #08
        wborder(local_win, ' ', ' ', ' ',' ',' ',' ',' ',' ');
        /* The parameters taken are
        * 1. win: the window on which to operate
        * 2. ls: 윈도우 좌 라인
        * 3. rs: 윈도우 우 라인
        * 4. ts: 윈도우 상 라인
        * 5. bs: 윈도우 하 라인
        * 6. tl: 윈도우 좌상 포인트
        * 7. tr: 윈도우 우상 포인트
        * 8. bl: 윈도우 좌하 포인트
        * 9. br: 윈도우 우하 포인트
        */
        wrefresh(local_win);
        delwin(local_win);
}

/* 07_window.c */



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

gcc -o window 07_window.c -lncurses

./window [엔터]


 
 
소스해설
 
cbreak()
이 함수는 일전의 예에서도 소개 되었지마는 제어문자까지도 응용 프로그램에서 가로 채어 사용 할 수 있게 해주는 기능을 가집니다.
 
create_newwin()
[sector #02]에서 보이는 이 사용자 정의 함수는 윈도우를 생성하고 사용하게 합니다. 함수의 인자를 보시면 됩니다만 윈도우의 가로, 세로폭과 원점 좌표를 입력 받게 됩니다.

KEY_F(8)
keypad() 함수를 이용하면 이런 문자도 입력 받아 처리(인식) 할 수 있게 됩니다. 특수키인 'F8' 을 확인 합니다.
'ncurses.h' 파일의 후반부를 보시면 이렇게 사용 할 수 있는 키보드 자판 입력이 다음과 같이 리스트 되어 있습니다.
 
#define KEY_DOWN 0402  /* down-arrow key */
#define KEY_UP  0403  /* up-arrow key */
#define KEY_LEFT 0404  /* left-arrow key */
#define KEY_RIGHT 0405  /* right-arrow key */
#define KEY_HOME 0406  /* home key */
#define KEY_BACKSPACE 0407  /* backspace key */
중략 . . .
 
destroy_win()
[sector #04]에서 보이는 이 사용자 정의 함수는 윈도우를 제거 합니다. 섹터#4 이후의 함수에서는 사용자 방향키 입력을 받아 윈도우를 새로 생성하고 기존의 윈도우는 제거 하도록 동작을 반복 하게 되어 있습니다.
 
newwin()
커스 API newwin() 함수는 윈도우를 신규로 생성합니다. [sector #07] 에서는 신규로 생성된 윈도우를 대상으로 경계벽을 그리고(drawing) 있습니다.
box() 함수로 실행 해 보시고, 코드를 수정하여 wborder() 함수로도 실행 해 보시면 그 차이를 확인 하실 수 있을 것입니다.
wborder() 안의 인자(argument) 8개에 대하여는  [sector #08] 안의 주석(remark)을 확인 하시면 되는데, 이는 윈도우 경계벽을 그릴 문자를 함수 인자로 넘겨 받고 있는 것입니다.
 
지금까지 ncurse 프로그램의 입력, 출력 방법을 알아 보았으며 이번 회로써 윈도우를 만드는 법까지 알아 보았습니다.
다음 회가 ncurse 연재 마지막 회가 될 것 같군요.
 
다음 시간에 뵙겠습니다.
NEXT . . .
posted by 가일(GUILE)

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

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