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

操作系统实验报告① 操作系统实验 阅读详情

随着电脑知识的普及, 越来越多的电脑爱好者开始了解和使用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 programming
coder: jellen
date: 3-26-2004
----------------------------------------------------------------*/

#include<unistd.h>

#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 程序都必须包含的头文件,表明使用了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<unistd.h>

#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写出精美的程序.

Linux终端图形库curses curses的名字起源于"cursor optimization",即光标优化。它最早由美国伯克利大学的Bill Joy和Ken Arnold编写的,用来处理一个游戏rogue的屏幕显示。后来贝尔实验室的Mark Horton在system III Unix中重新编写了curses。现在几乎所有的Unix,Linux操作系统都带了curses函数库,curses也加入了对鼠标的支持,一些菜单和面板的处理。 阅读详情

相关推荐

用pythoncurses库打造多人文本游戏

curses库是Linux系统中用于创建文本用户界面(TUI)的编程库,起源于UNIX系统。它提供了丰富的接口用于管理终端窗口的文本输出,包括颜色、光标位置、字符属性等。随着Linux的普及,curses也成为了开发文本界面应用的重要工具之一。由于其高效性和易用性,curses成为了Unix-like系统下开发基于文本界面应用程序的首选。

weixin_42524864的博客 842

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

Linux终端图形库Curses简介和实例分析<br />2008-12-2 13:40|查看数: 1322 <br />随着电脑知识的普及, 越来越多的电脑爱好者开始了解和使用Linux.。Linux的轻松自由之风给了我们不同的感受。但是我们不能满足于基本的命令和KDE, Gnome等用户界面的操作. 我们要干什么? 编程, 对, 编程! 对于编程爱好者, Linux有着很好的编程环境: gcc(GNU Compiler Collection)能够编译C, C++, Java等很多种语言, 而且Linux

uunubt的专栏 2088

TerminalGL:终端的图形库

TerminalGL 使用终端窗口中的字符作为像素从头开始制作图形库的实验。 用法 从下载TerminalGL.jar并将其放在温暖干燥的地方。 将所有mod放在与上述jar文件位于同一目录中的名为mods的文件夹中。 如果要将它们放置在其他位置,请在jar文件所在的目录中创建一个名为settings.txt的文本文件,并写一个以mod-directory:开头的行,然后是所需mod文件夹的完整路径。 导航到jar文件的目录,并使用命令java -jar TerminalGL.jar从命令提示符运行程序。 改装 在项目的引用库中包含TerminalGL.jar 。 创建一个主类,然后根据需要命名。 这将是您mod的起点。 给它加上注释@ModMarker ,它包含两个元素: name – mod的全名。 version –模组的版本号。 (可选的) 另外,为您的主类提供以下四

快速了解使用ncurses(按键的快速响应)

了解 ncurses 基本的使用(其实就是让按键能快速响应的函数) vi /usr/include/curses.h 进入ncurses 的头文件查看键值的宏定义 综上:写一个简单的运用 ncurses 的demo #include <curses.h> int main() { int key; initscr(); //初始化 nucurse //函数keypad设置了可以在stdscr中接受键盘的功能键(快捷键),我们需要在后面的程序中定义F..

枕上青灯竹书香的博客 1150

linux下使用curses库实现滚屏、彩色打印等个性化屏幕输出

如何在程序中使用curses? 如何编译(compile) 光标的控制 有关清除屏幕的函数 如何在屏幕上显示字元 如何从键盘上读取字元 如何利用方向键 如何改变屏幕显示字元的属性 视窗的建立 多视窗处理函式的格式 视窗内的座标系 POP-UP 视窗的建立 视窗的卷动 模拟joe分割画面同时编辑两个档案

linux下应用ncurses库编写的简单的超市收银系统界面

在linux平台下,采用ncurses库式linux呈现了菜单界面,主要是ncurses库内颜色的作用,使linux摆脱了纯字符界面的局面,当然也没有达到完全的图形界面。出现了菜单框而已。我编写的很简单

一些c语言图形库

