Linux Ncurses库部分函数使用说明

news2024/9/29 5:27:38

目录

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.coloradmin.cn/o/1541275.html

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

相关文章

国务院办公厅发布:政府类网站网页设计规范(试行)

国务院办公厅于2019年12月发布了《政府类网站网页设计规范&#xff08;试行&#xff09;》。该规范的发布旨在统一政府类网站的设计风格和标准&#xff0c;提升政府网站的用户体验和可访问性&#xff0c;推动政府信息公开和服务的提升。 该规范涵盖了政府类网站的各个方面&…

php搭建websocket

1.项目终端执行命令&#xff1a;composer require topthink/think-worker 2.0.x 2.config多出三个配置文件&#xff1a; 3.当使用php think worker:gateway命令时&#xff0c;提示不支持Windows。 4.打包项目为zip格式 5.打包数据库 6.阿里云创建记录 7.宝塔面板新增站点…

揭秘海外谷歌关键词优化细分人群的3个独家技巧--大舍传媒

揭秘海外谷歌关键词优化细分人群的3个独家技巧--大舍传媒 引言 在当今数字化的时代&#xff0c;拥有一个强大的线上存在是成功的关键之一。而在谷歌搜索引擎中&#xff0c;关键词优化是提高流量增长率的重要策略。本文将揭示海外谷歌关键词优化的三个独家技巧&#xff0c;帮助…

MySQL的事务深入理解和存储系统

目录 一、事务的基本理论 1.事务的隔离 1.1事务之间的相互影响 1.2事物隔离级别 2.查询和设置事物隔离级别 2.1查询全局事务隔离级别 2.2查询会话事物隔离级别 2.3设置全局事务隔离级别 2.4设置会话事务隔离级别 ​编辑3.事务控制语句 ​编辑3.1提交事务 ​编辑3.2…

CSP-S 真题:格雷码

原文链接&#xff1a;CSP-S 真题第二讲&#xff1a;格雷码 说明&#xff1a;CSDN和公众号文章同步发布&#xff0c;需要第一时间收到最新内容&#xff0c;请关注公众号【比特正传】。 一、题目背景 题目来源&#xff1a;CSP-S 2019年 T1 题目考察点&#xff1a;递归、搜索 …

【每周赠书活动第1期】Python编程 从入门到实践 第3版(图灵出品)

编辑推荐 适读人群 &#xff1a;本书适合对Python感兴趣的所有读者阅读。 编程入门就选蟒蛇书&#xff01; 【经典】Python入门经典&#xff0c;常居Amazon等编程类图书TOP榜 【畅销】热销全球&#xff0c;以12个语种发行&#xff0c;影响超过 250 万读者 【口碑】好评如潮…

【Linux Day16 I/O复用】

I/O复用 用途&#xff1a;I/O 复用能同时监听多个文件描述符。 I/O 复用虽然能同时监听多个文件描述符&#xff0c;但它本身是阻塞的。并且当多个文件描述符同时就绪时&#xff0c;如果不采取额外的措施&#xff0c;程序就只能按顺序依处理其中的每一个文件描述符&#xff0c;…

鸿蒙实战开发-使用关系型数据库实现对账单的增、删、改、查

介绍 本Codelab以记账为例&#xff0c;使用关系型数据库的相关接口实现了对账单的增、删、改、查操作。实现效果如图所示&#xff1a; 相关概念 关系型数据库&#xff1a;基于关系模型来管理数据的数据库&#xff0c;提供了增、删、改、查等接口&#xff0c;也可运行输入的SQ…

简述C语言文件操作

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;魔法指针&#xff0c;进阶C&#xff0c;C语言&#xff0c;C语言题集&#xff0c;C语言实现游戏&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文(平均质量分79)&#xff0c;分享…

java-基于springboot+vue实现的旅游信息管理系统功能介绍

