NCURSES란 ?
텍스트모드에서 Window, Panel, Menu, Mouse, Color등을 쉽게 사용할 수 있도록 도와주는 라이브러리입니다. curses라이브러리도 거의 같은 역할을 합니다. ncurses는 curses의 새로운 버전입니다.(new curses)
NCURSES설치?
NCURSES는 LINUX 라이브러리 이며, 현재 최신 버전의 리눅스의 경우 gcc같은 개발프로그램 설치시 자동으로 설치됩니다.
NCURSES를 사용하려면?
#include <ncurses.h> //소스파일 안에 추가
컴파일시
gcc 소스파일네임 -lncurses
NCURSES FUNCTIONS
$설정 및 초기화 관련 함수
♦initscr()
curses모드를 시작한다. curses를 사용하기 위해 반드시 써줘야 한다.
♦endwin()
curses모드를 종료한다. curses모드를 사용하고 종료할 때 반드시 써줘야한다.
만약 endwin()을 하지 않고 프로그램이 종료됐을 경우 텍스트 모드의 이상을
가져 올수 있다.
♦raw() and cbreak()
Line buffering을 사용할지의 유무를 설정한다. 사용할 경우 cbreak, 사용하지 않고자
할 경우 raw를 사용하면된다. 보통 기본설정은 사용을 하는 것으로 되어있다.
♦echo() and noecho()
사용자로부터 입력을 받은 문자를 출력할지 여부를 결정한다. echo는 출력
noecho는 출력을 하지 않는다. (getch 함수 사용시)
♦keypad()
F1, F2, 방향키 등과 같이 특수한 키들을 사용할 수 있게 해준다.
keypad(stdscr, TRUE);
KEY_F(1)~ KEY_F(12)
KEY_LEFT, KEY_RIGHT, KEY_UP, KEY_DOWN
♦color_start()
color모드를 시작한다. 색깔을 넣고자 할때 전에 반드시 써주어야 하는 함수이다.
(has_colors()의 리턴값이 TRUE 일때만 사용가능하다.)
&출력 관련 함수
♦refresh()
화면에 찍은 내용을 갱신한다. curses 모드에서는 출력함수를 이용해 출력해도
refresh()를 쓰기전까진 화면에 나타나지 않는다.
♦clear()
화면을 깨끗이 지운다.
♦printw
printf와 쓰임새와 사용방법이 같다.(curses 모드가 시작된 이후 종료되기 전까지는
printf와 같은 일반 출력화수로는 화면에 출력할 수 없다.)
ex)
printw("string\n");
printw("%s\n", "string");
....
♦addch
putchar와 같이 char의 글자 하나를 출력할 때 사용한다. putchar와다른 점이라면 curses 모드에서 사용할 수 있는 옵션 줄 수 있다.
ex)
#include<ncurses.h>
int main(void){
int cnt;
char s[] = "SPLUG";
initscr();
addch(s[0]|A_BOLD);
for (cnt = 1; cnt < 5; cnt++)
addch(s[cnt]);
refresh();
endwin();
}
♦addstr()
addstr(string) 해당 문자열을 출력한다.
♦move(y,x)
y줄 x번째로 커서를 이동시킨다. x, y의 값은 0~화면의 최대크기 의 int 값을
갖는다. 화면의 범위를 벋어날 경우 세그멘테이션 오류가 날 수 있다.
♦mvprintw(), mvaddch()
move한 뒤 printw, addch한것과 같은 결과를 출력한다.
예를 들면
move(10, 10);
printw("This is 10, 10");
이것은
mvprintw(10, 10, "This is 10, 10");
과 같다.
&입력 관련 함수
♦scanw() and mvscanw()
scanw는 scanf와 사용방법과 쓰임이 같다. 해당 문자열이나 char int등을 입력 받는다.
mvscanw는 mvprinw와 비슷하게 해당 좌표로 이동후 입력을 받는다.
mvscanw(row, col, "%d", int *);
♦getstr()
string입력을 받는다.
ex)
char str[10];
getstr(str);
이렇게 하면 ‘\n'를 입력박기전까지의 문자열을 str에 저장한다.
♦getch()
한 문자를 사용자로부터 입력을 받는다. getchar과는 달리 ‘\n'문자를 입력 받을 때까지
기다리지 않고 바로 입력받은 문자 하나를 리턴해주고 종료한다. 입력받은 문자의 표기 유무는 echo() : 유 와 noecho() : 무로 선택한다.
&&Attributes
글자에 특수한 효과를 주기 위해 사용된다.
★attron() and attrset()
글자에 특수한 효과를 준다. attron() 중첩사용하면 중첩효과를 attrset()은 그 밑으로 모두 설정을 attrset()로 해준다.
♦사용 방법
attron(인자);
한꺼번에 여러효과를 주고자할 때 |(OR)를 이용하면 된다.
attron(인자1| 인자2);
이렇게 하면 인자1과 인자2의 효과가 중첩되어 나타난다. 중첩갯수에 제한 없음.
♦인자들
A_NORMAL : Normal display (no highlight)
A_STANDOUT : Best highlighting mode of the terminal.
A_UNDERLINE : Underlining
A_REVERSE : Reverse video
A_BLINK : Blinking
A_DIM : Half bright
A_BOLD : Extra bright or bold
A_PROTECT : Protected mode
A_INVIS : Invisible or blank mode
A_ALTCHARSET : Alternate character set
A_CHARTEXT : Bit-mask to extract a character
COLOR_PAIR(n) : Color-pair number n
♦attroff()
attron()이나 attrset()으로 준 효과를 끈다. 인자는 attron(), attrset()과 동일하다.
ex)
attron(A_BLINK);
printw("HI!!\n");
attroff(A_BLINK);
♦init_pair()
컬러를 설정할 때 쓰인다.
init_pair(int index, int font_color, int blink_color);
여기서 index는 설정한 color쌍을 불러 낼때 쓰이게 되는번호이다. 1보다 크거나 같은수 지정 가능
두 번째인자는 글씨색을 세 번째 색은 블록의 색깔을 의미한다.
여기서 색은 ncurse라이브러리에 미리 정의 되어있다.
COLOR_BLAACK 0
COLOR_RED 1
COLOR_GREEN 2
COLOR_YELLOW 3
COLOR_BLUE 4
COLOR_MAGENTA 5
COLOR_CYAN 6
COLOR_WHITE 7
♦init_color()
미리 정의되어 있는 색깔을 바꿀수 있다.
예를 들어 COLOR_RED의 색깔을 재 정의 하고자 할 경우
init_color(COLOR_RED, r, g, b);
여기서 r, g, b는 각각 red, green, blue의 삼원색으로 0~ 1000사이의 값을 가진다.
♦COLOR_PAIR(n)
attron(), attset(), attroff()의 인자로 쓰인다.
여기서 n은 앞에서 init_pair()에서 첫 번째 인자로 숫자로 들어간 수와 일치 한다.
0은 보통 모양을 의미 한다.
♦mvchgat()
attron(COLOR_PAIR(n))과 유사한 효과를 내는 데 쓰인다.
mvchgat(int start_Y, int start_X, int char_num, Attribute, int index, NULL)
첫 번째와 두 번째는 효과를 주려고하는 곳의 시작 부분을 세 번째 인자는 효과를 주고자
하는 문자의 숫자를 의미한다. 여기서 -1은 라인의 끝까지를 의미한다. Attribute는 A_BOLOD나 A_BLINK와 같은 효과를 의미한다. 네 번째 인자는 init_pair()에서 설정해준 color 쌍의 인덱스 번호와 일치한다. 역시 0은 기본 모양. 마지막인자는 항상 NULL이다.
&현재 정보를 얻는 함수들
♦getmaxyx()
현재 화면의 가로 세로의 크기를 구한다.
getmaxyx( win, max_y, max_x);
win의 y값의 크기와 x값의 크기를구해 각각 max_y, max_x에 넣어준다.
역기서 win은 window포인터를 의미하며 표준화면은 stdscr을 넣어주면 된다.
♦getyx()
현재 커서의 위치를 구한다.
getyx(win, y, x);
win(window pointer)의 커서의 위치를 찾아 y, x에 넣어준다.
&ACS 문자들(특수문자)
ncurses에서는 여러 가지 특수한 문자들을 ACS_xxx 이런식으로 미리 정의해 놓았다. 여기서 원하는 문자를 찍고자할 때
미리 정의된 것을 이용하면 손쉽게 찍을 수 있다.
$커서 설정
curs_set() 이용하여 설정하며 0~2사이의 인자값을 가진다. 0에 가까울수록 커서가 안보인다.
ex ) curs_set(0);
&마우스 이벤트
간단한 마우스 이벤트도 ncurses를 통해서 제어 할 수 있다.
♦이벤트 얻기(getmouse())
MEVENT event;
ch = getch();
if(ch == KEY_MOUSE)
if(getmouse(&event) == OK)
{
/*Do some thing with the event*/
}
ncurses에서는 MEVENT 라는 구조체가 미리 정의 되어있다.
구조체를 살펴보면
typedef struct {
short id; //device id
int x, y, z; //마우스의 커서 위치
mmask_t bstat; //버튼의 상태 비트를 나타낸다.
}
사용방법은 event라고 선언된 구조체에 마우스 이벤트를 받았다면
마우스버튼 1을 눌렀는지를 검사하려면
if(event.bstat & BUTTON1_PRESSED)
printw("Left button pressed");
이런식으로 해주면 된다.
Name Description
---------------------------------------------------------------------
BUTTON1_PRESSED mouse button 1 down
BUTTON1_RELEASED mouse button 1 up
BUTTON1_CLICKED mouse button 1 clicked
BUTTON1_DOUBLE_CLICKED mouse button 1 double clicked
BUTTON1_TRIPLE_CLICKED mouse button 1 triple clicked
BUTTON2_PRESSED mouse button 2 down
BUTTON2_RELEASED mouse button 2 up
BUTTON2_CLICKED mouse button 2 clicked
BUTTON2_DOUBLE_CLICKED mouse button 2 double clicked
BUTTON2_TRIPLE_CLICKED mouse button 2 triple clicked
BUTTON3_PRESSED mouse button 3 down
BUTTON3_RELEASED mouse button 3 up
BUTTON3_CLICKED mouse button 3 clicked
BUTTON3_DOUBLE_CLICKED mouse button 3 double clicked
BUTTON3_TRIPLE_CLICKED mouse button 3 triple clicked
BUTTON4_PRESSED mouse button 4 down
BUTTON4_RELEASED mouse button 4 up
BUTTON4_CLICKED mouse button 4 clicked
BUTTON4_DOUBLE_CLICKED mouse button 4 double clicked
BUTTON4_TRIPLE_CLICKED mouse button 4 triple clicked
BUTTON_SHIFT shift was down during button state change
BUTTON_CTRL control was down during button state change
BUTTON_ALT alt was down during button state change
ALL_MOUSE_EVENTS report all button state changes
REPORT_MOUSE_POSITION report mouse movement
[출처] NCURSES란 ? |작성자 벤치
'프로그래밍' 카테고리의 다른 글
[QBASIC]XP속에 숨겨진 마소의 오래된 컴파일러... (0) | 2011.07.23 |
---|---|
[C언어] 이진파읽 읽기//쓰기 (0) | 2009.09.27 |