Linux/Unix终端图形库curses简介

转载 2004年08月03日 14:30:00
 

Linux/Unix终端图形库curses简介

随着电脑知识的普及, 越来越多的电脑爱好者开始了解和使用Linux.。Linux的轻松自由之风给了我们不同的感受。但是我们不能满足于基本的命令和KDE, Gnome等用户界面的操作. 我们要干什么? 编程, 对, 编程! 对于编程爱好者, Linux有着很好的编程环境: gcc(GNU Compiler Collection)能够编译C, C++, Java等很多种语言, 而且Linux环境下有很多函数库可以调用.了解一些这些函数库的使用, 会给你的编程工具箱里增加许多有用的工具. 今天, 就让我们来认识一下curses --- 它不是什么中世纪巫婆的咒语,而是一个在Linux/Unix下广泛应用的图形函数库.

以前学过TC2.0的朋友肯定还记得TC里边有一个图形库BGI(Borland Graphics Interface, 还记得那个<graphics.h>头文件吗:). 用它我们可以绘制在DOS下的用户界面和漂亮的图形. 而Linux/Unix编程给人的感觉就比较"cool"一点, 好像Linux编程都是在黑黑的终端下进行的.确实是这样,许多Linux高手都喜欢在终端方式下工作, 熟悉了一些命令以后,这样的工作方式效率还是很高的. 但是长久地看着黑黑的屏幕难免让人感到厌倦, 特别是像我这样接触Linux不久的菜鸟:) 有没有一种工具能让我们在Linux下编出好看的图形呢? 答案是肯定的, 它就是curses!

curses的名字起源于"cursor optimization",即光标优化. 它最早由有美国伯克利大学的Bill Joy和Ken Arnold编写的, 用来处理一个游戏rogue的屏幕显示. 后来贝尔实验室的Mark Horton在System III Unix中重新编写了curses. 现在几乎所有的Unix, Linux操作系统都带了curses函数库, curses也加入了对鼠标的支持, 一些菜单和面板的处理. 可以说, curses是Linux终端图形编程的不二选择(比如著名的文字编辑器 vi 就是基于curses编的)

OK, 闲话少说,现在我们开始进入正题:
首先我们应该了解, 在终端使用使用的屏幕模式是基于文本的. 所以在开始使用curses前, 需要用initscr()函数初始化屏幕. 对应的, 程序结束需要调用endwin();函数来关闭curses状态.
有了这个概念, 我们就可以来写著名的"Hello, world!"之curses版了:
/*-----------------------------------------------------------------
          A very simple example of curses programming
          coder:   jellen
          date:    3-26-2004
  ----------------------------------------------------------------*/

#include <curses.h>

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 -o hello hello.c去编译运行(我知道你会用gcc:) 那样是不能通过编译的. 因为curses库不在标准路径上, 所以我们要加上 -lcurses连接选项, 像这样:
gcc -o hello hello.c -lcurses
现在你用 ./hello 运行一下程序看看,是不是出现了你所期望的窗口.

现在我们来一行行分析一下代码.
#include <curses.h>   /*这是每个 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!");
这两句是把光标移到屏幕中间, 然后输出我们的"Hello, world!"
LINES 和 COLS是curses定义的宏, 代表当前屏幕的最大行数和列数. waddstr()函数的作用是在stdscr上打印字符串"hello, world!"
屏幕分物理屏幕(我们所看到的)和逻辑屏幕(在内存中的), 我们调用函数时修改的是逻辑屏幕,它不会在当前物理屏幕上显示出来.所以现在屏幕上还是什么也没有, 需要调用refresh()把我们对逻辑屏幕的改动在物理屏幕(显示器)上显示出来. 然后用getch()让屏幕暂停一下.
最后调用endwin()结束curses, 恢复原来的屏幕.

好了, 我们完成了第一个例子的分析. 是不是挺简单的?
不过不尽如人意的是屏幕还是那个样子, 没有什么色彩. 要加色彩? 那也是挺容易的: 首先用start_color()函数开启颜色模式, 然后设置我们要的颜色就行了.
curses里的颜色是配对的, 要一个背景色对一个前景色. 使用之前用init_pair()初始化.
比如init_pair(1, COLOR_BLUE, COLOR_GREEN);就定义了一组颜色, COLOR_BLUE为前景色, COLOR_GREEN为背景色. 1是它们的标记号码(供其他函数调用时使用) 我们来看一个简单的例子:

/*--------------------------------------------------------------
     A simple curses color demo program
     Coder:  jellen
     Date:   3-26-2004
-------------------------------------------------------------*/

