Curses接口
该部分是一个简明的curses方面的编程知识,并不具有系统性。
索引:
- 环境
- initscr
- endwin
- cbreak和nocbreak
- nl和nonl
- echo和noecho
- intrflush(win,bf)
- keypad(win,bf)
- refresh
- 位置控制函数
- 清除萤幕函数
- 在屏幕上输出字符函数
- 键盘输入函数
- 改变屏幕显示字符属性
- beep
- box(win,ch1,ch2)
- 窗口建立函数
- 多视窗处理函数
- 视窗卷动函数
- 使用方向键
1.环境
使用时包含头文件:curses.h
编译选项:
cc … -lcurses
或
cc … -lcurses -ltermlib
2.initscr
在开始使用curses的一切命令之前, 必须先利用initscr()这个函数来开启curses模式。
3.endwin
在结束curses模式前(通常在您结束程序前),也必须以endwin()来关闭curses模式,或是暂时的跳离curses模式。
如果您在程式中须要call shell(如呼叫system()函式)或是需要做system call,就必须先以endwin()暂时跳离curses模式。最后再以wrefresh()、doupdate()来重返curses模式。
4.cbreak和nocbreak
当cbreak模式被开启後,除了DELETE或CTRL等仍被视为特殊控制字元外一切输入的字元将立刻被一一读取。
当处于nocbreak模式时,从键盘输入的字元将被储存在buffer里直到输入RETURN或NEWLINE。在较旧版的curses须呼叫crmode()、nocrmode()来取代cbreak()、nocbreak()。
5.nl和nonl
用来决定当输入资料时,按下RETURN键是否被对应为NEWLINE字元(如\n)。而输出资料时,NEWLINE字元是否被对应为RETURN和LINDFEED。系统预设是开启的。
6.echo和noecho
用来控制从键盘输入字元时是否将字元显示在终端机上。系统预设是开启的。
7.intrflush(win,bf)
调用intrflush 时须传入两个值:win为一WINDOW型态指标,通常传入标准输出入萤幕stdscr。bf为TRUE或FALSE,当bf为true时,当输入中断字元(如break)时,中断的反应将较为快速,但可能会造成屏幕的错乱。
8.keypad(win,bf)
呼叫keypad时须传入两个值:win为一WINDOW型态指标,通常传入标准输出入萤幕stdscr。bf为TRUE或FALSE,当开启keypad後,可以使用键盘上的一些特殊字元,如上下左右等方向键,curses会将这些特殊字元转换成curses.h内定义的一些特殊键,这些定义的特殊键通常以KEY_开头。
9.refresh
refresh()为curses最常呼叫的一个函数。curses为了使屏幕输出入达最佳化,当您呼叫屏幕输出函数企图改变萤幕上的画面时,curses并不会立刻对萤幕做改变,而是等到refresh()呼叫後,才将刚才所做的变动一次完成。其余的资料将维持不变,以尽可能送最少的字元至萤幕上,减少萤幕重绘的时间。
如果是initscr()後第一次呼叫refresh(),curses将做清除萤幕的工作。
10.位置控制函数
move(y,x):将游标移动至x,y的位置;
getyx(win,y,x):得到目前游标的位置(请注意是y,x,而不是&y,&x )。
11.清除萤幕函数
clear()、erase():将整个萤幕清除(请注意配合refresh()使用)。
12.在屏幕上输出字符函数
echochar(ch):显示某个字元;
addch(ch):显示某个字元;
mvaddch(y,x,ch):在(x,y)上显示某个字元。相当於呼叫move(y,x);addch(ch);
addstr(str):显示一串字串;
mvaddstr(y,x,str);在(x,y)上显示一串字串。相当於呼叫move(y,x);addstr(str);
printw(format,str):类似printf(),以一定的格式输出至萤幕;
mvprintw(y,x,format,str):在(x,y)位置上做printw的工作。相当於呼叫move(y,x);printw(format,str)。
13.键盘输入函数
getch():从键盘读取一个字元(注意传回的是整数值);
getstr():从键盘读取一串字元;
scanw(format, &arg1, &arg2... ):如同scanf,从键盘读取一串字元。
14.改变屏幕显示字符属性
curses定义了一些特殊的属性,透过这些定义,我们也可以在curses程式控制萤幕的输出变化。
attron(mod):开启属性;
attroff(mod):关闭属性。
curses.h 里头定义了一些属性,如:
- A_UNDERLINE:加底线;
- A_REVERSE:反白;
- A_BLINK:闪烁;
- A_BOLD:高亮度;
- A_NORMAL:标准模式(只能配合attrset()使用)。
当使用attron()开启某一种特殊属性模式後,接下来在萤幕的输出都会以该种属性出现。直到您呼叫attroff()将此模式关闭。
请注意,当您欲attron()开启另一种属性时,请记得利用attroff()先关闭原来的属性,或直接以attrset(A_NORMAL)将所有特殊属性关闭。否则,curses会将两种属性做重叠处理。例:
attrset(A_NORMAL); /* 先将属性设定为正常模式 */
attron(A_UNDERLINE); /* 加底线 */
mvaddstr(9,10,"加底线"); /* 加底线输出一串字元 */
attroff(A_UNDERLINE); /* 关闭加底线模式, 恢复正常模式 */
attron(A_REVERSE); /* 开启反白模式 */
mvaddstr(10,10,"反白"); /* 输出一串反白字元 */
attroff(A_REVERSE); /* 关闭反白模式, 恢复正常模式 */
attron(A_BLINK); /* 开启闪烁模式 */
mvaddstr(11,10,"闪烁"); /* 输出一串闪烁字元 */
attroff(A_BLINK); /* 关闭闪烁模式, 恢复正常模式 */
attron(A_BOLD); /* 开启高亮度模式 */
mvaddstr(12,10,"高亮度"); /* 输出一串高亮度字元 */
attroff(A_BOLD); /* 关闭高亮度模式, 恢复正常模式 */
15.beep
beep():发出一声哔声。
16.box(win,ch1,ch2)
box(win,ch1,ch2):自动画方框。ch1:画方框时垂直方向所用字元;ch2:画方框时水平方向所用字元。
17.窗口建立函数
视窗的建立以newwin()这个函式来完成。同时,需宣告此视窗为WINDOW结构变数。
WINDOW *newwin(lines,colums,start_y,start_x);
如:
WINDOW *win; win=newwin(10,20,0,0);
如此, 将以(0,0)为原点,取一个10列20行的矩形为一新的视窗。今後我们只要呼叫win这个变数,就可以对这新视窗做处理。
18.多视窗处理函数
这一类函式和一般的基本函式极为类似,几乎每一个基本函式都有一个对应的视窗处理函式。一般将'w'加在函式的里头作为区别,'w'乃'window'之意。
另外,因为可同时处理多个视窗,在呼叫使用时,需特别指定欲处理的视窗。当然,如果您指定对stdscr做处理,由於是对标准输出入萤幕处理,其作用将相当於一般基本的函式。
介绍一些较重要的函式:
wmove(win,y,x); touchwin(win); wrefresh(win); mvwaddstr(win,y,x,str); wattron(attr); delwin(win); subwin(win,ny,nx,y,x)。
其他函式多和基本函式互为对应,故不全部列出,详细名称可参考curses的online manual。
视窗内的座标系将以此视窗的起始点为新原点, 并以其相对位置作为新的座标。举例来说:
win=newwin(10,20,5,5); wmove(win,2,3);
将以(5,5)为新原点,y方向移动2单位,x方向移动3单位,因此实际上,游标将移动至y=7 x=8的位置上。
注意,在切换视窗,调用wrefresh()前需touchwin()。
19.视窗卷动函数
视窗的卷动是预设为关闭的,并以scrollok()来控制开闭。
scrollok(win,TRUE):开启;
scrollok(win,FALSE):关闭
20.使用方向键
curses将一些如方向键等特殊控制字元,以KEY_为开头定义在curses.h这个档案里头,如KEY_UP即代表方向键的"↑"。如果您想使用curses.h所为您定义的这些特殊键的话,您就必须将keypad设定为TRUE。否则,您就必须自己为所有的特殊键定义了。
curses.h为一些特殊键的定义如下:
KEY_UP | 0403 | ↑ |
KEY_DOWN | 0402 | ↓ |
KEY_LEFT | 0404 | ← |
KEY_RIGHT | 0405 | → |
KEY_HOME | 0406 | Home key(upward+left arrow) |
KEY_BACKSPACE | 0407 | backspace(unreliable) |
KEY_F0 | 0410 | Function keys |
KEY_F(n) | (KEY_F0+(n)) | Formula for f |
KEY_NPAGE | 0522 | Next page |
KEY_PPAGE | 0523 | Previous page |
以上仅列出较常使用的一些控制键,至於其他控制键的定义,请自行参阅man curses。
一并为您列出其他常用的一些特殊字元:
[TAB] | /t |
[ENTER] | /r |
[ESC] | 27 |
[BACKSPACE] | 127 |
一般来说,上下左右方向键应可正常使用而不会发生问题,但其它如PgUp、PgDn、功能键、Home、End等特殊键,很容易因机器、键盘不同而无法使用。因此,若您的程式须要在不同的机器上使用,建议您只用方向键来控制,其它的特殊键少用为妙。