Linux Ncurses库部分函数使用说明

目录

1. initscr()函数

2. endwin()函数

3. curs_set()函数

4.noecho()函数

5. keypad()函数

6.  start_color()函数

7.init_pair()函数

8.getch()函数

9.move()函数

10.addch()函数

11. refresh()函数

12.inch()函数


首先需要在ubuntu系统上安装库文件,支持ncurses:

apt-get install libncurses5-dev

        由于curses函数库在使用时需要创建和删除一些临时的数据结构,所以所有的curses程序必须在开始使用curses函数库之前对其进行初始化,并在结東使用后允许curses恢复原先设置。这两项工作是由initscr和endwin函数分别完成的

1. initscr()函数

initscr()用于初始化ncurses数据结构并读取正确的terminfo文件。内存将被分配。如果发生错误,initscr将返回ERR,否则将返回指针。此外,屏幕将被删除并初始化。

2. endwin()函数

endwin()将清除ncurses中所有已分配的资源,并将tty模式恢复为调用initscr()之前的状态 。必须在ncurses库中的任何其他函数之前调用它,并且必须在程序退出之前调用endwin()。当您想要输出到多个终端时,可以使用 newterm(...)而不是initscr()。


20 | linux的图形函数库 curses(基本的输入输出,以及字符显示格式) - 独立树 - 博客园 (cnblogs.com)icon-default.png?t=N7T8https://www.cnblogs.com/mmxingye/p/16335734.html

#include <unistd.h>
#include <stdlib.h>
#include <curses.h>int main()
{initscr();move(5,15);printw("%s","hello world");refresh();sleep(2);endwin();exit(EXIT_SUCCESS);
}

 所有的curses程序必须以initscr函数开始,以endwin 函数结束。

        initscr函数在一个程序中只能调用一次。 如果成功,它返回一个指向stdscr结构的指针;如果失败,它就输出一条诊断错误信息并使程序退出。endwin函数在成功时返回OK,失败时返回ERR。

3. curs_set()函数

        这个函数用来设制光标是否可见。它的参数可以是:0(不可见),1(可见),2(完全可见)

4.noecho()函数

        ECHO模式即回显模式,ECHO模式用来决定用户的输入是否立即回显。

        当ECHO模式设置后,它使得在键盘上输入的每一个字符都在终端屏幕上当前光标处显示出来,在调用某些函数如addch()的时候字符显示后光标的位置将自动的向后移动一个位置。

        在非回显模式下,字符的显示必须由程序本身来完成,否则字符不会显示。

        非回显模式下按键通常用来控制屏幕的操作而不是用来进行字符输入。

        echo()用来设置回显模式,noecho()关闭回显模式。

        默认情况下回显模式是打开的。

函数语法:int echo(),返回值为OK或ERR;int noecho(),返回值为OK或ERR。

 不使用noecho()的结果:

使用noecho()的结果: 

5. keypad()函数

        这个函数允许使用功能键,例如:F1、F2、方向键等功能键。几乎所有的交互式程序都需要使用功能键,因为绝大多数用户界面主要用方向键进行操作。使用keypad(stdscr,TURE)就为“标准屏幕”(stdscr)激活了功能键。


keypad(stdscr, 1); 是一个用于启用或禁用 ncurses 中的键盘特殊字符传输的函数调用。在这个函数中,stdscr 是一个标准的 ncurses 窗口,表示标准屏幕。第二个参数 1 表示启用特殊字符传输,这意味着 ncurses 将捕获并处理诸如方向键、功能键等特殊按键的输入。通常情况下,当您想要处理特殊按键(如方向键、功能键等)时,您会在使用 ncurses 库创建的窗口中调用 keypad 函数,以确保程序能够正确地捕获和处理这些按键。

6.  start_color()函数

要启动彩色机制,必须先调用start_color()函数,之后就可以在终端屏幕上调用其它处理颜色的函数。如果要检测当前屏幕是否支持彩色显示,可以调用has_colors()函数,如果终端屏幕不支持彩色显示,那么该函数将返回FLASE。 在调用start_color()函数后,curses 就初始化了当前终端支持的所有颜色。然后就可通过像COLOR_BLACK 这样的宏调用各种颜色。

ncurses关于颜色系统:start_color(),has_colors(),init_pair(),color_content(),pait_content()_start_color函数-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/Rong_Toa/article/details/80766592

7.init_pair()函数