想编程绘制一些简单的图形,有不少的图形库可以选择: (1)BGI图形库:即turbo c所带的图形库。misaki 在vc(vc6,vc2008,vc2010等)下重写了该库,名为EGE 。另一个类似的vc(vc6,vc2008,vc2010)下的库名为easyX 。mingw下(也可用于vc2005和vc2008 下)移植版本名为WinBGIm (下载地址 ,头文件302行in...

codeprac 9070

基于C语言实现文本的终端图形编程库curses的分窗口实时监测【100011553】

编写设备驱动程序,即是向上层用户程序隐藏设备的具体细节,通过定义功能函数来实现透明性,相当于填充一致的文件系统接口 file_operations。由此,设备驱动程序将设备映射为特殊的设备文件,当用户程序对设备进行操作时,通过接口函数直接对设备文件处理即可。 一、实验一熟悉和理解 Linux 编程环境 二、实验二掌握添加系统调用的方法 三、实验三掌握添加设备驱动程序的方法 四、实验四理解和分析/proc 文件

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

Linux终端图形库 Curses简介和实例分析2008-03-18eNet&Ciweek不过不要急着用gcc -o hello hello.c去编译运行(我知道你会用gcc:) 那样是不能通过编译的. 因为curses库不在标准路径上, 所以我们要加上 -lcurses连接选项, 像这样:gcc -o hello hello.c -lcurses现在你用 ./hello 运行一下程序看看...

weixin_39926311的博客 289

MavLink协议入门

MAVLink是一个非常轻量化的开源的消息协议,用于无人机之间的通信以及无人机机载设备之间的通信。

ffffffeiyu的博客 2475

CentOS7下Node.js v20+安装与常见依赖库问题解决指南

本文详细介绍了在CentOS7系统下安装Node.js v20+的完整流程及常见依赖库问题的解决方案。通过升级glibc到2.28+、配置环境变量以及处理libstdc++版本问题,帮助开发者顺利在老旧系统上部署最新版Node.js,提升开发效率。

weixin_30689307的博客 157

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

随着电脑知识的普及, 越来越多的电脑爱好者开始了解和使用Linux.。Linux的轻松自由之风给了我们不同的感受。但是我们不能满足于基本的命令和KDE, Gnome等用户界面的操作. 我们要干什么? 编程, 对, 编程! 对于编程爱好者, Linux有着很好的编程环境: gcc(GNU Compiler Collection)能够编译C, C++, Java等很多种语言, 而且Linux环境下有很...

weixin_35859737的博客 461

MQTT(轻量级消息中间件)基本使用指南

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种轻量级的发布 / 订阅模式(Pub/Sub)消息传输协议,专为低带宽、不稳定网络环境设计,广泛应用于物联网(IoT)、移动设备、传感器网络等场景(如空气净化器、智能家居设备的远程控制)。Eclipse Mosquitto 是一款轻量级、开源的 MQTT 消息服务器(Broker),由 Eclipse 基金会维护,专为低资源消耗和易用性设计。

墨鸦的博客 1万+

Linux/Unix终端图形库curses简介

  Linux/Unix终端图形库curses简介 随着电脑知识的普及, 越来越多的电脑爱好者开始了解和使用Linux.。Linux的轻松自由之风给了我们不同的感受。但是我们不能满足于基本的命令和KDE, Gnome等用户界面的操作. 我们要干什么? 编程, 对, 编程! 对于编程爱好者, Linux有着很好的编程环境: gcc(GNU Compiler Collection)能够编译C, C++

lastking的专栏 1829

记一次Nacos线程数飙升排查

Nacos线程飙升问题排查

叭嘣的博客 2631

麒麟KylinV10系统yum源更换全攻略:从官方源到第三方仓库的保姆级教程

本文详细介绍了麒麟KylinV10系统yum源的更换与优化方法,包括官方源配置、第三方仓库集成及RPM包管理技巧。通过实战案例和命令示例,帮助用户快速解决软件依赖问题,提升系统管理效率。特别适合需要在国产操作系统上进行开发的工程师参考。

weixin_30752699的博客 649

0134__Linux终端图形库curses

Linux终端图形库curses_curses库-优快云博客https://www.cnblogs.com/zjzsky/p/3482889.html

行潇 161

基于Jeecgboot3.9.0的vue3版本前后端分离的flowable流程管理平台

基于Jeecgboot3.9.0的vue3版本前后端分离的flowable流程管理平台

宁波阿成的博客 902

Linux下curses函数库的详细介绍

Linux下curses函数库的详细介绍curses库介绍安装curses库函数介绍初始化和重置函数管理屏幕的函数输出到屏幕从屏幕读取清除屏幕移动光标字符属性管理键盘的函数键盘模式键盘输入管理窗口的函数窗口通用窗口函数窗口移动和更新屏幕窗口优化屏幕刷新子窗口窗口转储keypad模式彩色显示获取位置获取光标位置 curses库介绍   curses是一个在Linux/Unix下广泛应用的图形函数库,...

weixin_43855330的博客 6226

YOLOv11的扩散模型去噪预处理-(在推理前对低质量图像进行增强)

摘要: 扩散模型与YOLOv11的结合有效提升了复杂场景下的目标检测性能。针对低质量图像(如噪声、低光照)导致YOLOv11特征提取退化的问题,研究提出了一种基于条件扩散模型的预处理方法。通过语义引导的渐进式去噪,在保留关键检测特征的同时,显著改善了图像质量。技术核心包括:1)利用YOLOv11浅层特征作为条件输入;2)交叉注意力机制实现任务感知去噪;3)知识蒸馏与潜空间扩散加速推理。实验表明,该方法使mAP50提升19%,在15步内达到传统百步去噪效果,平衡了精度与实时性需求,为鲁棒性目标检测提供了新思路

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 877

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

linux终端 图形库,linux下图形编程库curses.h

和 一并 include 进来.另外, 在 System V 版本中,这个函数库也将一并include进来.#includemain(){: :: :}当然, 您的系统内必须放有 curses.h 这个函数库.■ 如何编译(compile)当您编辑好您的程序, 在 UNIX 提示符号下键入:% /usr/5bin/cc [file.c] -lcurses^^^^^^^引进 curses.h 这个...

weixin_40006133的博客 363

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Linux下的图形库curses写贪吃蛇,酷

最近看到大神在Linux下写的贪吃蛇代码,用到了curses图形库,可能很多人都没有用过,分享出来给大家。在ubuntu下安装curses图形库命令sudoapt-getinstall...

嵌入式Linux 810

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

上一篇: arm-linux-gcc /usr/lib/libstdc++.so.6:version`GLIBCXX_3.4.9'notfound
下一篇: 关于几个时间函数
developer_wgl
博客等级 码龄15年 407粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值