#include <curses.h>

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 -o color color.c -lcurses
用./color一运行, 是不是有几个彩色的字? 呵呵, 虽然不好看, 但是说不定你自己以后可以用curses写出精美的程序.

好了, 我唠唠叨叨地说了那么多, 希望不会引起公愤:) 不过我想通过我这篇短文,你肯定对curses了有了一个大体的了解.
如果你对curses有兴趣,接下来你就可以自己去搜索一些资料看看了. 不过如果你发现了什么好东西不要忘了告诉大家一声哦. 这才是共享的精神.
下面两篇文章是我感到比较好的, 大家可以看看:
http://www.chinalinuxpub.com/doc/pro/curses1.html   [这是一篇入门的经典好文章]
http://www-900.ibm.com/developerWorks/cn/linux/guitoolkit/curses/hanoi/index.shtml
[这里作者给我们演示了用curses编写一个小游戏]

 

[全文完]

 

                                                                      ------------------jellen   2004-3-26

 

附:这是我第一次在CSDN发文章,东西写得十分拗口难读,希望大家谅解。

我是个Linux的初学者和爱好者,希望结交一些志同道合的朋友:jellen_2001@163.com

 


 


作者Blog:http://blog.csdn.net/jellen/

linux终端图形编程方法

终端图形编程使用curses库,提供了一些基本的屏幕操作函数。使用curses库函数:若系统没有自带安装sudo apt-get install ncurses-dev, 编程时候gcc -o fil...
  • haida_liudan
  • haida_liudan
  • 2013年04月14日 19:11
  • 1167

linux 下 curses库 安装 和使用

curses库是用来开发简单图形界面程序一个库(也许它的功能不止这些,但是目前我只知道这一个!:)。 Ubuntu下安装方法: sudo apt-get install libncurses5-d...
  • lee244868149
  • lee244868149
  • 2014年08月20日 15:11
  • 2040

UNIX下C语言的图形编程-curses.h函数库

相信您在网路上一定用过如 tin,elm 等工具, 这些软体有项共同的特色, 即他们能利用上下左右等方向键来控制游标的位置. 除此之外, 这些程式 的画面也较为美观. 对 Programming 有兴...
  • DLUTBruceZhang
  • DLUTBruceZhang
  • 2013年12月01日 20:40
  • 1982

Linux终端图形库 Curses简介和实例分析

随着电脑知识的普及, 越来越多的电脑爱好者开始了解和使用Linux.。Linux的轻松自由之风给了我们不同的感受。但是我们不能满足于基本的命令和KDE, Gnome等用户界面的操作. 我们要干什么? ...
  • linux_wgl
  • linux_wgl
  • 2012年06月21日 11:57
  • 478

Linux终端图形库Curses简介和实例分析

Linux终端图形库Curses简介和实例分析2008-12-2 13:40|查看数: 1322 随着电脑知识的普及, 越来越多的电脑爱好者开始了解和使用Linux.。Linux的轻松自由之风给了我们...
  • uunubt
  • uunubt
  • 2011年01月03日 21:15
  • 398

以下是UNIX linux 下c语言的图形编程  curses库

UNIX下c语言的图形编程--curses.h 函式库 作者:不详  来源:supcode.com收集整理  发布时间:2005-7-22 19:39:36 减小字体 增大字体 相信您在...
  • ssihc0
  • ssihc0
  • 2011年05月14日 15:19
  • 1208

学习curses图形库(一)

curses是一个在Linux/Unix下广泛应用的图形函数库.,作用是可以绘制在DOS下的用户界面和漂亮的图形。...
  • qq_15345805
  • qq_15345805
  • 2017年05月12日 14:28
  • 204

学习curses图形库(三)

现在实际使用curses图形库。 主要用到move()和addch()函数。 move()函数用于设置光标位置,以完成在终端的各个位置输出数据。 addch()函数是curses的核心输出函数,...
  • qq_15345805
  • qq_15345805
  • 2017年05月14日 22:15
  • 97

学习curses图形库(二)

头文件curses.h中定义了4个整形常量: curses命名规范: 针对所有的窗口应用而不是标准屏幕,就必须具有一个"w"作为前缀, 同时它的第一个参数是一个WINDOW结构的窗口指针。 例:mov...
  • qq_15345805
  • qq_15345805
  • 2017年05月13日 20:02
  • 83

学习curses图形库(四)

本次使用curses图形库实现 “bad apple” 字符动画。 首先在网上下载bad apple动画,时长为3:39,分辨率为1440x1080。 由于本次是通过读取图片像素点,来判断是否显示字符...
  • qq_15345805
  • qq_15345805
  • 2017年05月17日 22:20
  • 139
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux/Unix终端图形库curses简介
举报原因:
原因补充:

(最多只允许输入30个字)