窗口是Curses编程最重要的部分,也是Curses编程最迷人和实用的组件,这里简单介绍窗口编程的一些基础。
一、窗口基础API
1.WINDOW* newwin(int rows, int cols, int y, int x):其参数分别是新窗口的高和宽,以及左上角开始的坐标,返回一个WINDOW指针表示新窗口
2.delwin(WINDOW *win):删除窗口,释放窗口结构和内存
3.box(WINDOW *win, int , int):在窗口外围划上边框,后两个参数为边框的风格,如box(win, ACS_HLINE, ACS_VLINE)
4.wborder(WINDOW *win, char left, char right, char upper, char down, char left_upper, char right_upper, char left_down, char right_down):同box设置窗口的边框,但可以用字符来分别填充左右上下边线和四个角
5.mvhline(int starty, int startx, char ch, int endx):在starty行输出一行字符ch,从startx到endx
6.mvvline(int starty, int startx, char ch, int endy):同上,只是一列字符
二、颜色控制
1.has_colors():检查终端是否支持彩色模式,不支持则返回FALSE
2.start_color():开启彩色模式,设置颜色前必须调用这个函数,否则颜色也不显示
3.init_pair(int num, CTYPE fore, CTYPE bgd ):Curses中的颜色都是呈对出现的,一个表示前景颜色即字符的颜色,另一个是背景颜色,这个函数生成一个颜色对,后面调用即直接使用num这个颜色对编号来指代这个颜色对
4.COLOR_PAIR(int num):调用init_pair生成的颜色对,如在字符输出前调用attron(COLOR_PAIR(1))即使用颜色对编号1来设置下面输出的字符
5.can_change_color():检测终端是否支持改变或自定义颜色的RGB值,若返回FALSE即不支持,否则可以继续调用init_color来改变系统已有的颜色或设置新的颜色
6.init_color(int color, int r, int g, int b):改变或生成新的颜色color,后面的分别是三原色红绿蓝的值
7.color_content()和pair_content()分别来查看颜色和颜色对设定的值
三、键盘和鼠标控制
1.键盘控制只需要利用getch()或wgetch()函数取键值,然后和功能键与字符键的键值进行比较即可,而鼠标控制有点复杂
2.mousemask(mmask_t newmask, mmask_t* oldmask):在让终端响应鼠标前需要开启相关掩码来激活鼠标响应,简单的就是设置ALL_MOUSE_EVENTS来响应所有的鼠标功能,如:
掩码 对应事件
BUTTON1_PRESSED 鼠标 1 号键按下
BUTTON1_RELEASED 鼠标 1 号键释放
BUTTON1_CLICKED 鼠标 1 号键单击
BUTTON1_DOUBLE_CLICKED 鼠标 1 号键双击
BUTTON1_TRIPLE_CLICKED 鼠标 1 号键三击
BUTTON2_PRESSED 鼠标 2 号键按下
BUTTON2_RELEASED 鼠标 2 号键释放
BUTTON2_CLICKED 鼠标 2 号键单击
BUTTON2_DOUBLE_CLICKED 鼠标 2 号键双击
BUTTON2_TRIPLE_CLICKED 鼠标 2 号键三击
BUTTON3_PRESSED 鼠标 3 号键按下
BUTTON3_RELEASED 鼠标 3 号键释放
BUTTON3_CLICKED 鼠标 3 号键单击
BUTTON3_DOUBLE_CLICKED 鼠标 3 号键双击
BUTTON3_TRIPLE_CLICKED 鼠标 3 号键三击
BUTTON4_PRESSED 鼠标 4 号键按下
BUTTON4_RELEASED 鼠标 4 号键释放
BUTTON4_CLICKED 鼠标 4 号键单击
BUTTON4_DOUBLE_CLICKED 鼠标 4 号键双击
BUTTON4_TRIPLE_CLICKED 鼠标 4 号键三击
BUTTON_SHIFT 在鼠标事件发生时,伴随 Shift 键按下
BUTTON_CTRL 在鼠标事件发生时,伴随 Ctrl 键按下
BUTTON_ALT 在鼠标事件发生时,伴随 Alt 键按下
ALL_MOUSE_EVENTS 报告所有的鼠标事件
REPORT_MOUSE_POSITION 报告鼠标移动位置
相关数据结构:
typedef struct event
{
short id; /*ID用来辨别不同的设备*/
int x, y, z; /*鼠标事件发生的坐标*/
mmask_t bstate; /*发生的鼠标事件*/
}
3.鼠标的处理流程一般就为:
MENEVT event;
mousemask(ALL_MOUSE_EVENTS, NULL); //开启所有的鼠标事件响应
while( getch() == KEY_MOUSE) //鼠标事件发生
{
if( getmouse(&event) == OK) //获取鼠标状态
{
if (event.bstate & BUTTON1_PRESSED) //检测相应状态和发生坐标
{
............... //作具体的处理
}
}
}
4.mouse_trafo()和wmouse_trafo()将鼠标的坐标转换为相对应屏幕的坐标,mouseinterval()设置鼠标按下和释放的时间间隔来识别鼠标的单击
四、屏幕控制
1.getyx(WINDOW* win, int y, int x):获得当前光标的坐标
2.getparyx():获得子窗口相对于主窗口的起始坐标
3.getbegyx()和getmaxyx():获取当前窗口的起始坐标和结束坐标
4.scr_dump(char *file)和scr_restore(char *file)分别将屏幕存储和恢复,file为保存文件的名称,用于场景的切换
5.getwin(FILE *fp)和putwin(WINDOW *win, FILE *fp)同上,只是用于存储和恢复窗口
6.copywin():将一个窗口的矩形区域内容复制到另一个窗口的矩形区域,
copywin(WINDOW *src, WINDOW *dst, int srcminrow, int srcmincol, int dstminrow, int dstmincol, int dmaxrow, int dmaxcol, int over)
其中minrow和mincol分别表示源窗口和目的窗口的起始坐标,而maxrow和maxcol则表示复制的行数和列数,最后over表示是直接覆盖还是重写目的窗口的内容
7. cur_set():设置光标是否可见,0不可见,1可见,2完全可见
8.def_prog_mode():存储Curses模式的一些信息,reset_prog_mode()恢复存储的信息。这两个函数用于临时离开Curses模式,返回默认tty终端模式。
def_prog_mode(); endwin(); 离开Curses模式,返回tty终端模式
reset_prog_mode(); refresh(); 恢复Curses模式,一定要调用refresh()才能显示出存储的窗口信息