項目之——窗口顯示

  這兒把窗口分成了4個區域,歡迎詞條頭部,輸出聊天記錄,好友列表,輸入框。由於輸出聊天記錄與好友列表需用到其它目錄(內存池)下的內容,我這兒是先把它單獨編譯,所以還無法實現其功能,之後整合後會補充。

  此外,這兒還用到了另一開源庫ncurses,可自行下載。

chat_window.h

  1 #include<iostream>
  2 #include<string>
  3 #include<string.h>
  4 #include<ncurses.h>
  5 
  6 #define SIZE 1024
  7 
  8 class chat_window
  9 {
 10 public:
 11     chat_window();
 12     ~chat_window();
 13     void create_header();
 14     void create_output();
 15     void create_friendList();
 16     void create_input();
 17     WINDOW* create_newwin(int height,int width,int starty,int startx);
 18     WINDOW* getHeader();
 19     WINDOW* getOutput();
 20     WINDOW* getFriendList();
 21     WINDOW* getInput();
 22     void fflush_win(WINDOW* p);
 23     void clear_win_line(WINDOW* p,int begin,int lines);
 24     void put_str_to_win(WINDOW* win,int starty,int startx,const std::string& msg);
 25     std::string get_str_from_win(WINDOW* win);
 26     void* drawHeader(void* arg);
 27     void* drawOutput(void* arg);
 28     void* drawFriendList(void* arg);
 29     void* drawInput(void* arg);
 30 //public:
 31 private:
 32     WINDOW* header;
 33     WINDOW* output;
 34     WINDOW* friendList;
 35     WINDOW* input;
 36 };

chat_window.cpp

  1 #include "chat_window.h"
  2 
  3 chat_window::chat_window()
  4 {   
  5     initscr();
  6 }
  7 chat_window::~chat_window()
  8 {
  9 //  destory_win(getHeader());//本來是打算封裝一個函數來清除窗口,後來直接調用刪除窗口的函數,沒有封裝
 10 //  destory_win(getOutput());
 11 //  destory_win(getFriendList());
 12 //  destory_win(getInput);
 13     
 14     delwin(getHeader());
 15     delwin(getOutput());
 16     delwin(getFriendList());
 17     delwin(getInput());
 18     endwin();
 19 }
 20 void chat_window::create_header()
 21 {   
 22     int _h=LINES/5;
 23     int _w=COLS;
 24     int _y=0;
 25     int _x=0;
 26 
 27     header=create_newwin(_h,_w,_y,_x);
 28     fflush_win(header);
 29 }
 30 void chat_window::create_output()
 31 {
 32     int _h=(LINES*3)/5;
 33     int _w=(COLS*3)/4;
 34     int _y=LINES/5;
 35     int _x=0;
 36     output=create_newwin(_h,_w,_y,_x);
 37     fflush_win(getOutput());
 38 }
 39 void chat_window::create_friendList()
 40 {
 41     int _h=(LINES*3)/5;
 42     int _w=COLS/4;
 43     int _y=LINES/5;
 44     int _x=(COLS*3)/4;
 45     friendList=create_newwin(_h,_w,_y,_x);
 46     fflush_win(getFriendList());
 47 }
 48 void chat_window::create_input()
 49 {
 50     int _h=LINES/5;
 51     int _w=COLS;
 52     int _y=(LINES*4)/5;
 53     int _x=0;
 54     input=create_newwin(_h,_w,_y,_x);
 55     fflush_win(getInput());
 56 }
 57 WINDOW* chat_window:: create_newwin(int height,int width,int starty,int star    tx)
 58 {
 59     WINDOW* local_win=newwin(height,width,starty,startx);
 60     box(local_win,0,0);
 61     return local_win;
 62 }
 63 WINDOW* chat_window::getHeader()
 64 {
 65     return header;
 66 }
 67 WINDOW* chat_window::getOutput()
 68 {
 69     return output;
 70 }
 71 WINDOW* chat_window::getFriendList()
 72 {
 73     return friendList;
 74 }
 75 WINDOW* chat_window::getInput()
 76 {
 77     return input;
 78 }
 79 void chat_window::put_str_to_win(WINDOW* win,int starty,int startx,const std    ::string& msg)
 80 {
 81     mvwaddstr(win,starty,startx,msg.c_str());
 82 }
 83 std::string chat_window::get_str_from_win(WINDOW* win)
 84 {
 85     char msg[SIZE];
 86     memset(msg,'\0',sizeof(msg));
 87     wgetnstr(win,msg,SIZE);
 88     return msg;
 89 }
 90 void chat_window::fflush_win(WINDOW* p)
 91 {
 92     box(p,0,0);
 93     wrefresh(p);
 94 }
 95 void chat_window::clear_win_line(WINDOW* p,int begin,int lines)
 96 {
 97     while(lines--)
 98     {
 99         wmove(p,begin++,0);
100         wclrtoeol(p);
101     }
102 }
103 void* drawHeader(void* arg)
104 {
105     chat_window* winp=(chat_window*)arg;
106     std::string _msg="Welcome!";
107     winp->create_header();
108 
109     int _max_y,_max_x;
110     getmaxyx(winp->getHeader(),_max_y,_max_x);
111     int _y=_max_y/2;
112     int _x=0;
113 
114     while(1)
115     {
116         winp->put_str_to_win(winp->getHeader(),_y,_x,_msg);
117         winp->fflush_win(winp->getHeader());
118         usleep(100000);
119         winp->clear_win_line(winp->getHeader(),_y,2);
120         _x++;
121         _x%=_max_x;
122     }
123 }
124 void* drawOutput(void* arg)
125 {
126     chat_window* winp=(chat_window*)arg;
127     winp->create_output();
128     while(1)
129     {
130         winp->fflush_win(winp->getOutput());
131         usleep(1000000);
132     }
133 }
134 void* drawFriendList(void* arg)
135 {
136     chat_window* winp=(chat_window*)arg;
137     winp->create_friendList();
138     while(1)
139     {
140         winp->fflush_win(winp->getFriendList());
141         usleep(1000000);
142     }
143 }
144 void* drawInput(void* arg)
145 {
146     chat_window* winp=(chat_window*)arg;
147     winp->create_input();
148     std::string _msg="Please input# ";
149 
150     int _max_y,_max_x;
151     getmaxyx(winp->getInput(),_max_y,_max_x);
152 
153     while(1)
154     {
155         winp->put_str_to_win(winp->getInput(),1,1,_msg);
156         winp->fflush_win(winp->getInput());
157         winp->get_str_from_win(winp->getInput());
158         usleep(1000000);
159         winp->clear_win_line(winp->getInput(),1,_max_y-2);
160     }
161 }
162 
163 
164 int main()
165 {
166     chat_window _win;
167     pthread_t th,to,tf,ti;
168 
169     pthread_create(&th,NULL,drawHeader,(void*)&_win);
170     pthread_create(&to,NULL,drawOutput,(void*)&_win);
171     pthread_create(&tf,NULL,drawFriendList,(void*)&_win);
172     pthread_create(&ti,NULL,drawInput,(void*)&_win);
173 
174     pthread_join(th,NULL);
175     pthread_join(to,NULL);
176     pthread_join(tf,NULL);
177     pthread_join(ti,NULL);
178 
179     return 0;
180 }

makefile

  1 chat_window:chat_window.cpp
  2     g++ -o $@ $^ -lpthread -lncurses
  3 .PHONY:clean
  4 clean:
  5     rm -f chat_window

輸出結果:

wKioL1eEVrrjfxwmAAB698TrzGk102.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章