Duangw

Curses接口

该部分是一个简明的curses方面的编程知识,并不具有系统性。

索引:

  1. 环境
  2. initscr
  3. endwin
  4. cbreak和nocbreak
  5. nl和nonl
  6. echo和noecho
  7. intrflush(win,bf)
  8. keypad(win,bf)
  9. refresh
  10. 位置控制函数
  11. 清除萤幕函数
  12. 在屏幕上输出字符函数
  13. 键盘输入函数
  14. 改变屏幕显示字符属性
  15. beep
  16. box(win,ch1,ch2)
  17. 窗口建立函数
  18. 多视窗处理函数
  19. 视窗卷动函数
  20. 使用方向键

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 里头定义了一些属性,如:

当使用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等特殊键,很容易因机器、键盘不同而无法使用。因此,若您的程式须要在不同的机器上使用,建议您只用方向键来控制,其它的特殊键少用为妙。