ncurses 库使用介绍: 实现终端 GUI

Posted 此后如竟没有炬火 我便是唯一的光

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ncurses 库使用介绍: 实现终端 GUI相关的知识,希望对你有一定的参考价值。

这次 ENGG1340 课程的 group project 是设计并实现一个 text-base game,作为终端上运行的 text-base game,有一个出彩的 GUI 肯定是一个加分项!

在未老师的介绍下,我知道了有 <ncurses.h> 库这么一个神奇的东西;最重要的是,虽然它不属于 C++ 标准库,但是在学校 server 里居然默认下载好了 (可见其出名的功能强大)
据说很多热门的终端程序,例如 Vim,SL 都用到了 ncurses

花了一个下午学习了一下用法,在这里简单的总结一下,并且附上一些简单 GUI 组成的实例

Installation

官方 release 网址在这里

在终端上输入命令 sudo apt-get install libncurses5 进行安装

Compilation

所有使用了 <ncurses.h 库的程序,在编译时需要添加参数 -l ncurses

例: g++ -o test test.cpp -lncurses

初始化窗口对象

使用 initscr() 初始化一个窗口对象 (WINDOW 类)
初始化过后,我们接下来将与该窗口对象进行交互: std::cin/out, scan/printf 等标准输入输出将失效

Ncurses入门-安装与使用

Ncurses入门-(一)安装与使用

Ncurses是什么?

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

安装Ncurses

我们可以运行以下命令在Debian系的Linux系统下安装Ncurses:

$ sudo apt-get install libncurses5-dev

My First Window

安装成功以后,我们在try.c里写如下代码:

//try.c
#include <string.h>
#include <ncurses.h>

int main(int argc,char* argv[]){
    initscr();
    raw();
    noecho();
    curs_set(0);

    char* c = "My First Window";

    mvprintw(LINES/2,(COLS-strlen(c))/2,c);
    refresh();

    getch();
    endwin();

    return 0;
}

代码解释

保存后我们编译以上代码:

$ gcc try.c -o try -lncurses

别忘了-lncurses
接着运行./try,你能看到如下效果

解释以上代码:
initscr();初始化curses窗口
raw();这个函数会阻止字符缓冲,令程序即时处理键盘输入,一些终端命令(中断[Ctrl-c],挂起[Ctrl-z])也会被交给程序处理
noecho();屏蔽输入字符显示,键盘输入的字符将不被显示
curs_set(0);调用会屏蔽掉物理指针
mvprintw(LINES/2,(COLS-strlen(c))/2,c);输出字符串,三个参数分别为x位置,y位置和字符指针

refresh();刷新屏幕
endwin();关闭窗口

至此,我们完成这一内容

以上是关于ncurses 库使用介绍: 实现终端 GUI的主要内容,如果未能解决你的问题,请参考以下文章

C指针原理(29)-Ncurses-文本终端的图形

利用ncurses库开发终端工具箱—— ToDoList小工具开发

如何编写使用终端作为 GUI 的应用程序? (在 C 中)

Linux系统下安装ncurses库

ncurses-devel

Ncurses入门-安装与使用