随着笔记本知识的普及,越来越多的笔记本爱好者开始了解和使用Linux.。Linux的轻松自由之风给了我们不同的体味。并且我们不能满足于基本的命令和KDE,Gnome等用户界面的操作.我们要干哪些?编程,对,编程!对于编程爱好者,Linux有着挺好的编程环境:gcc(GNUCompilerCollection)才能编译C,C++,Java等好多种语言,但是Linux环境下有好多函数库可以调用.了解一些这种函数库的使用,会给你的编程工具箱里降低许多有用的工具.明天,就让我们来认识一下curses---它不是哪些中世纪巫婆的咒语,而是一个在Linux/Unix下广泛应用的图形函数库.
曾经学过TC2.0的同事肯定还记得TC里面有一个图形库BGI(BorlandGraphicsInterface,还记得那种头文件吗:).用它我们可以勾画在DOS下的用户界面和漂亮的图形.而Linux/Unix编程给人的觉得就比较"cool"一点,似乎Linux编程都是在黑漆漆的终端下进行的.确实是这样,许多Linux大神都喜欢在终端形式下工作,熟悉了一些命令之后,这样的工作方法效率还是很高的.并且长久地看着黑漆漆的屏幕难免让人倍感厌烦,非常是像我这样接触Linux不久的新手:)有没有一种工具能让我们在Linux下编出好看的图形呢?答案是肯定的,它就是curses!
curses的名子起源于"cursoroptimization",即光标优化.它最早由有日本伯克利学院的BillJoy和KenArnold编撰的,拿来处理一个游戏rogue的屏幕显示.后来贝尔实验室的MarkHorton在SystemIIIUnix中重新编撰了curses.如今几乎所有的Unix,Linux操作系统都带了curses函数库,curses也加入了对键盘的支持,一些菜单和面板的处理.可以说,curses是Linux终端图形编程的不二选择(例如知名的文字编辑器vi就是基于curses编的)
OK,闲谈少说,如今我们开始步入题外话:
首先我们应当了解linux c,在终端使用使用的屏幕模式是基于文本的.所以在开始使用curses前,须要用initscr()函数初始化屏幕.对应的,程序结束须要调用endwin();函数来关掉curses状态.
有了这个概念,我们就可以来写知名的"Hello,world!"之curses版了:
/*-----------------------------------------------------------------
A very simple example of curses programming
coder: jellen
date: 3-26-2004
----------------------------------------------------------------*/
#include
int main()
{
initscr();
box(stdscr, ACS_VLINE, ACS_HLINE); /*draw a box*/
move(LINES/2, COLS/2); /*move the cursor to the center*/
waddstr(stdscr, "Hello, world!");
refresh();
getch();
endwin();
return 0;
}
呵呵,刚刚忘了说了.我们调用curses库通常是用C语言的(没哪些奇怪,C可以说是Linux的官方语言,不过你也可以用C++或Python等语言调用curses的,这无关紧要).假定我们把这个程序保存为hello.c
不过不要急着用gcc-ohellohello.c去编译运行(我晓得你会用gcc:)那样是不能通过编译的.由于curses库不在标准路径上,所以我们要加上-lcurses联接选项,像这样:
gcc-ohellohello.c-lcurses
如今你用./hello运行一下程序瞧瞧unix/linux下curses库开发指南,是不是出现了你所期望的窗口.
如今我们来一行行剖析一下代码.
#include /*这是每个 curses 程序都必须包含的头文件,表明使用了curses库*/
之后主函数中第一句initscr();初始化了屏幕,使之开始步入curses图形化工作形式.
虽然我们现今没有自己完善窗口,用的是标准屏幕stdscr(如同C上面标准输入stdin,标准输出stdout一个概念),它就是我们面前的笔记本屏幕(不过如今还是黑漆漆的)
下边一句:box(stdscr,ACS_VLINE,ACS_HLINE);画了一个框.有了这个框我们才有"窗体"的觉得.stdscr就是标准屏幕,ACS_VLINE和ACS_HLINE代表构成方框两侧的基本元素,你也可以用''''|''''和''''-''''取代,不过可能没有ACS_VLINE,ACS_HLINE好看了.
move(LINES/2, COLS/2);
waddstr(stdscr, "Hello, world!");
这两句是把光标移到屏幕中间,之后输出我们的"Hellounix/linux下curses库开发指南,world!"
LINES和COLS是curses定义的宏,代表当前屏幕的最大行数和列数.waddstr()函数的作用是在stdscr上复印字符串"hello,world!"
屏幕分化学屏幕(我们所见到的)和逻辑屏幕(在显存中的),我们调用函数时更改的是逻辑屏幕,它不会在当前化学屏幕上显示下来.所以如今屏幕上还是哪些也没有,须要调用refresh()把我们对逻辑屏幕的改动在数学屏幕(显示器)上显示下来.之后用getch()让屏幕暂停一下.
最后调用endwin()结束curses,恢复原先的屏幕.
好了,我们完成了第一个反例的剖析.是不是挺简单的?
不过不尽如人意的是屏幕还是那种样子,没有哪些色调.要加色调?那也是挺容易的:首先用start_color()函数开启颜色模式,之后设置我们要的颜色就行了.
curses里的颜色是配对的,要一个背景色对一个前风景.使用之前用init_pair()初始化.
例如init_pair(1,COLOR_BLUE,COLOR_GREEN);就定义了一组颜色美国linux主机,COLOR_BLUE为前风景,COLOR_GREEN为背景色.1是它们的标记号码(供其他函数调用时使用)我们来看一个简单的事例:
/*--------------------------------------------------------------
A simple curses color demo program
Coder: jellen
Date: 3-26-2004
-------------------------------------------------------------*/
#include
int main()
{
initscr(); /*初始化屏幕*/
if(start_color() == OK) /*开启颜色*/
{
init_pair(1, COLOR_RED, COLOR_GREEN); /*建立一个颜色对*/
attron(COLOR_PAIR(1)); /*开启字符输出颜色*/
move(LINES/2, COLS/2);
waddstr(stdscr, "Yet another Hello, world!");
attroff(COLOR_PAIR(1)); /*关闭颜色显示*/
refresh();
}
else
{
waddstr(stdscr, "Can not init color");
refresh();
}
endwin(); /*关闭curses状态*/
return 0;
}
这个程序如果保存为color.c
这么你可以这样编译了:gcc-ocolorcolor.c-lcurses
用./color一运行个彩色的字?呵呵,其实不好看,并且说不定你自己之后可以用curses写出精致的程序。