项目之——窗口显示

这儿把窗口分成了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 [email protected] $^ -lpthread -lncurses
  3 .PHONY:clean
  4 clean:
  5     rm -f chat_window

输出结果:

时间: 2024-11-13 09:45:41

项目之——窗口显示的相关文章

百度编辑器序号和项目符号不能显示解决

在做论坛.个人网站.办公OA,对于富文本编辑器的使用,业界使用最多.最好的应该是百度编辑器.在使用百度编辑器做富文本编辑,碰到序号.项目符号,在个性化页面展示不能显示的问题.简单分析下,将百度编辑器,编辑后的HTML存储,再用于个性化页面显示,对于指定序号和项目符号显示没有相关的样式.那解决起来就比较简单了,把相关的样式在个性化页面单独添加引用就可以了. 一.查看是什么样式: 二.个性化页面添加list-style-type样式 通过w3school 找到, list-style-type介绍,

整理一些将窗口显示在前台办法

windows下简单的调用Setforegroundwindow有时候并不能将窗口置最前,不妨试试以下办法.1.先置topmost,然后取消 SetWindowPos(HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); SetWindowPos(HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);2.改变系统环境参数 这些定义winuser.h里都有的 #define SPI_GETFORE

QApplication::alert 如果窗口不是活动窗口,则会向窗口显示一个警告(非常好用,效果就和TeamViewer一样)

void QApplication::alert(QWidget * widget, int msec = 0)如果窗口不是活动窗口,则会向窗口显示一个警告.警报会显示msec 毫秒.如果毫秒为零,闪烁一段时间后会停止,任务栏图标会一直亮着.widget.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QTimer> #include <QTime> namespace Ui { clas

Android 应用程序窗口显示状态操作(requestWindowFeature()的应用)

 我们在开发程序是常常会须要软件全屏显示.自己定义标题(使用button等控件)和其它的需求,今天这一讲就是怎样控制Android应用程序的窗口显示. 首先介绍一个重要方法那就是requestWindowFeature(featrueId),它的功能是启用窗口的扩展特性. 參数是Window类中定义的常量. 一.枚举常量 1.DEFAULT_FEATURES:系统默认状态.一般不须要指定 2.FEATURE_CONTEXT_MENU:启用ContextMenu,默认该项已启用,一般无需指定

Android应用Activity、Dialog、PopWindow窗口显示机制及源码分析

[工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处,尊重劳动成果] 1 背景 之所以写这一篇博客的原因是因为之前有写过一篇<Android应用setContentView与LayoutInflater加载解析机制源码分析>,然后有人在文章下面评论和微博私信中问我关于Android应用Dialog.PopWindow.Toast加载显示机制是咋回事,所以我就写一篇文章来分析分析吧(本文以Android5.1.1 (API 22)源码为基础分析),以便大家在应

【excel技巧读书笔记004】在一个窗口显示多个工作薄

在一个窗口显示多个工作薄 选择多个工作薄,右键打开. 视图选项卡,全部重排.对话框中选择排列方式.例如水平并排:

关于ajax载入窗口使用RedirectToAction在窗口显示的问题

在过滤器中过滤用户是否登录,没有登录就RedirectToAction("Login", "Auth", new { Area = "Account"}); 但是用户登录超时,又使用ajax载入页面,就会在载入窗口显示登陆页面 如果不想在载入窗口显示登陆页面.想到的解决方法就是判断URL地址,因为ajax载入页面地址是不会变的,解决方法就是在登录页面加一个判断 <script> //强制跳转到登录页面,防止在ajax窗口显示此页面 i

JavaScript特效实例001-打开新窗口显示广告信息

实例001                 打开新窗口显示广告信息 实例说明 本实例要在窗口每次被加载的时候弹出一个广告对话框. 技术要点 本实例主要应用JavaScript的window对象. window对象的常用方法 方法 说明 alert() 弹出一个警告对话框 confirm() 在确认对话框中显示指定的字符串 prompt() 弹出一个提示对话框 close() 关闭被引用的窗口 focus() 将被引用的窗口放在所有打开窗口的前面 open() 打开新浏览器窗口并且显示由URL或名

session过期情况下弹出窗口显示2个登陆页面的问题处理

根据多年的web开发经验,一般当session过期之后,当用户点击任何一个按钮之类的,都是自动跳转到登陆页面,这个在网上有很多过滤器,拦截器实现. 那么在使用类似jquery easy ui的时候,如果页面有一些弹出窗口,是在弹出了窗口再去加载地址拉数据出来的,就会出现父页面跳到登陆页面,弹出页面也跳到登陆页面. 如何解决这个问题呢,我的办法如下: 首先,在过滤器中如果是session过期的话,自动跳到登陆页面,并且带上一个固定参数,在页面index.jsp中获取这个参数,如果存在. 其实就是在