Ncurses介绍

Ncurses是一个库,用于创建在终端上运行的交互式应用程序。它提供了屏幕管理、颜色支持、键盘输入处理等功能,使得开发者能够在字符界面下创建具有菜单、滚动和删除操作的界面。Ncurses还涉及到数据结构的使用,以高效地管理屏幕缓冲区。
摘要由CSDN通过智能技术生成

Ncurses介绍

摘要:

Ncurses是一个能提供功能键定义(快捷键),屏幕绘制以及基于文本终端的图形互动功能的动态库

 

什么是Ncurses?

您希望您的程序有一个彩色的界面吗?Ncurses是一个能提供基于文本终端窗口功能的动态库. Ncurses可以:

  • 只要您喜欢,您可以使用整个屏幕
  • 创建和管理一个窗口
  • 使用8种不同的彩色
  • 为您的程序提供鼠标支持
  • 使用键盘上的功能键


Ncurses可以在任何遵循ANSI/POSIX标准的UNIX系统上运行,除此之外,它还可以从系统数据库中检测终端的属性, 并且自动进行调整,提供一个不受终端约束的接口.因此,Ncurses可以在不同的系统平台和不同的终端上工作的非常好.

mc工具集就是一个用ncurses写的很好的例子,而且在终端上系统核心配置的界面同样是用ncurses编写的. 下面就是它们的截图:

[Midnight Commander]

[kernel config]  

哪里可以下载?

Ncurses是基于GNU/Linux发展的,请访问 http://www.gnu.org/software/ncurses/以获得最新的更新版本或者其他详细信息以及相关链接 .

 

基础知识

为了能够使用ncurses库,您必须在您的源程序中将curses.h包括(include)进来,而且在编译的需要与它连接起来. 在gcc中您可以使用参数-lcurses进行编译.

在使用ncurses的时候,您有必要了解它的基础数据结构.它有一个WINDOW结构,从名字就很容易知道,它是用来描述 您创建的窗体的,所有ncurse库中的函数都带有一个WINDOW指针参数.

在ncurses中使用最多的组件是窗体.即使您没有创建自己的窗体,当前屏幕会认为是您自己的窗体. 如同标准输入输出系统提供给屏幕的文件描述符stdout一样(假设没有管道转向),ncurses提供一个 WINDOW指针stdscr做相同工作.除了stdscr外,ncurses还定义了一个WINDOW指针curscr. 和stdscr描述当前屏幕一样,curscr描述当前在库中定义的屏幕,您可以带着"他们有什么区别?"这个问题继续阅读.

为了在您的程序中使用ncurses的函数和变量,您必须首先调用initscr函数(初始化工作),它会给一些变量比如 stdscr,curscr等分配内存,并且让ncurses库处于准备使用状态,换句话说,所有ncurses函数必须跟在initscr后面. 同样的约定,您在结束使用ncurses后,应该使用endwin来释放所有ncurses使用的内存.在使用endwin后,您将不能在使用 任何ncurses的函数,除非您再一次调用initscr函数.

在initscr和endwin之间,请不要使用标准输入输出库的函数输出结果到屏幕上,否则,您会看到屏幕会被您的输出 弄的乱七八糟,这可不是您期望的结果.当ncurses处在激活状态时,请使用它自己的函数来把结果输出到屏幕.在调用initscr之前或者 endwin之后,您就可以随便使用了.

 

刷新屏幕:refresh

WINDOW结构不会经常保持同一高度宽度以及在窗体中的位置,但是会保持在窗体中的内容.当您向窗体写入数据时, 会改变窗体中的内容,但并不意味着在屏幕中会立即显示出来,要更新屏幕内容,必须调用refresh或者wrefres函数.

这里介绍了stdscr和curscr两者之间的区别.curscr保存着当前屏幕的内容,在调用ncurse的输出函数后,stdscr和curscr可能会有不同的内容, 如果您想在最近一次屏幕内容改变后让stdscr和curscr保持一致,您必须使用refresh函数.换句话说, refresh是唯一一个处理curscr的函数.千万不要弄混淆了curscr和stdscr,应该在refresh函数中更新curscr中的内容

refresh有一个能尽可能快的更新屏幕的机制,当调用refresh时,它只更新窗体中内容改变的行,这节省了CPU的处理时间 ,防止程序往屏幕上写相同的信息(译者注:在屏幕的同一位置不用重新显示同样的内容.)这种机制就是为什么同时使用ncurses的函数 和标准的输入输出函数会造成屏幕内容错位的原因.当调用ncurses的输出函数时,它会设置一个标志,能让refresh 知道是哪一行改变了.但是您调用标准输入输出函数时,就不会产生这种结果.

refresh和wrefresh其实做了同样的事情.wrefresh需要一个WINDOW的指针参数,它仅仅刷新该窗体的内容. refresh()等同于wrefresh(stdscr).我在后面会提到,和wrefresh一样,ncursers的许多函数都有许多这种为stdscr定义的宏函数.

 

定义一个新的窗体

下面我们来谈谈能定义新窗体的subwin和newwin函数.他们都需要一个来定义新窗体的高度,宽度以及 左上角位置的参数,并且返回一个WINDOW指针来指向该窗体.您可以使用它来作为wrefresh的参数或者一些其他我将要 谈到的函数.

您可能会问:"如果他们做同样的事情,为什么要有两个函数?",您是对的,他们之间有一些细微的差别.subwin创建一个 窗体的子窗体,它将继承了父窗体的所有属性.但如果在子窗体中改变了这些属性的值,它将不会影响父窗体.

除此之外,父窗体和子窗体之间还有一些联系.父窗体和子窗体中的内容将彼此共享,彼此影响.换句话说, 在父窗口和子窗体重叠的区域的字符会被任意一个窗体改变.如果父窗体写入了数据到这块区域,子窗体中这块区域同样 改变了,反之也是如此.

和subwin不同的是,newwin创建一个独有的窗体.这样的窗体,在没有他们的子窗体之前,是不会和其他窗体共享 任何文本数据的.使用subwin的好处是可以使用较少的内存就可以方便的共享字符数据了.但是如果您担心窗体数据会互相影响 那么就应该使用newwin.

您可以创建任意多层的子窗体,每一个子窗体又可以有它自己的子窗体,但是一定要记住,窗体的字符内容是被两个以上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值