3 curses库窗口(WINDOW)处理
~~~~~~~~~~~~~~~~~~~~~~~~~~~
3.1 什么是窗口
===============
* 窗口是屏幕上的一块区域,在其上面可以进行各种输出及其操作.
* 窗口可以位于标准屏幕的任意位置,窗口之间可以相互重叠.
* 窗口可以同时包含与它们相关的子窗口,任何在父窗口与子窗口重叠区域的变化会同时影响到他们中的任何一个
3.2 窗口操作
=============
3.2.1 创建和删除窗口
---------------------
代码语言:javascript复制/**
@brief 创建窗口并返回WINDOW指针
@param lines 需要创建窗口所占的总行数
@param cols 需要创建窗口所占的总列数
@param begin_x 窗口左上角所在的行数(x坐标)
@param begin_y 窗口左上角所在的列数(y坐标)
@return 返回WINDOW类型的指针,如果创建失败,函数返回NULL
@note 如果lines或者cols为0,函数自动创建一个行数和列数分别为LINES和COLS的窗口.
所创建窗口的大小不能超过实际屏幕的大小,如果超过了,则返回失败.
对于不再使用的窗口有必要及时清屏,可以使用werase()和wclear()实现.
不管werase()还是wclear()都不能清除内存空间,需要调用delwin()释放内存.
*/
WINDOW* newwin(int lines,int cols,int begin_x,int begin_y);
/**
@brief 删除窗口
@param win 待删除窗口的指针
@note 在主窗口删除之前必须先删除与它相关连的所有子窗口
*/
int delwin(WINDOW* win);
/**
@breif 创建子窗口
@param win 父窗口的指针
@param lines,cols 子窗口的总行数和列数
@param begin_x,begin_y 子窗口的左上角在标准屏幕的相对位置
@note 注意相对位置是想对于*标准屏幕*的,而不是父窗口的!!
*/
WINDOW* subwin(WINDOW* win,int lines,int cols,int begin_x,int begin_y);
/**
@breif 创建子窗口
@param win 父窗口的指针
@param lines,cols 子窗口的总行数和列数
@param begin_x,begin_y 子窗口的左上角在父窗口的相对位置
@note 注意相对位置是想对于*父窗口*的,而不是标准屏幕的!!
*/
WINDOW* derwin(WINDOW* win,int lines,int cols,int begin_x,int begin_y);
3.2.2 在窗口进行输入和输出
---------------------------
代码语言:javascript复制int wmove(WINDOW* win,int x,int y); /**移动光标到相对win的(x,y)处*/
int waddch(WINDOW* win,int ch); /**在窗口的当前位置增加字符ch*/
int mvwaddch(WINDOW* win,x,y,ch); /**在窗口中移动光标到x,y,同时输出ch*/
int waddstr(WINDOW* win,char* str); /**输出str*/
int mvwaddstr(WINDOW* win,int x,int y,char* str); /**将窗口光标移动到x,y,同时输出str*/
int wprintw(WINDOW* win,char* fmt[,arg...]); /**在窗口中格式化输出*/
int wgetch(WINDOW* win); /**在窗口中获取输入*/
int mvwgetch(WINDOW* win,int x,int y);
int wgetstr(WINDOW* win);
int mvwgetstr(WINDOW* win,int x,int y,char* str);
int wscanw(WINDOW* win,char* fmt[,args...]);
int mvwscanw(WINDOW* win,int x,int y,char* fmt[,args...]);
int winsch(WINDOW* win,int ch); /**在窗口中插入字符*/
int mvwinsch(WINDOW* win,int x,int y,int ch);
int winsertln(WINDOW* win,int x,int y); /**在窗口中插入一行*/
int wdelch(WINDOW* win); /**在窗口中删除一个字符*/
int mvwdelch(WINDOW* win,int x,int y);
int wdeleteln(WINDOW* win);
int wclear(WINDOW* win);
int werase(WINDOW* win);
int wclrtoeol(WINDOW* win);
int wclrtobot(WINDOW* win);
int wstandout(WINDOW* win);
int wstandend(WINDOW* win);
int wattrset(WINDOW* win,chtype atr);
int wattroff(WINDOW* win,chtype atr);
int wattron(WINDOW* win,chtype atr);
/**
@brief 复制srcwin的内容到dstwin中
@param srcwin 被复制窗口的指针
@param dstwin 接受复制窗口的指针
@note srcwin和dstwin的尺寸不需要完全相同,如果srcwin大于dstwin窗口,函数仅仅复制srcwin中适合dstwin的部分
overlay()是一种非破坏性的复制,它不复制原窗口上的空字符,因此如果原窗口的某个位置为空字符,而目标窗口对应位置不为空字符,则目标窗口的原字符继续保留.
*/
int overlay(WINDOW* srcwin,WINDOW* dstwin);
/**
@brief 复制srcwin的内容到dstwin中
@param srcwin 被复制窗口的指针
@param dstwin 接受复制窗口的指针
@note srcwin和dstwin的尺寸不需要完全相同,如果srcwin大于dstwin窗口,函数仅仅复制srcwin中适合dstwin的部分
overwrite()是一种破坏性的复制,它复制原窗口上的所有内容,包括空字符
*/
int overwrite(WINDOW* srcwin,WINDOW* dstwin);
/**
@brief 复制srcwin的部分内容到dstwin的指定部分上
@param srcwin 复制的源窗口指针
@param dstwin 复制的目标窗口指针
@param srcminrow,srcmincol 源窗口待复制部分的左上角坐标
@param dstminrow,dstmincol 目标窗口被复制部分的左上角坐标
@param dstmaxrow,dstmaxcol 指示了需要复制区域的大小
@param overlay 复制是否是破坏性的
*/
int copywin(WINDOW* scrwin,WINDOW* dstwin,int srciminrow,int srcmincol,int dstminrow,int dstmincol,int dstmaxrow,int dstmaxcol,int overlayFlag);
3.2.3 窗口刷新
---------------
代码语言:javascript复制/**
@breif 将窗口内容写入虚拟屏幕中,虚拟屏幕描述了将要显示的内容
*/
int wnoutrefresh(WINDOW* win);
/**
@brief 将虚拟屏幕内容刷新到物理屏幕中
*/
int doupdate(WINDOW* win);
/**
@brief 等价于先wnoutrefresh()再doupdate()
*/
int wrefresh(WINDOW* win);
/**
@brief 重画指定窗口
*/
int redrawwin(WINDOW* win);
/**
@brief 重画指定窗口的指定区域
@param beg_line 区域的起始行
@param num_lines 区域的行数
*/
int wredrawln(WINDOW* win,int beg_line,int num_lines);
3.2.4 窗口其他属性操作
-----------------------
代码语言:javascript复制/**
@brief 移动窗口到指定位置
@param win 待移动的窗口
@param x,y 移动的目标位置
@note 移动窗口后,记得用wrefresh刷新窗口
*/
int mvwin(WINDOW* win,int x,inty);
/**
@brief 在窗口相互重叠时,激活指定窗口,使它获取当前操作的焦点
*/
void touchwin(WINDOW* win);
/**
@brief 给窗口加上边框
@param win 需要画出边框的窗口
@vert 垂直方向的字符,通常为ACS_VLINE
@hort 水平方向的字符,通常为ACS_HLINE
*/
int box(WINDOW* win,chtype vert,chtype hort);
/**
@breif给窗口加上边框
@param win 需要画出边框的窗口
@param ls 窗口左边字符 //left side
@param rs 窗口右边字符 //right side
@param ts 窗口上边字符 //top side
@param bs 窗口下边字符 //buttom side
@param tl 窗口左上角字符 //top left
@param tr 窗口右上角字符 //top right
@param bl 窗口左下角字符 //buttom left
@param br 窗口右下角字符 //buttom right
*/
int border(WINDOW* win,chtype ls,chtype,rs,chtype ts,chtype bs,chtype tl,chtype tr,chtype bl,chtype br);
/**
@brief 在标准屏幕绘制横线
@param ch 直线支付
@param n 制定最大线长度
*/
int hline(chtype ch,int n);
/**
@brief 在标准屏幕绘制竖线
@param ch 直线字符
@param n 制定最大线长度
*/
int vline(chtype ch,int n);
/**
@brief 在指定窗口绘制横线
@param win 指定窗口
@param ch 直线支付
@param n 制定最大线长度
*/
int whline(WINDOW* win,chtype ch,int n);
/**
@brief 在指定窗口绘制竖线
@param win 指定窗口
@param ch 直线字符
@param n 制定最大线长度
*/
int wvline(WINDOW* win,chtype ch,int n);
/**
@brief 设置窗口的相应标志
@param state TRUE则设置该标志,FLASE则取消设置
*/
void leaveok(WINDOW* win,bool state);
void scrollok(WINDOW* win,bool state);
void clearok(WINDOW* win,bool state);
3.2.5 屏幕的转存
-----------------
代码语言:javascript复制/**
@brief 将win中所有数据写入fp中
*/
int putwin(WINDOW* win,FILE* fp);
/**
@brief 由fp内容创建窗口
*/
WINDOW* getwin(FILE* fp);
/**
@brief 存储标准屏幕
*/
int scr_dump(const char* filename);
/**
@brief 读取标准屏幕
*/
int src_restore(const char* filename);