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

以前学过TC2.0的朋友肯定还记得TC里边有一个图形库BGI(Borland Graphics Interface, 还记得那个头文件吗:). 用它我们可以绘制在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 programmingcoder: jellendate: 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 -o hello hello.c去编译运行(我知道你会用gcc:) 那样是不能通过编译的. 因为curses库不在标准路径上, 所以我们要加上 -lcurses连接选项, 像这样:

gcc -o hello hello.c -lcurses

现在你用 ./hello 运行一下程序看看,是不是出现了你所期望的窗口.

现在我们来一行行分析一下代码.

#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!");

这两句是把光标移到屏幕中间, 然后输出我们的"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 programCoder: jellenDate: 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 -o color color.c -lcurses

用./color一运行个彩色的字? 呵呵, 虽然不好看, 但是说不定你自己以后可以用curses写出精美的程序。

【相关文章】

java 字符界面 curses_Linux终端图形库 Curses简介和实例分析相关推荐

  1. SSL/TLS 协议简介与实例分析

    作者:drinkey 以前读RFC时总结的一篇文章,主要介绍了SSL/TLS协议的相关知识,包括协议本身以及简单的密码学概念,以及用实例解析了HTTP over SSL的协商过程,在最后简要列出了SS ...

  2. java list用法_Java List 用法详解及实例分析

    Java List 用法详解及实例分析 Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解. List:元素是有序的(怎么存的就怎么取出来,顺 ...

  3. SPI简介与实例分析

    SPI简介 SPI 协议是由Motorola提出的通讯协议 (Serial Peripheral Interface) ,是一种高速全双工的串行通信总线. SPI 通讯使用 3 条总线 :SCK. M ...

  4. java 字符界面 curses_[C++]Linux之图形界面编程库[curses库]之入门教程

    0. 环境 x86 / 64bit Linux Ubuntu 16.04 1. 安装 //方法一 sudo apt-get install libncurses5-dev [ ubuntu 16.04 ...

  5. java责任链设计模式 订单_Java责任链设计模式实例分析

    本文实例讲述了Java责任链设计模式.分享给大家供大家参考,具体如下: 一 代码 abstract class AbstractHandler { private Handler Handler = ...

  6. java aes pbe_JAVA对称加密算法PBE定义与用法实例分析

    本文实例讲述了JAVA对称加密算法PBE定义与用法.分享给大家供大家参考,具体如下: 一 AES.DES和3DES在使用上比较一致 二 PBE算法优点 三 PBE介绍 1.PBE:Password B ...

  7. java collection源码_jdk源码阅读Collection实例分析

    jdk源码阅读Collection详解 见过一句夸张的话,叫做"没有阅读过jdk源码的人不算学过java".从今天起开始精读源码.而适合精读的源码无非就是java.io,.util ...

  8. java中多态案例工厂类,Java中构造器内部的多态方法的行为实例分析

    本文实例讲述了Java中构造器内部的多态方法的行为操作.分享给大家供大家参考,具体如下: 这篇文章主要讨论的是,若在一个构造器中调用正在构造的对象的某个动态绑定的方法时会出现的情况.在此之前,我们需要 ...

  9. java 中文 正则_Java正则匹配中文的方法实例分析

    本文实例讲述了Java正则匹配中文的方法.分享给大家供大家参考,具体如下: 1.匹配双引号间内容: public void test1() { // 匹配双引号间内容 String pstr = &q ...

最新文章

  1. 大学计算机实验vfp,大学计算机基础VFP实验教材26页.doc
  2. dy之xgorgon0404参数
  3. RabbitMQ 拓展基础组件封装思路
  4. ie ajax异步缓存,IE下发送Ajax请求的缓存问题
  5. window常用的『运行』命令
  6. python函数超时,用装饰器解决 func_timeout
  7. Axure RP 8.0安装和汉化
  8. Matlab R2014b配置vlfeat0.9.20
  9. 今天来看一下云测平台的测试实验
  10. sql server关系代数练习--进阶
  11. Excel中index和match结合解决vlookup匹配出错问题
  12. 总成绩和平均分计算------C语言
  13. DownUnderCTF 2021 osint 赛后复现
  14. centos7 telnet访问mysql出错Connection closed by foreign host
  15. Vue vuex vue-router
  16. 基于ENVI5.3的Landsat条带去除、辐射定标、大气校正
  17. 《463个生活小窍门》石坝版
  18. 苹果手机可以投影到墙上吗_卧室用投影仪可以推荐一下吗?
  19. 圣斗士星矢服务器维护时间,7月2日服务器维护更新公告
  20. 【C++学习笔记】趣谈引用

热门文章

  1. springboot+ssm+java停车场停车缴费管理系统
  2. 吴恩达机器学习课程全(python实现)
  3. CAD怎么转换版本?转换器轻松转换
  4. Visual Studio 小技巧:自定义代码片断
  5. 智林电子白板软件使用培训讲义
  6. android web一条龙,Ubuntu JavaWeb类型项目一条龙环境搭建
  7. 银行柜面系统_无纸化办公!就是这么给力!! 临猗农商银行新一代柜面系统成功上线!!!...
  8. 华为S5720-52X-PWR-LI/S5720-52X-LI交互机堆叠和VLAN配置
  9. 俄罗斯方块源码(彩色版)
  10. ES系统封装教程 高级进阶版 提供Wind7,xp系统下载 (by 星空武哥)