UNIX 屏幕导向程序的发展利器Word下载.docx

上传人:b****3 文档编号:16568954 上传时间:2022-11-24 格式:DOCX 页数:24 大小:28.92KB
下载 相关 举报
UNIX 屏幕导向程序的发展利器Word下载.docx_第1页
第1页 / 共24页
UNIX 屏幕导向程序的发展利器Word下载.docx_第2页
第2页 / 共24页
UNIX 屏幕导向程序的发展利器Word下载.docx_第3页
第3页 / 共24页
UNIX 屏幕导向程序的发展利器Word下载.docx_第4页
第4页 / 共24页
UNIX 屏幕导向程序的发展利器Word下载.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

UNIX 屏幕导向程序的发展利器Word下载.docx

《UNIX 屏幕导向程序的发展利器Word下载.docx》由会员分享,可在线阅读,更多相关《UNIX 屏幕导向程序的发展利器Word下载.docx(24页珍藏版)》请在冰豆网上搜索。

UNIX 屏幕导向程序的发展利器Word下载.docx

来.另外,在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的

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1