Beginning Linux Programming Part6-Curses
Programming/System 2006. 6. 25. 16:59
여기서 윈도우라는건 콘솔에서 하는겁니당..
터미널 상에서 상자만드는것이죠
GTK,QT,API 이런거 아닙니다..
C대충 아시는 분은 뭐하는지 아실겝니다..
어짜피 다른거라고 해봤자 함수좀 쓰는거니까..
Curses는 도스랑도 꽤나 비슷한가 보군요 구글링 하니까 비슷하더라는..
다음은 요약본
*******윈도우 속성*************
#include<curses.h>
WINDOW initscr(void); //윈도우를 연다
int endwin(void); //윈도우를 닫는다
int move(int x,int y) //커서를 이동한다 x,y 좌표에 따라서,도스의 gotoxy랑 하는짓?은 비슷하다
printw(char *format...)//걍 문자열 출력 일반적 윈도우에서 쓰는 printf 라고 생각하자
int refresh(void);화면 다시 쓰기 (화면 새로 고침)
attron(chtype attribute);//해당 문자 속성을 켠다(A_BOLD,A_UNDERLINE,A_REVERSE.....)
attroff(chtype attribute);//해당 문자 속성을 끈다(옵션은 같이 붙여주면 됨)
ex>
7 initscr();//윈도우 시작
8
9 move(10,10);//Move..
10 printw("MAC vs Windows");//글자
11 refresh();//화면 reflash 해야 글자가 보임
12 sleep(1);
48
49 endwin();//윈도우 종료
*아래에 해당되는 함수는 윈도우의 시작과 끝 사이에 위치해야한다
(initscr();~endwin() 사이에)
int echo(void)//echo 켜기(print)
int noecho(void)//echo 끄기
int cbreak(void)//글자를 누르자 마자 직접 반응
int nocbreak(void)//cbreak 끄기
int raw(void) //특수문자 처리가 꺼짐(방향키등)
int noraw(void)//특수문자 처리가 가능
int getch(void) //설명이 필요 없다
int getstr(char *string) //문자열을 입력받는다
int getnstr(char *string,int stringsize)//n개의 문자를 입력받는다(Bufferoverflow 방지)
(strncmp memnset 같은 n 종류)
******Window 건드리기********
기본적인 순서는
1윈도우를 정의한다
2윈도우에 출력할 내용을 정한다
3표준화면에 윈도우를 적용한다
ex>
10 WINDOW *win1,*win2;//윈도우 구조체 선언(직접 건들진 못한다)
....
24 win1=newwin(10,20,15,12); //새창의 윈도우
25 mvwprintw(win1,2,2,"%s","Hello World! ");//들어갈 내용
26
27 win2=newwin(30,30,30,30);
28 mvwprintw(win2,2,3,"%s","ABCDEF~");
29
30 wrefresh(win2);
31 wrefresh(win1);//화면에 적용
아까 printw를 예로들자면
wprintw(WINDOW *winpointer,char *format,...);
mvprintw(int x,int y,char *format,...);
mvwprintw(WINDOW *winpointer,int y,int x,char *format,...);
w->WINDOW 포인터
mv->window mv(이동)
mvw->위에꺼 두개 합친것
box(WINDOW *winpointer,char x,char y) ?
상자를 만든다 x,y에다가는 각 테두리를 장식할 문자를 정해주면 된다
*******키패드**********
보통 initscr 했을때 키패드는 이스케이프 문자를 잠근다고 한다
이것을 풀기위해선
keypad()함수를 사용하면 된다
int keypad(WINDOW *winpoiter,TRUE/FALSE);
TRUE,FALSE 중 하나를 택하여 키패드 모드을 on/off한다
뭐 특별히 정해줄거 없으면 stdscr으로 해도 된다
보통 getch();로 받아서 이것을 swich문으로 Check하는데
거기서 키패드가 뭐가 눌렸는지 알수 있는 매크로는 다음과 같다
LOCAL_ESCAPE_KEY
KEY_UP,KEY_DOWN,KEY_RIGHT,KEY_LEFT
KEY_END,KEY_BEG
척 보면 다 아니깐 설명은 생략
ex> 설명은 귀찮아서 안해
14 do
15 {
16 mvprintw(10,15,"UP DOWN RIGHT LEFT Press Key....:");
17 refresh();
18
19 ch=getch();
20
21 clear();
22 move(10,50);
23
24 if(ch>='a' && ch <='z')
25 printw("%c",(char)ch);
26 else if(ch>='A' && ch <='Z')
27 printw("%c",(char)ch);
28 else if(ch>='0' && ch <='9')
29 printw("%c",(char)ch);
30
31 else
32 switch(ch){
33 case(KEY_RIGHT):
34 printw("RIGHT");
35 break;
36 case(KEY_LEFT):
37 printw("LEFT");
38 break;
39 case(KEY_UP):
40 printw("UP");
41 break;
42 case(KEY_DOWN):
43 printw("DOWN");
44 break;
45 default:
46 printw("KEY VALUE:%d",ch);
47 }
48
49 }while(ch != 'q');
*************색깔(color)****************
소스를 보면서 설명
18 has_colors(); //터미널이 색깔을 쓸수 있는지 확인
19 start_color(); //색깔쓰기 시작 안되면 에러메세지
20 init_pair(1,COLOR_RED,COLOR_BLACK); //여기서 부터 번호대로 색깔을 정의한다
21 init_pair(2,COLOR_BLUE,COLOR_WHITE);
22 init_pair(3,COLOR_CYAN,COLOR_YELLOW);
23 init_pair(4,COLOR_GREEN,COLOR_RED);
24 init_pair(5,COLOR_WHITE,COLOR_MAGENTA);
25 init_pair(6,COLOR_BLACK,COLOR_WHITE);
26 init_pair(7,COLOR_RED,COLOR_GREEN);
27 init_pair(8,COLOR_MAGENTA,COLOR_CYAN);
//RED,BLACK..이런 건 아마 curses.h에 메크로로 존재하는거 같다~!
29 for(i=1;i<9;i++){
30 attrset(COLOR_PAIR(i) | A_BOLD);//
31 //wattron(stdscr,COLOR_PAIR(i) | A_BOLD );
//일정 WINDOW 포인터에 적을때 사용지금은 그냥 stdscr이므로 위의 함수와 하는일이 같다
32 mvprintw(13+i,10,"%s%d %s%d",str1,i,str2,i);
//일정한 위치에 글자를 찍어라 앞에서도 봤던 함수 %d %s %c 같이 printf의 포맷과 비슷하다
33 refresh(); //전에도 말했지만 변경사항을 적용할려면 refresh함수를 써야한다
34 sleep(1); //바로 지나가므로 결과를 확인할수 있게 잠시 늦춤
35 }
********** 패드 (pad) **************
에 그러니까.. 패드라는건.. 나도 뭔가 했는데..
책에서 논리화면 물리화면 어쩼네~ 이러는건.. 이해가 안되서..
내가 내맘대로 이해한게 화면을 쓸수 있는 범위랄까 .. 그런걸 지정한다고
해버림
WINDOW *newpad(int number_of_lines,int number_of_columns);
뭐.. 설명이 필요할까
#include<curses.h> //외워 버렸네..
int prefresh(WINDOW *pad-ptr,int pad_row,int pad_column,
int screen_row_min,int screen_col_min,
int screen_row_max,int screen_col_min)
아따 길다.. 뭐이리 길어... 이것도 다 적혀있으니깐 해설은 Pass~
ex> //설명이구 뭐구 할께 없다.. 그 자체
사실 나도 별내용 없는거 같아서 책 내용 그대로 쳐봤다..
28 prefresh(pad,5,7,2,2,9,9);
29 sleep(1);
30
31 prefresh(pad,LINES +5,COLS +7,5,5,21,19);
32 sleep(1);
33 delwin(pad); //윈도우를 지운다
뒤에 뭐 CD 응용프로그램 만든다고 하는데..
나는 갈길이 바뻐서.. 뭐 이것도 넘어가기로 한다
아~ 그러니깐 이번 파트 끝이넹.. 이것도 2틀이나 걸렸다..(터미널이랑 같다?)
정말 의외로 시간이 정말 오래 걸리는군... 하아.. 뭐.. 이정도 속도로가면 한 3주내에
빠르면 2주만에 끝낼수도 잇을텐데.. (뭐.. 빼먹을 부분이 좀 있는지라)
다음은 11장 프로세스~
터미널 상에서 상자만드는것이죠
GTK,QT,API 이런거 아닙니다..
C대충 아시는 분은 뭐하는지 아실겝니다..
어짜피 다른거라고 해봤자 함수좀 쓰는거니까..
Curses는 도스랑도 꽤나 비슷한가 보군요 구글링 하니까 비슷하더라는..
다음은 요약본
*******윈도우 속성*************
#include<curses.h>
WINDOW initscr(void); //윈도우를 연다
int endwin(void); //윈도우를 닫는다
int move(int x,int y) //커서를 이동한다 x,y 좌표에 따라서,도스의 gotoxy랑 하는짓?은 비슷하다
printw(char *format...)//걍 문자열 출력 일반적 윈도우에서 쓰는 printf 라고 생각하자
int refresh(void);화면 다시 쓰기 (화면 새로 고침)
attron(chtype attribute);//해당 문자 속성을 켠다(A_BOLD,A_UNDERLINE,A_REVERSE.....)
attroff(chtype attribute);//해당 문자 속성을 끈다(옵션은 같이 붙여주면 됨)
ex>
7 initscr();//윈도우 시작
8
9 move(10,10);//Move..
10 printw("MAC vs Windows");//글자
11 refresh();//화면 reflash 해야 글자가 보임
12 sleep(1);
48
49 endwin();//윈도우 종료
*아래에 해당되는 함수는 윈도우의 시작과 끝 사이에 위치해야한다
(initscr();~endwin() 사이에)
int echo(void)//echo 켜기(print)
int noecho(void)//echo 끄기
int cbreak(void)//글자를 누르자 마자 직접 반응
int nocbreak(void)//cbreak 끄기
int raw(void) //특수문자 처리가 꺼짐(방향키등)
int noraw(void)//특수문자 처리가 가능
int getch(void) //설명이 필요 없다
int getstr(char *string) //문자열을 입력받는다
int getnstr(char *string,int stringsize)//n개의 문자를 입력받는다(Bufferoverflow 방지)
(strncmp memnset 같은 n 종류)
******Window 건드리기********
기본적인 순서는
1윈도우를 정의한다
2윈도우에 출력할 내용을 정한다
3표준화면에 윈도우를 적용한다
ex>
10 WINDOW *win1,*win2;//윈도우 구조체 선언(직접 건들진 못한다)
....
24 win1=newwin(10,20,15,12); //새창의 윈도우
25 mvwprintw(win1,2,2,"%s","Hello World! ");//들어갈 내용
26
27 win2=newwin(30,30,30,30);
28 mvwprintw(win2,2,3,"%s","ABCDEF~");
29
30 wrefresh(win2);
31 wrefresh(win1);//화면에 적용
아까 printw를 예로들자면
wprintw(WINDOW *winpointer,char *format,...);
mvprintw(int x,int y,char *format,...);
mvwprintw(WINDOW *winpointer,int y,int x,char *format,...);
w->WINDOW 포인터
mv->window mv(이동)
mvw->위에꺼 두개 합친것
box(WINDOW *winpointer,char x,char y) ?
상자를 만든다 x,y에다가는 각 테두리를 장식할 문자를 정해주면 된다
*******키패드**********
보통 initscr 했을때 키패드는 이스케이프 문자를 잠근다고 한다
이것을 풀기위해선
keypad()함수를 사용하면 된다
int keypad(WINDOW *winpoiter,TRUE/FALSE);
TRUE,FALSE 중 하나를 택하여 키패드 모드을 on/off한다
뭐 특별히 정해줄거 없으면 stdscr으로 해도 된다
보통 getch();로 받아서 이것을 swich문으로 Check하는데
거기서 키패드가 뭐가 눌렸는지 알수 있는 매크로는 다음과 같다
LOCAL_ESCAPE_KEY
KEY_UP,KEY_DOWN,KEY_RIGHT,KEY_LEFT
KEY_END,KEY_BEG
척 보면 다 아니깐 설명은 생략
ex> 설명은 귀찮아서 안해
14 do
15 {
16 mvprintw(10,15,"UP DOWN RIGHT LEFT Press Key....:");
17 refresh();
18
19 ch=getch();
20
21 clear();
22 move(10,50);
23
24 if(ch>='a' && ch <='z')
25 printw("%c",(char)ch);
26 else if(ch>='A' && ch <='Z')
27 printw("%c",(char)ch);
28 else if(ch>='0' && ch <='9')
29 printw("%c",(char)ch);
30
31 else
32 switch(ch){
33 case(KEY_RIGHT):
34 printw("RIGHT");
35 break;
36 case(KEY_LEFT):
37 printw("LEFT");
38 break;
39 case(KEY_UP):
40 printw("UP");
41 break;
42 case(KEY_DOWN):
43 printw("DOWN");
44 break;
45 default:
46 printw("KEY VALUE:%d",ch);
47 }
48
49 }while(ch != 'q');
*************색깔(color)****************
소스를 보면서 설명
18 has_colors(); //터미널이 색깔을 쓸수 있는지 확인
19 start_color(); //색깔쓰기 시작 안되면 에러메세지
20 init_pair(1,COLOR_RED,COLOR_BLACK); //여기서 부터 번호대로 색깔을 정의한다
21 init_pair(2,COLOR_BLUE,COLOR_WHITE);
22 init_pair(3,COLOR_CYAN,COLOR_YELLOW);
23 init_pair(4,COLOR_GREEN,COLOR_RED);
24 init_pair(5,COLOR_WHITE,COLOR_MAGENTA);
25 init_pair(6,COLOR_BLACK,COLOR_WHITE);
26 init_pair(7,COLOR_RED,COLOR_GREEN);
27 init_pair(8,COLOR_MAGENTA,COLOR_CYAN);
//RED,BLACK..이런 건 아마 curses.h에 메크로로 존재하는거 같다~!
29 for(i=1;i<9;i++){
30 attrset(COLOR_PAIR(i) | A_BOLD);//
31 //wattron(stdscr,COLOR_PAIR(i) | A_BOLD );
//일정 WINDOW 포인터에 적을때 사용지금은 그냥 stdscr이므로 위의 함수와 하는일이 같다
32 mvprintw(13+i,10,"%s%d %s%d",str1,i,str2,i);
//일정한 위치에 글자를 찍어라 앞에서도 봤던 함수 %d %s %c 같이 printf의 포맷과 비슷하다
33 refresh(); //전에도 말했지만 변경사항을 적용할려면 refresh함수를 써야한다
34 sleep(1); //바로 지나가므로 결과를 확인할수 있게 잠시 늦춤
35 }
********** 패드 (pad) **************
에 그러니까.. 패드라는건.. 나도 뭔가 했는데..
책에서 논리화면 물리화면 어쩼네~ 이러는건.. 이해가 안되서..
내가 내맘대로 이해한게 화면을 쓸수 있는 범위랄까 .. 그런걸 지정한다고
해버림
WINDOW *newpad(int number_of_lines,int number_of_columns);
뭐.. 설명이 필요할까
#include<curses.h> //외워 버렸네..
int prefresh(WINDOW *pad-ptr,int pad_row,int pad_column,
int screen_row_min,int screen_col_min,
int screen_row_max,int screen_col_min)
아따 길다.. 뭐이리 길어... 이것도 다 적혀있으니깐 해설은 Pass~
ex> //설명이구 뭐구 할께 없다.. 그 자체
사실 나도 별내용 없는거 같아서 책 내용 그대로 쳐봤다..
28 prefresh(pad,5,7,2,2,9,9);
29 sleep(1);
30
31 prefresh(pad,LINES +5,COLS +7,5,5,21,19);
32 sleep(1);
33 delwin(pad); //윈도우를 지운다
뒤에 뭐 CD 응용프로그램 만든다고 하는데..
나는 갈길이 바뻐서.. 뭐 이것도 넘어가기로 한다
아~ 그러니깐 이번 파트 끝이넹.. 이것도 2틀이나 걸렸다..(터미널이랑 같다?)
정말 의외로 시간이 정말 오래 걸리는군... 하아.. 뭐.. 이정도 속도로가면 한 3주내에
빠르면 2주만에 끝낼수도 잇을텐데.. (뭐.. 빼먹을 부분이 좀 있는지라)
다음은 11장 프로세스~
'Programming > System' 카테고리의 다른 글
MBR(?) 출력 하기 (2) | 2007.06.17 |
---|---|
screen attach dettach 구별법 (2) | 2007.02.12 |
ls -al (0) | 2006.06.21 |
Beginning linux programming (6) | 2006.03.01 |
VIRUS 제작~ (6) | 2006.01.03 |