您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > linux/Unix相关 > UNIX 图形编程函数库
--------------------------------------------------------------------------------------UNIX图形编程函数库(c语言)-curses(一)--------------------------------------------------------------------------------------■前言相信您在网路上一定用过如tin,elm等工具,这些软体有项共同的特色,即他们能利用上下左右等方向键来控制游标的位置.除此之外,这些程式的画面也较为美观.对Programming有兴趣的朋友一定对此感到好奇,也许他能在PC上用TurboC轻易地写出类似的程式,然而,但当他将相同的程式一字不变地移到工作站上来编译时,却出现一堆抓也抓不完的错误.其实,原因很简单,他使用的函式库可能在UNIX上是没有定义的.有些在Turbo-C上被广泛使用的一些函式,可能在UNIX上是不被定义的.为了因应网路上各式各样的终端机形态(terminal),UNIX上特别发展出一套函式库,专门用来处理UNIX上游标移动及萤幕的显示.这就是本篇文章要为您介绍的-curses.h函式库.利用这个函式库,您也可以写出像elm般利用方向键来移动光棒位置的程式.(CCCA近来所提供的线上选课程式,及程式服务界面,即是笔者利用curses发展而成的)■curses的历史与版本cureses最早是由柏克莱大学的BillJoy及KenArnold所发展出来的.当时发展此一函式库主要原因是为了提高程式对不同终端机的相容性而设计的.因此,利用curses发展出来的程式将和您所使用的终端机无关.也就是说,您不必担心您的程式因为换了一部终端机而无法使用.这对程式设计师而言,尤其是网路上程式的撰写,是件相当重要的一件事.curses之所以能对上百种以上的终端机工作,是因为它将所有终端机的资料,存放在一个叫termcap的资料库,(而在第二版的SystemV系统中,新版的curses以terminfo取代原来的termcap).有了这些记录,程式就能够知道遇到哪一种终端机时,须送什麽字元才能移动游标的位置,送什麽字元才能清除整个萤幕清除.(*注一)另外,本文的介绍以SystemV的curses版本为主.■如何在您的程式使用curses?在您的C程式的档头将curses.h;include进来.当您引进curses.h这个函式库後,系统会自动将stdio.h;和unctl.h;一并include进来.另外,在SystemV版本中,terminfo.h;这个函式库也将一并include进来.#includecurses.h;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模式.#includecurses.h;main(){initscr();::::::endwin();}这是一般curses程式标准的模式.此外,您可以就您程式所须,而做不同的设定.当然,您可以不做设定,而只是呼叫initscr().您可以自己写一个函式来存放所有您所须要的设定.平常使用时,只要呼叫这个函式即可启动curses并完成一切设定.下面的例子,即是笔者将平常较常用的一些设定放在一个叫initial()的函式内.voidinitial(){initscr();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型态指标,通常传入标准输出入萤幕stdscrbf为TRUE或FALSE当bf为true时,当输入中断字元(如break)时,中断的反应将较为快速.但可能会造成萤幕的错乱.□keypad(win,bf)呼叫keypad时须传入两个值:win为一WINDOW型态指标,通常传入标准输出入萤幕stdscrbf为TRUE或FALSE当开启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)上显示一串字串相当於呼叫move(y,x);addstr(str);printw(format,str)类似printf(),以一定的格式输出至萤幕mvprintw(y,x,format,str)在(x,y)位置上做printw的工作.相当於呼叫move(y,x);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,string2);■如何利用方向键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_NPAGE0522NextpageKEY_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,'|','-');将以|及-围成一个方框■
本文标题:UNIX 图形编程函数库
链接地址:https://www.777doc.com/doc-7027933 .html