UNIX 屏幕导向程序的发展利器Word下载.docx
《UNIX 屏幕导向程序的发展利器Word下载.docx》由会员分享,可在线阅读,更多相关《UNIX 屏幕导向程序的发展利器Word下载.docx(24页珍藏版)》请在冰豆网上搜索。
来.另外,在SystemV版本中,<
terminfo.h>
这个函数库也将一并
include进来.
#include<
main()
{
:
}
当然,您的系统内必须放有curses.h这个函数库.
■如何编译(compile)
当您编辑好您的程序,在UNIX提示符号下键入:
%/usr/5bin/cc[file.c]-lcurses
^^^^^^^
引进curses.h这个library
或%/usr/5bin/cc[file.c]-lcurses-ltermlib
(*注二)
■如何开始我的第一个curses程序?
在开始使用curses的一切命令之前,您必须先利用initscr()这个函数
来开启curses模式.
相对的,在结束curses模式前(通常在您结束程序前)也必须以
endwin()来关闭curses模式.
initscr();
endwin();
这是一般curses程序标准的模式.
此外,您可以就您程序所须,而做不同的设定.当然,您可以不做设定,而
只是呼叫initscr().
您可以自己写一个函数来存放所有您所须要的设定.平常使用时,只要呼
叫这个函数即可启动curses并完成一切设定.
下面的例子,即是笔者将平常较常用的一些设定放在一个叫initial()的函
式内.
voidinitial()
cbreak();
nonl();
noecho();
intrflush(stdscr,FALSE);
keypad(stdscr,TRUE);
refresh();
各函数分别介绍如下:
□initscr()
initscr()是一般curses程序必须先呼叫的函数,一但这个函数
被呼叫之後,系统将根据终端的形态并启动curses模式.
□endwin()
curses通常以呼叫endwin()来结束程序.endwin()可用来关闭
curses模式,或是暂时的跳离curses模式.如果您在程序中须要
callshell(如呼叫system()函数)或是需要做systemcall,
就必须先以endwin()暂时跳离curses模式.最後再以
wrefresh()doupdate()来重返curses模式.
□cbreak()
nocbreak()
当cbreak模式被开启後,除了DELETE或CTRL等仍被视为特殊
控制字元外一切输入的字元将立刻被一一读取.当处於nocbreak模
式时,从键盘输入的字元将被储存在buffer里直到输入RETURN
或NEWLINE.在较旧版的curses须呼叫crmode(),nocrmode()来
取代cbreak(),nocbreak()
□nl()
nonl()
用来决定当输入资料时,按下RETURN键是否被对应为NEWLINE字
元(如\n).
而输出资料时,NEWLINE字元是否被对应为RETURN和LINDFEED
系统预设是开启的.
□echo()
noecho()
此函数用来控制从键盘输入字元时是否将字元显示在终端上.系统
预设是开启的.
□intrflush(win,bf)
呼叫intrflush时须传入两个值:
win为一WINDOW型态指标,通常传入标准输出入屏幕stdscr
bf为TRUE或FALSE
当bf为true时,当输入中断字元(如break)时,中断的反应
将较为快速.但可能会造成屏幕的错乱.
□keypad(win,bf)
呼叫keypad时须传入两个值:
当开启keypad後,可以使用键盘上的一些特殊字元,如上下左右
等方向键,curses会将这些特殊字元转换成curses.h内定义的一
些特殊键.这些定义的特殊键通常以KEY_开头.
□refresh()
refresh()为curses最常呼叫的一个函数.
curses为了使屏幕输出入达最佳化,当您呼叫屏幕输出函数企图改
变屏幕上的画面时,curses并不会立刻对屏幕做改变,而是等到
refresh()呼叫後,才将刚才所做的变动一次完成.其馀的资料将
维持不变.以尽可能送最少的字元至屏幕上.减少屏幕重绘的时间.
如果是initscr()後第一次呼叫refresh(),curses将做清除萤
幕的工作.
■光标的控制
move(y,x)将光标移动至x,y的位置
getyx(win,y,x)得到目前光标的位置
(请注意!
是y,x而不是&
y,&
x)
■有关清除屏幕的函数
clear()
erase()将整个屏幕清除
(请注意配合refresh()使用)
■如何在屏幕上显示字元
echochar(ch)显示某个字元
addch(ch)显示某个字元
mvaddch(y,x,ch)在(x,y)上显示某个字元
相当於呼叫move(y,x);
addch(ch);
addstr(str)显示一串字串
mvaddstr(y,x,str)在(x,y)上显示一串字串
addstr(str);
printw(format,str)类似printf(),以一定的格式输出至屏幕
mvprintw(y,x,format,str)在(x,y)位置上做printw的工作.
printw(format,str);
■如何从键盘上读取字元
getch()从键盘读取一个字元(注意!
传回的是整数值)
getstr()从键盘读取一串字元
scanw(format,&
arg1,&
arg2...)如同scanf,从键盘读取一串字元
□例:
intch;
charstring1[80];
/*请注意!
不可宣告为char*string1;
*/
charstring2[80];
echo();
/*开启echo模式,使输入立刻显示在屏幕上*/
ch=getch();
string1=getstr();
scanw("
%s"
string2);
mvprintw(10,10,"
String1=%s"
string1);
mvprintw(11,10,"
String2=%s"
■如何利用方向键
curses将一些如方向键等特殊控制字元,以KEY_为开头定义在curses.h
这个档案里头,如KEY_UP即代表方向键的"
↑"
.但,如果您想使用
curses.h所为您定义的这些特殊键的话,您就必须将keypad设定为
TRUE.否则,您就必须自己为所有的特殊键定义了.
curses.h为一些特殊键的定义如下:
KEY_UP0403↑
KEY_DOWN0402↓
KEY_LEFT0404←
KEY_RIGHT0405→
KEY_HOME0406Homekey(upward+leftarrow)
KEY_BACKSPACE0407backspace(unreliable)
KEY_F00410Functionkeys.
KEY_F(n)(KEY_F0+(n))Formulaforf.
KEY_NPAGE0522Nextpage
KEY_PPAGE0523Previouspage
以上仅列出笔者较常使用的一些控制键,至於其他控制键的定义,请自行参
阅mancurses(*注三)
一并为您列出其他常用的一些特殊字元
[TAB]/t
[ENTER]/r
[ESC]27
[BACKSPACE]127
■如何改变屏幕显示字元的属性
为了使输出的屏幕画面更为生动美丽,我们常须要在屏幕上做一些如反白,
闪烁等变化.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);
/*关闭高亮度模式,恢复正常模式*/
■其他常用的一些函数
beep()发出一声哔声
box(win,ch1,ch2)自动画方框ch1:
画方框时垂直方向所用字元
ch2:
画方框时水平方向所用字元
example:
box(stdscr,'
|'
'
-'
将以|及-围成一个方框
■应用完整□例
下面所举的例子,即完全利用刚刚所介绍的含式来完成.这个程序可将从键
盘上读取的字元显示在屏幕上,并且可以上下左右方向键来控制光标的位置
当按下[ESC]後,程序即结束.
您有没有发现,这不就是一个简单全屏幕编辑器的雏形吗?
/*引进curses.h,并自动引进stdio.h*/
#defineStartX1/*决定光标初始位置*/
#defineStartY1
voidinitial();
intx=StartX;
/*宣告x,y并设定其初值*/
inty=StartY;
/*宣告ch为整数,配合getch()使用*/
initial();
/*呼叫initial(),启动curses模式,*/
/*并完成其它设定*/
/*画方框*/
mvaddstr(0,20,"
CursesProgram"
/*在(20,0)处输出反白字元*/
/*关闭反白模式*/
move(x,y);
/*将光标移至初始位置*/
do{/*以无限回圈不断等待输入*/
/*等待自键盘输入字元
switch(ch){/*判断输入字元为何*/
caseKEY_UP:
--y;
/*判断是否"
↑"
键被按下*/
break;
caseKEY_DOWN:
++y;
↓"
caseKEY_RIGHT:
++x;
→"
caseKEY_LEFT:
--x;
←"
case'
\r'
:
/*判断是否ENTER键被按下*/
x=0;
\t'
/*判断是否TAB键被按下*/
x+=7;
case127:
/*判断是否BACKSPACE键被按下*/
mvaddch(y,--x,'
'
/*delete一个字元*/
case27:
/*判断是否[ESC]键被按下*/
exit
(1);
/*结束curses模式*/
/*结束此程序*/
default:
addch(ch);
/*如果不是特殊字元,将此字元印出*/
x++;
move(y,x);
/*移动光标至现在位置*/
}while
(1);
voidinitial()/*自定开启curses函数*/
■後记
学完了上述的一些命令,相不相信您已经可以写出一个漂亮的全屏幕编辑
器了?
事实上,curses提供的函数不下200个,可是笔者认为,一切再
复杂的函数都可以用本文提到的一些组合变化而成,学了太多的函数,只
是徒增自己困扰罢了.当然,如果您对其它函数有兴趣,可以自行参阅
curses说明档.(方法:
%mancurses)本文不过行抛砖引玉之效,也
希望未来能陆续出现更多同学自行创作的程序.
*任何疑问及建议,欢迎e-mail至ljh@CCCA.NCTU.edu.tw.谢谢!
*
注一:
请参考/usr/share/lib/termcup
/usr/share/lib/terminfo/s/sun
注二:
1.如果是BSD的版本,需使用
cc[file.c]-lcurses-ltermcap来完成compile.
2.计中工作站不知何故将原来的/usr/5bin/cc更改为/usr/5bin/cc.org
因此,您若想在计中工作站compilecurses程序.需以/usr/5bin/cc.org
取代/usr/5bin/cc,否则compile可能发生错误.
3.较旧版的curses需同时引进curses和termlib这两个library,
因此,您必须使用/usr/5bin/cc[file.c]-lcurses-ltermlib来compile.
注三:
根据笔者的经验,上下左右方向键应可正常使用而不会发生问题,但其它
如PgUp,PgDn,功能键,Home,End等特殊键,很容易因机器,键盘不同而无
法使用,因此,若您的程序须要在不同的机器上使用,建议您只用方向键来
控制,其它的特殊键少用为妙.
至於PgUp,PgDn一些特殊键的控制方法,由於较为复杂,有兴趣的同学可参
考tin原始程序curses.c内所使用的一些方法.
--------------------------------------------------------------------------------
LastModifiedAugust29,20007:
25:
48AM
UNIX屏幕导向程序的发展利器-curses(之二)
在上期为您介绍完了curses.h函式库的一些基本函式呼叫後在,在本期里
我们将继续为您介绍curses有关多视窗处理的函式.有了这些函式,我们
可以在程式里同时处理多个不同的视窗.如joe编辑器内我们可将萤幕切割
成好几个小萤幕,并且可以在这些不同的萤幕间做切换并编辑不同的档案,这
就是多视处理的应用.另外,有关POP-UP视窗的制作,以及视窗的卷动,在
本文里,我们将以简单的例子,告诉您这些功能是如何做到的.关於一些较基
本函式的用法,我们将不再特别介绍.如果您尚未熟悉curses基本函式使用
方法,请参阅上一期(80期)通讯.
■视窗的建立
视窗的建立,以newwin()这个函式来完成.同时,需宣告此视窗为WINDOW
结构变数.
WINDOW*newwin(lines,colums,start_y,start_x);
WINDOW*win;
win=newwin(10,20,0,0);
如此,将以(0,0)为原点,取一个10列20行的矩形为一新的视窗.今後
我们只要呼叫win这个变数,就可以对这新视窗做处理.
如:
wmove(win,3,2);
■多视窗处理函式的格式
这一类函式和一般的基本函式极为类似,几乎每一个基本函式都有一个对应的
视窗处理函式.一般将'
w'
加在函式的里头作为区别,'
乃'
window'
之
意.另外,因为可同时处理多个视窗,在呼叫使用时,需特别指定欲处理的视
窗.当然,如果您指定对stdscr做处理,由於是对标准输出入萤幕处理,其
作用将相当於一般基本的函式.
wmove(win,y,x)即对win这个视窗做move()动作.
wmove(stdscr,y,x)相当於move(y,x)
介绍一些较重要的函式
wmove(win,y,x)
touchwin(win)
wrefresh(win)
mvwaddstr(win,y,x,str)
wattron(attr)
delwin(win)
subwin(win,ny,nx,y,x)
其他函式多和基本函式互为对应,故不全部列出,详细名称可参考curses
的onlinemanual.
■视窗内的座标系
视窗内的座标系,将以此视窗的起始点为新原点,并以其相对位置作为新的
座标.举例来说
win=newwin(10,20,5,5);
wmove(win,2,3);
将以(5,5)为新原点,y方向移动2单位,x方向移动3单位.因此实际
上,游标将移动至y=7x=8的位置上.
■POP-UP视窗的建立
利用curses所提供的视窗处理函式,我们可以做出像ONLINEHELP的