当前位置: 首页 > 科技观察

使用ncurses在Linux屏幕上放置文本

时间:2023-03-14 18:42:12 科技观察

使用ncurses将文本放置在Linux屏幕上的特定位置可以带来更加用户友好的体验。大多数Linux实用程序只是在屏幕底部滚动文本。如果你想把你的文字放在屏幕上,比如游戏或数据显示,你可以试试ncurses。curses是一个旧的Unix库,用于在文本终端界面中控制光标。curses这个名字来自术语“光标控制”。多年来,其他人编写了新版本的curses,添加了新功能,称为“新curses”或“ncurses”。您可以在每个流行的Linux发行版中找到ncurses。尽管默认情况下可能不会安装开发库、头文件和文档。例如,在Fedora上,您需要使用以下命令安装ncurses-devel包:$sudodnfinstallncurses-devel在程序中使用ncurses要在屏幕上直接寻址,首先需要初始化ncurses库。大多数程序使用以下三行来完成此操作:initscr():初始化窗口对象和ncurses代码,返回代表整个屏幕的窗口对象cbreak():禁用缓冲并使键入的输入立即可用noecho():关闭Echo,所以用户输入不会显示在屏幕上这些函数在curses.h头文件中定义,您需要通过以下方式将其包含在您的程序中:#include初始化终端后,您可以自由使用任何ncurses函数的一部分,我们将在示例程序中探讨其中的一些函数。当您使用完ncurses并想返回常规终端模式时,请使用endwin()重置所有内容。此命令重置任何屏幕颜色,将光标移动到屏幕的左下角,并使光标可见。通常这是在退出程序之前完成的。在屏幕上寻址关于ncurses首先要知道的是屏幕的坐标是分行和列的,左上角是0,0。ncurses定义了两个全局变量来帮助你识别屏幕:LINES是屏幕上的行数,COLS是屏幕上的列数。屏幕右下角的位置是LINES-1,COLS-1。例如,要将光标移动到第10行第30列,可以使用move()函数移动到这个坐标:move(10,30);之后显示的任何文本都将从屏幕上的那个位置开始。要显示单个字符,请对单个字符使用addch(c)函数。要显示字符串,将在字符串上使用addstr(s)函数。对于类似于printf的格式化输出,请使用带有常用选项的printw(fmt,...)。移动到屏幕上的指定位置并显示文本是很常见的事情,ncurses提供了同时执行这两项操作的快捷方式。mvaddch(row,col,c)函数将在屏幕上的行row和列col处显示一个字符。而mvaddstr(row,col,s)函数将在屏幕上的行row和列col处显示一个字符串。举一个更直接的例子,使用mvaddstr(10,30,"Welcometoncurses");在程序中;该函数将在屏幕上的第10行和第30列显示文本Welcometoncurses。使用mvaddch(0,0,'+')函数将在屏幕左上角的第0行和第0列显示一个加号(+)。在终端屏幕上绘制文本会对某些系统产生性能影响,尤其是在较旧的硬件终端上。所以ncurses允许您“堆叠”一堆文本以显示在屏幕上,然后使用refresh()函数使所有这些更改对用户可见。让我们看一个将以上所有内容结合在一起的简单示例:#includeintmain(){initscr();中断();没有回声();mvaddch(0,0,'+');mvaddch(LINES-1,0,'-');mvaddstr(10,30,"按任意键退出");刷新();获取();endwin();}程序开始初始化一个终端窗口,然后在屏幕左上角打印一个加号,在左下角打印一个减号,按任意键退出文本是打印在第10行和第30列。该程序使用getch()函数从键盘接收单个字符,然后使用endwin()函数在程序完全退出之前重置终端。getch()是一个非常有用的函数,你可以用它来做很多事情。我经常在退出程序之前使用它来暂停。与大多数ncurses函数一样,还有一个称为mvgetch(row,col)的getch()版本,它在等待字符输入之前移动到屏幕位置的行row、列col。使用ncurses编译如果您尝试以通常的方式编译此示例程序,例如gccpause.c,您可能会从链接器中得到一个巨大的错误列表。那是因为GNUC编译器不会自动链接ncurses库。相反,您需要使用-lncurses命令行选项加载它以进行链接。$gcc-opausepause.c-lncurses运行新程序将打印一条简单的按任意键退出消息,该消息大致位于屏幕中央:图1:程序中居中的“按任意键退出”消息。使用ncurses构建更好的程序探索ncurses库函数以了解在屏幕上显示文本的其他方式。您可以在ncurses手册页中找到所有ncurses函数的列表。这给出了ncurses的一般概述,并提供了不同ncurses函数的类似表格的列表,并参考手册页以获取完整详细信息。例如,在curs_printw(3X)手册页中描述了printw,可以通过以下方式查看:$man3xcurs_printw甚至更简单:$mancurs_printw使用ncurses,您可以创建更有趣的程序。通过在屏幕上的特定位置打印文本,您可以创建在终端中运行的游戏和高级实用程序。