改变颜色定义
init_color()函数可以用来在初始化颜色的时候改变某个颜色的RGB 值。比如你想减弱预定的红色设置。
你就可以这样调用此函数:
init_color(COLOR_RED, 700, 0, 0);
/* 参数1 : 颜色名称
/* 参数2, 3, 4 : 分别为R(red),G(green),B(blue)的数值(最小值:0 最大值:1000)*/如果你的显示终端无法改变颜色设置,函数将返回ERR。can_change_color()函数可以用来监测你的终端是否支持这样的颜色改变。RGB 参数的值是0 到1000 的整数。默认的红色(COLOR_RED)的定义是R:1000,G:0,B:0 。
	init_pair(1,COLOR_WHITE,COLOR_RED);init_pair(2,COLOR_GREEN,COLOR_WHITE);

这两行代码是用于初始化颜色对的函数调用,用于设置 ncurses 库中使用的颜色对。init_pair(1, COLOR_WHITE, COLOR_RED);
这行代码将颜色对 1 初始化为白色文本(COLOR_WHITE)和红色背景(COLOR_RED)。init_pair(2, COLOR_GREEN, COLOR_WHITE);
而这行代码则将颜色对 2 初始化为绿色文本(COLOR_GREEN)和白色背景(COLOR_WHITE)。在使用 ncurses 库进行屏幕绘制时,您可以使用这些颜色对来设置文本和背景的颜色组合,以增强显示效果。
例如,您可以使用 attron 和 attroff 函数与 COLOR_PAIR 宏来应用特定颜色对,如下所示:attron(COLOR_PAIR(1));
printw("This text has white text on red background\n");
attroff(COLOR_PAIR(1));attron(COLOR_PAIR(2));
printw("This text has green text on white background\n");
attroff(COLOR_PAIR(2));这将在屏幕上显示两行文本:
第一行文本的颜色为白色,背景为红色;
第二行文本的颜色为绿色,背景为白色。

8.getch()函数

        在 Linux 上使用 ncurses 库提供的 getch() 函数来获取用户输入的单个字符。getch() 函数会等待用户按下一个键,并返回对应的 ASCII 值或者特殊键的键码

9.move()函数

   move() 是 ncurses 库中的一个函数,用于移动光标到指定位置。它的原型如下:

int move(int y, int x); 

        其中,yx 是目标位置的行和列。行数从0开始计数,列数也从0开始计数。这个函数返回 OK(0) 表示成功,返回 ERR 表示失败。

#include<stdio.h>
#include<curses.h>
int main(int argc,const char* argv[])
{char ch;initscr();curs_set(0);noecho();keypad(stdscr,1);start_color();init_pair(1,COLOR_WHITE,COLOR_RED);init_pair(2,COLOR_GREEN,COLOR_WHITE);move(5,5);addch('C');refresh();ch = getch();if(ch == 'Q'){attron(COLOR_PAIR(1));move(10,10);addch('A');refresh();attroff(COLOR_PAIR(1));}move(10,10);ch = (char)inch();if(ch == 'A'){attron(COLOR_PAIR(2));move(10,11);addch('B');refresh();attroff(COLOR_PAIR(2));}move(15,15);addch('D');refresh();while(1);endwin();return 0;
}

但是不屏蔽move(10,10);打印结果如下:

原因是:

  1. 第一个 move(10,10); 是在检查用户是否按下 'Q' 键时使用的。如果用户按下 'Q' 键,程序会在屏幕上的坐标位置 (10, 10) 添加字符 'A'。因此,在检查用户输入之前,你需要确保光标位于正确的位置,以便在屏幕上正确显示字符 'A'。

  2. 第二个 move(10,10); 出现在检查输入字符是否为 'A' 时。同样,如果 'A' 被输入,程序会在屏幕上的坐标位置 (10, 11) 添加字符 'B'。因此,在检查输入字符之前,也需要将光标移动到正确的位置。

10.addch()函数

   addch() 是 ncurses 库中的一个函数,用于在当前光标位置输出一个字符。它的原型如下:

int addch(const chtype ch); 

        其中,ch 是要输出的字符,类型为 chtype,通常是一个字符常量或者是一个字符和属性的组合。

  addch() 函数将指定的字符输出到当前光标位置,并将光标向后移动一个位置。如果光标已经在行的末尾,它将移动到下一行的行首。

11. refresh()函数

   refresh() 是 ncurses 库中的一个函数,用于刷新屏幕并更新其中的内容。在使用 ncurses 库时,您通常会在更新屏幕上的内容后调用 refresh() 函数,以便将更改立即显示在屏幕上。

        当您调用诸如 addch()printw() 等函数向屏幕上添加内容后,这些更改不会立即显示在屏幕上。相反,它们会在内部缓冲区中等待显示。只有在调用了 refresh() 函数后,这些更改才会被实际渲染到屏幕上。

