2011년7월29일_네트워크프로젝트(4일차)-출력창(window)가 자동스크롤되도록 scrollok() 사용, window의 외형을 보호하기 위한 방법
어제는 입력창과 출력창을 나누는데 성공하였으나 출력창이 스크롤되지 않아,
다른 사람들처럼 배열 또는 연결리스트를 사용하여 화면에 출력할 내용을 저장한 후 내부적인 처리를 한 후 화면에 출력할까하다가...
너무 비효율적인 것 같고 window설정을 하는 함수가 있을 것 같아 찾아 보기로 하였다.
//구글검색 결과 스크린샷이 놓일 곳.
ncurses관련 함수들을 찾아 보니 많이 나왔고 그 중에 내가 원하는 scrollok()를 찾았다.
사용법은 아래와 같다.
첫 번째 인자로는 window의 구조체를 넘겨주고,
두 번째 인자는 활성화할 것이니 TRUE를 넣어주자.
19: scrollok(win_output, TRUE);
그리고 박스표시를 보호하기 위해 입력창과 출력창에 window를 하나 더 사용하였다.
18: win_output = newwin(LINES - 7, COLS - 2, 1, 1);
21: win_output_panel = newwin(LINES - 5, COLS, 0, 0);
25: win_input_panel = newwin(5, COLS, LINES - 5 , 0);
28: win_input = newwin(3, COLS - 2, LINES - 4 , 1);
실제 내용이 입력되고 출력되는 window는 박스표시 window보다 1칸씩 작게 만들었다.
테스트 소스코드는 아래와 같다. (주석처리한 부분은 필요없는 부분이지롱~)
<소스코드>
1: #include <ncurses.h>
2: #include <string.h>
3:
4: int main()
5: {
6: WINDOW *win_input;
7: WINDOW *win_output;
8: WINDOW *win_output_panel;
9: WINDOW *win_input_panel;
10: int i;
11:
12: char buf[100];
13: const char *exit = "exit";
14:
15: initscr();
16: refresh();
17:
18: win_output = newwin(LINES - 7, COLS - 2, 1, 1);
19: scrollok(win_output, TRUE);
20: wrefresh(win_output);
21: win_output_panel = newwin(LINES - 5, COLS, 0, 0);
22: box(win_output_panel, 0, 0);
23: wrefresh(win_output_panel);
24:
25: win_input_panel = newwin(5, COLS, LINES - 5 , 0);
26: box(win_input_panel, 0, 0);
27: wrefresh(win_input_panel);
28: win_input = newwin(3, COLS - 2, LINES - 4 , 1);
29:
30: mvwprintw(win_output, 1, 10, "window내에 글자쓰기 테스트!!\n");
31: wrefresh(win_output);
32:
33: while(1)
34: {
35: mvwgetstr(win_input, 1, 1, buf);
36:
37: if(NULL != strstr(buf, "exit"))
38: {
39: break;
40: }
41:
42: wprintw(win_output, "%s\n", buf);
43:
44: //buf[strlen(buf) + 1] = '\0';
45: //buf[strlen(buf)] = '\n';
46:
47: //waddstr(win_output, buf);
48: /*
49: for(i = 0 ; i < strlen(buf) ; i++)
50: {
51: buf[i] = 0x20;
52: }
53:
54: mvwprintw(win_input, 1, 1, "%s", buf);
55: */
56: wclear(win_input);
57: wrefresh(win_output);
58: wrefresh(win_input);
59: }
60:
61: endwin();
62: }
<실행결과>
숫자를 순서대로 입력하여 스크롤이 제대로 되는지 확인하였다.
그러나 아쉽게도 여러 줄 입력은 해보지 못 하였다.
다음 기회에...
'프로젝트' 카테고리의 다른 글
2011년8월10일_네트워크프로젝트(7일차)-출력창내용보존법 찾기(결과는 실패) (4) | 2011.08.11 |
---|---|
2011년8월9일_네트워크프로젝트(6일차)-출력창 스크롤하여 내용이 살아 있나 확인. (테스트 결과 실패) (0) | 2011.08.10 |
2011년8월8일_네트워크프로젝트(5일차)-입력창(window)에 여러 줄의 문자열을 입력하기(결과는 실패) (0) | 2011.08.09 |
2011년7월28일_네트워크프로젝트(3일차)-입력창(window)과 출력창을 나누어 출력, ncurses.h사용 (0) | 2011.07.29 |
2011년7월27일_선생님의 채팅프로그램 소스코드(chat_server.c, chat_client.c)의 전체적인 흐름과 분석, 네트워크프로젝트 계획 (1) | 2011.07.27 |