开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 项目关键技术 1、JSP技术 JSP(Java…

深入探索JDK动态代理:从入门到原理的全面解析

文章目录 基本概念入门案例实现JDK动态代理的步骤入门实操拓展--动态生成代理类的几种方法方式一&#xff1a;通过getProxyClass方法获取代理实例方式二&#xff1a;通过newProxyInstance方法获取代理实例&#xff08;常用&#xff01;&#xff09;方式三&#xff1a;通过Lambd…

二十三 超级数据查看器 讲解稿 设置

二十三 超级数据查看器 讲解稿 设置 ​点击此处 以新页面 打开B站 播放当前教学视频 点击访问app下载页面 百度手机助手 下载地址 大家好&#xff0c;这节课我们讲一下&#xff0c;超级数据查看器的设置功能。 首先&#xff0c;我们打开超级数据查看器&#xff0c; 我…

AcWing 796. 子矩阵的和

这个题的重点是仿照一维的数组&#xff0c;所以a[N][N]也是从1索引开始的。画个图举个例子就非常清晰了 之所以不好理解是因为没画格子&#xff0c;一个格子代表一个点&#xff0c;就很好理解了。 java代码&#xff1a; import java.io.*; public class Main{static int N 1…

Java二阶知识点总结(七)SVN和Git

SVN 1、SVN和Git的区别 SVN是集中式的&#xff0c;也就是会有一个服务器保存所有代码&#xff0c;拉取代码的时候只能从这个服务器上拉取&#xff1b;Git是分布式的&#xff0c;也就是说每个人都保存有所有代码&#xff0c;如果要获取代码&#xff0c;可以从其他人手上获取SV…

使用 STL 容器发生异常的常见原因分析与总结

目录 1、概述 2、使用STL列表中的元素越界 3、遍历STL列表删除元素时对迭代器自加处理有问题引发越界 4、更隐蔽的遍历STL列表删除元素时引发越界的场景 5、多线程同时操作STL列表时没有加锁导致冲突 6、对包含STL列表对象的结构体进行memset操作导致STL列表对象内存出异…

操作符的属性:优先级、结合性

操作符的属性&#xff1a;优先级、结合性 优先级结合性 C语言的操作符有2个重要的属性&#xff1a;优先级、结合性&#xff0c;这两个属性决定了表达式求值的计算顺序。 优先级 优先级指的是&#xff0c;如果⼀个表达式包含多个运算符&#xff0c;哪个运算符应该优先执行。各…

RabbitMQ3.x之一_WindowServer2019中安装RabbitMQ详细教程

RabbitMQ3.x之一_WindowServer2019中安装RabbitMQ详细教程 文章目录 RabbitMQ3.x之一_WindowServer2019中安装RabbitMQ详细教程1. 安装环境说明1. WindowServer20192. ErLang与RabbitMQ对应版本 2 安装Erlang1. 安装Erlang2. ErLnag环境变量配置3. 查看是否安装成功 3. 安装Rab…

数据结构面试常见问题之串的模式匹配(KMP算法)系列-大师改进

&#x1f600;前言 KMP算法是一种改进的字符串匹配算法&#xff0c;由D.E.Knuth&#xff0c;J.H.Morris和V.R.Pratt提出&#xff0c;因此人们称它为克努特—莫里斯—普拉特操作&#xff08;简称KMP算法&#xff09; KMP算法的优势: 提高了匹配效率&#xff0c;时间复杂度为O(m…

【C++】用哈希桶模拟实现unordered_set和unordered_map

目录 一、哈希介绍1.1 哈希概念1.2 哈希冲突解决1.2.1 闭散列1.2.2 开散列 二、哈希桶2.1 实现哈希桶2.1.1 构造节点和声明成员变量2.1.2 构造与析构2.1.3 仿函数2.1.4 查找2.1.5 插入2.1.6 删除 2.2 kv模型哈希桶源代码 三、改造哈希桶3.1 beginend3.2 迭代器3.2.1 前置 3.3 改…

Linux_ubuntu中进行断点调试

文章目录 一、安装gdb调试器&#xff1a;二、使用gcc编译程序&#xff1a;三、使用gdb对程序进行调试&#xff1a;1.设置断点&#xff1a;使用break命令或简写为b来设置断点2.调试运行——run&#xff1a;3.继续执行——continue/c&#xff1a;4.单步执行&#xff1a;5.监视变量…