12.inch()函数

  inch() 是 ncurses 库中的一个函数,用于获取指定位置的单个字符及其属性。它的原型如下:

chtype inch(void);

      该函数返回一个 chtype 类型的值,其中包含指定位置的字符及其属性。chtype 是一个整数类型,通常包含字符及其相关的属性信息,如颜色、特殊效果等。

示例代码:

#include<stdio.h>
#include<curses.h>
int main(int argc,const char* argv[])
{char ch;initscr();curs_set(0);noecho();keypad(stdscr,1);start_color();init_pair(1,COLOR_WHITE,COLOR_RED);init_pair(2,COLOR_GREEN,COLOR_WHITE);ch = getch();if(ch == 'Q'){attron(COLOR_PAIR(1));move(10,10);addch('A');refresh();attroff(COLOR_PAIR(1));}move(10,10);ch = (char)inch();if(ch == 'A'){attron(COLOR_PAIR(2));move(20,20);addch('B');refresh();attroff(COLOR_PAIR(2));}while(1);endwin();return 0;
}

打印结果: 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/770213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实战|使用 Node.js 和 htmx 构建全栈应用程序

在本教程中&#xff0c;我将演示如何使用 Node 作为后端和 htmx 作为前端来构建功能齐全的 CRUD 应用程序。这将演示 htmx 如何集成到全栈应用程序中&#xff0c;使您能够评估其有效性并确定它是否是您未来项目的不错选择。 htmx 是一个现代 JavaScript 库&#xff0c;旨在通过…

多叉树题目:N 叉树的前序遍历

文章目录 题目标题和出处难度题目描述要求示例数据范围进阶 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 解法三思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;N 叉树的前序遍历 出处&#xff1a;589. N 叉树的前序遍历 难度 3 级 题目…

一文速通自监督学习(Self-supervised Learning):教机器自我探索的艺术

一文速通自监督学习&#xff08;Self-supervised Learning&#xff09;&#xff1a;教机器自我探索的艺术 前言自监督学习是什么&#xff1f;自监督学习的魔力常见的自监督学习方法1. 对比学习2. 预测缺失部分3. 旋转识别4. 时间顺序预测 结语 &#x1f308;你好呀&#xff01;…

Docker新手攻略:编辑Dockerfile、构建镜像、启动容器全攻略

