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;
}

打印结果: 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux 进程概念】

【Linux 进程概念】 冯诺依曼体系结构冯诺依曼结构简要解释&#xff1a;你用QQ和朋友聊天时数据的流动过程 操作系统(OperatorSystem)概念设计OS的目的定位操作系统的上下层都分别是什么如何理解“管理"总结 进程基本概念描述进程-PCBtask_ struct内容 组织进程查看进程通…

序列化与反序列化介绍

文章目录 一、序列化与反序列化二、PHP反序列化漏洞成因三、JAVA反序列化 一、序列化与反序列化 在PHP语言开发层面上基本都是围绕着serialize()&#xff0c;unserialize()这两个函数。serialize()函数序列化对象后&#xff0c;可以很方便的将它传递给其他需要它的地方&#x…

由浅到深认识Java语言(9):Eclipse IDE简介

该文章Github地址&#xff1a;https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.c…

【蓝桥杯入门记录】继电器、蜂鸣器及原理图分析

一、继电器、继电器概述 &#xff08;1&#xff09;蜂鸣器原理 蜂鸣器的发声原理由振动装置和谐振装置组成&#xff0c;而蜂鸣器又分为无源他激型与有源自激型&#xff0c;蜂鸣器的发声原理为: 1、无源他激型蜂鸣器的工作发声原理是&#xff1a;方波信号输入谐振装置转换为声…

稀碎从零算法笔记Day23-LeetCode:二叉树的最大深度

题型&#xff1a;链表、二叉树的遍历 链接&#xff1a;104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上…

ES集群不识别节点SSL证书的问题处理

问题描述 在启动ES服务并试图加入其他节点上已启动的集群时&#xff0c;出现报错(原文是一大段话&#xff0c;我按语义拆成了几段)&#xff1a; [2024-03-19T16:32:02,844][WARN ][o.e.c.s.DiagnosticTrustManager] [node-2-master] failed to establish trust with server a…

高压线下垂钓很危险!高压线下防垂钓智能语音警示杆:科技守护生命

初春时节&#xff0c;气温逐渐回升&#xff0c;在这阳光明媚的日子里&#xff0c;大批“捕鱼达人”纷纷开始行动&#xff0c;河边、池塘、水库……不放过任何一个垂钓点&#xff0c;甚至在高压线下&#xff0c;依旧自信甩杆&#xff0c;殊不知高压线下垂钓&#xff0c;轻则伤、…

聚类算法之层次聚类(Hierarchical Clustering)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 层次聚类是一种非常独特和强大的聚类方法&#xff0c;与众多其他的聚类技术相比&#xff0c;它不仅为数据集提供了一个划分&#xff0c;还给出了…

鸿蒙APP应用开发教程—超详细的项目结构说明

1. 新建项目 打开DevEco Studio, 选择 Create Project: 1.1 选择模版 Create Project - Choose Template 1.2 配置项目 Create Project - Configure Project 如果使用的是 DevEco 3.X 版本, 可以根据 Compile SDK版本选择不同的模式, 比如: 3.0.0(API 8)及更早 - 仅支持 …

【数据结构】堆和树详解堆和二叉树的实现堆的top-k问题

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;数据结构_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.树概念及结构 1.1 树的概念 2.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用 2.二叉树的概念及结构 2.1 二叉树的概念…

力扣389周赛复盘

字符串及其反转中是否存在同一子字符串 class Solution {public boolean isSubstringPresent(String s) {StringBuilder sb new StringBuilder(s);String reverse sb.reverse().toString(); for (int i 0; i < s.length() - 2; i) { // 修改循环终止条件为 <&#xf…

matlab实现对全球不规则投影数据的投影转换

前几个专栏我们讨论了几个不规则的投影转换问题&#xff0c;有需要的可以阅读以下文章&#xff1a; matlab实现对极地投影数据的投影转换_matlab极地投影-CSDN博客 联合matlab和Arcgis进行netcdf格式的雪覆盖数据的重新投影栅格-CSDN博客 这次遇到的问题是一个墨卡托投影的数据…

【JavaWeb】Spring非阻塞通信 - Spring Reactive之WebFlux的使用

【JavaWeb】Spring非阻塞通信 - Spring Reactive之WebFlux的使用 文章目录 【JavaWeb】Spring非阻塞通信 - Spring Reactive之WebFlux的使用参考资料一、初识WebFlux1、什么是函数式编程1&#xff09;面向对象编程思维 VS 函数式编程思维&#xff08;封装、继承和多态描述事物间…

vue3新功能-Teleport

1.teleport 在组件内的任何位置渲染内容 将一个组件内部的一部分模板“传送”到该组件的 DOM 结构外层的位置去。 例:将组件dialog添加到body下面 <teleport to"body"> <el- dialog --> </teleport> 2.fragments 多个根元素外层不需要…

2024年了,还能学自动化吗?

大家都说2024年软件测试行业会卷的更厉害&#xff0c;简单的功能测试不再是入门的标准&#xff0c;那么2024年是否可以从自动化测试这块冲一把呢&#xff1f; 我们先来看看过去的一年自动化测试在测试行业中的发展分析&#xff1a; 01 市场需求增长 随着技术的进步和企业对软件…

爬虫入门系列-HTML基础语法

&#x1f308;个人主页&#xff1a;会编辑的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” HTML基础语法 bs4解析比较简单&#xff0c;但是呢&#xff0c;首先你需要了解一丢丢的html知识&#xff0c;然后再去使用bs4去提取&#xff0c;逻辑和编写难度就会非常简…

消息队列常见的两种消费模式

一、点对点模式 点对点模式&#xff1a;生产者发送消息到消息队列&#xff0c;消费者从消息队列中接收、处理消息&#xff0c;消息被消费后&#xff0c;就不在消息队列中了。每个消息只能由一个消费者接收和处理。如果有多个消费者监听同一个队列&#xff0c;消息将被发送到其…

刷题DAY29 | LeetCode 491-递增子序列 46-全排列 47-全排列 II

491 递增子序列&#xff08;medium&#xff09; 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;也…

流畅的 Python 第二版(GPT 重译)(五)

第九章. 装饰器和闭包 有人对将这个功能命名为“装饰器”的选择提出了一些抱怨。主要的抱怨是该名称与其在 GoF 书中的用法不一致。 名称 decorator 可能更多地归因于其在编译器领域的用法—语法树被遍历并注释。 PEP 318—函数和方法的装饰器 函数装饰器让我们在源代码中“标记…

外包干了14天,技术退步明显。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;2019年我通过校招踏入了成都一家软件公司&#xff0c;开始了我的职业生涯。那时的我&#xff0c;满怀热血和憧憬&#xff0c;期待着在这个行业中闯出一片天地。然而&#xff0c;随着时间的推移&#xff0c;我发现自己逐渐陷入…