2011년7월28일_네트워크프로젝트(3일차)-입력창(window)과 출력창을 나누어 출력, ncurses.h사용




  ● 채팅프로그램 방향정하기
  1. 입력 창과 로그창을 분리하여 보기 좋게함.  <-오늘 할 일
  2. 한 번에 여러 줄을 입력할 수 있게 입력처리부분을 추가
  3. TCP서버외에 UDP프로토콜을 사용하면 서버없이 클라이언트들 끼리 통신이 가능하지 않을까? 아니면...
    하나의 프로그램이 서버와 클라이언트 프로세스 둘 다 돌리면 될 것 같음.
  4. 채팅만 하면 지루하니 게임적인 요소를 추가. (몬스터를 잡으면 레벨업~!)
  5. 채팅서버의 IP를 입력하지 않으면 디폴트 채팅서버에 접속.



● layout

네이트온과 같은 메신저처럼 입력받는 박스를 밑에 두고 대화내용이 출력되는 박스는 위에 둔다.
접속자리스트는 특수명령을 입력하면 출력창에 추가되는 것으로 한다.




● 소스코드

   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:     int i;
  10:     
  11:     char buf[100];
  12:     const char *exit = "exit";
  13:  
  14:     initscr();
  15:     refresh();
  16:  
  17:     win_output = newwin(LINES - 10, COLS - 1, 1, 1);
  18:     box(win_output, 0, 0);
  19:     wrefresh(win_output);
  20:     
  21:     win_output_panel = newwin(LINES - 9, COLS, 0, 0);
  22:     box(win_output_panel, 0, 0);
  23:     wrefresh(win_output_panel);
  24:     
  25:     win_input = newwin(5, COLS, LINES - 10 + 1, 0);
  26:     box(win_input, 0, 0);
  27:     wrefresh(win_input);
  28:  
  29:     mvwprintw(win_output, 1, 10, "window내에 글자쓰기 테스트!!\n");
  30:     wrefresh(win_output);
  31:     
  32:     while(1)
  33:     {
  34:         mvwgetstr(win_input, 1, 1, buf);
  35:  
  36:         if(NULL != strstr(buf, exit))
  37:         {
  38:             break;
  39:         }
  40:         
  41:         wprintw(win_output, "%s\n", buf);
  42:         
  43:         for(i = 0 ; i < strlen(buf) ; i++)
  44:         {
  45:             buf[i] = 0x20;
  46:         }
  47:         
  48:         mvwprintw(win_input, 1, 1, "%s", buf);
  49:         wrefresh(win_output);
  50:         wrefresh(win_input);
  51:     }
  52:     
  53:     endwin();
  54: }

불필요하게 리프레시를 많이 하는 소스코드이다.
사용자가 보는 시점에 리프레시하면 된다. 알아서 수정해서 쓰세요. ㅎㅎ


<실행결과>



문제가 있는데 ‘\n’개행문자를 출력하면 박스의 오른쪽이 없어진다. ㅠㅠ
그리고 더욱 치명적인 버그(?)가 있는데…

마지막 줄에 가면 개행이 되지 않는다. ㅠㅠ




참조(Reference)



http://wiki.kldp.org/wiki.php/NCURSES-Programming-HOWTO?action=show&redirect=FindPage