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: }


<실행결과>


숫자를 순서대로 입력하여 스크롤이 제대로 되는지 확인하였다.
그러나 아쉽게도 여러 줄 입력은 해보지 못 하였다.
다음 기회에...