万能dockerfile编写模板文件 FROM openjdk:11.0 as builder WORKDIR application ARG JAR_FILEtarget/*.jar COPY ${JAR_FILE} application.jar RUN java -Djarmodelayertools -jar application.jar extractFROM openjdk:11.0 WORKDIR application COPY --frombuilder applica…

Springboot项目结构

1. 一个正常的企业项目里一种通用的项目结构和代码层级划分的指导意见&#xff1a; 一般分为如下几层&#xff1a; 开放接口层 终端显示层 Web 层 Service 层 Manager 层 DAO 层 外部接口或第三方平台 2. 以当下非常火热的Spring Boot典型项目结构为例&#xff0c;创建出…

代码随想录算法训练营第三十四天 |1005. K 次取反后最大化的数组和 、134. 加油站、135. 分发糖果

代码随想录算法训练营第三十四天 |1005. K 次取反后最大化的数组和 、134. 加油站、135. 分发糖果 1005. K 次取反后最大化的数组和题目解法 134. 加油站题目解法 135. 分发糖果题目解法 感悟 1005. K 次取反后最大化的数组和 题目 解法 考虑绝对值 class Solution { public…

真机笔记(3) 真机需求讲解

目录 拓扑分析&#xff1a; 设计理念&#xff1a; 1. 生产区交换需求&#xff1a; 2. 生产区交换需求&#xff1a; 3. 服务器区交换需求&#xff1a; 4. 路由设计 5. 地址规划&#xff1a; 拓扑分析&#xff1a; 蓝色&#xff1a;网线 红色&#xff1a;多模光纤 黄色&am…

【SpringBoot框架篇】37.使用gRPC实现远程服务调用

文章目录 RPC简介gPRC简介protobuf1.文件编写规范2.字段类型3.定义服务(Services) 在Spring Boot中使用grpc1.父工程pom配置2.grpc-api模块2.1.pom配置2.2.proto文件编写2.3.把proto文件编译成class文件 3.grpc-server模块3.1.pom文件和application.yaml3.2.实现grpc-api模块的…

2-Flume之Sink与Channel

Flume Sink HDFS Sink 将数据写到HDFS上。数据以文件形式落地到HDFS上&#xff0c;文件名默认是以FlumeData开头&#xff0c;可以通过hdfs.filePrefix来修改 HDFS Sink默认每隔30s会滚动一次生成一个文件&#xff0c;因此会导致在HDFS上生成大量的小文件&#xff0c;实际过程…

使用git下载github/gitee仓库部分或单个文件的方法

前言 有些时候在github或者gitee仓库中我们只需要下载整个项目中的我门需要的那一部分文件夹或文件就行了&#xff0c;不需要下载所有的项目。这样可以节省很多流量和时间 步骤 1.建立一个新的 git 本地仓库 这里我在D:\test中初始化 命令&#xff1a; git init2.在本地仓…

Istio 部署 Spring Coud 微服务应用

Istio 服务部署 这篇文章讲述如何将 Java Spring Cloud 微服务应用部署到 Istio mesh 中。 准备基础环境 使用 Kind 模拟 kubernetes 环境。文章参考&#xff1a;https://blog.csdn.net/qq_52397471/article/details/135715485 在 kubernetes cluster 中安装 Istio 创建一…

Excel双击单元格后弹窗输入日期

Step1. 在VBE界面新建一个窗体(Userform1),在窗体的工具箱的空白处右键,选中添加附件,勾选Calendar control 8.0,即可完成日历的添加。 PS:遗憾的是, Office 64 位没有官方的日期选择器控件。唯一的解决方案是使用Excel 的第三方日历。 参考链接:How to insert calen…

电路笔记 :灯光画 JLC 嘉立创EDA+PCB打样(笔记)

项目介绍 PCB板灯光画(可行性验证)&#xff0c;PCB灯光画无论是电路原理还是焊接都非常简单&#xff0c;所有元器件均采用0805及体积更大的封装&#xff0c;只需要电烙铁和焊锡丝等基础的工具就能制作&#xff0c;新手小白也能轻松复刻&#xff0c;里边还有PCB板实现灯光画效果…

数据交换技术

目录 <线路交换> <报文交换> <分组交换> 1.数据报分组交换 2.虚电路分组交换 计算机网络是以数据交换为目的的技术&#xff0c;从交换技术的发展过程来看&#xff0c;主要经历了线 路交换、报文交换、分组交换的过程。 <线路交换> 线路交换又称为…

vue3+threejs新手从零开发卡牌游戏(十):创建己方战域

首先在game目录下创建site文件夹&#xff0c;用来存放战域相关代码&#xff1a; 这里思考下如何创建战域&#xff0c;我的想法是添加一个平面&#xff0c;将己方战域和对方战域都添加进这个平面中&#xff0c;所以首先我们先添加一个战域plane&#xff0c;site/index.vue代码如…

[蓝桥杯 2020 省 AB1] 网络分析

一开始写的暴力合并 卡n^2过的不是正解 看正解是类似 虚拟点树形DP的思路 很巧妙 记录一下 #include<bits/stdc.h> using namespace std; using ll long long; using pii pair<int,int>; #define int long long const int N 3e510; const int inf 0x3f3f3f3f; …

【RPG Maker MV 仿新仙剑 战斗场景UI (八)】

RPG Maker MV 仿新仙剑 战斗场景UI 八 状态及装备场景代码效果 状态及装备场景 本计划在战斗场景中直接制作的&#xff0c;但考虑到在战斗场景中加入太多的窗口这不太合适&#xff0c;操作也繁琐&#xff0c;因此直接使用其他场景。 代码 Pal_Window_EquipStatus.prototype.…

Word邮件合并

Word邮件合并功能可以解决在Word中批量填写内容的需求&#xff0c;当需要大量格式相同&#xff0c;只修改少数相关内容时&#xff0c;例如利用Word制作工资条&#xff0c;通知函&#xff0c;奖状等等&#xff0c;同时操作也非常简单灵活。下面通过例子来说明邮件合并的使用方法…

突破距离限制 远程级联测径仪 让您使用更安心!

关键词&#xff1a;在线测径仪,测径仪,远程级联 在现代工业领域&#xff0c;测量的准确性和高效性至关重要。在线测径仪不仅具备了这两项特质&#xff0c;更能进行远程级联&#xff0c;能更快速的为您解决软件系统在使用中遇到的问题。 在线测径仪能做到以下几点 精准测量&am…