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.rhkb.cn/news/285422.html

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

相关文章

网络协议栈--网络层--IP协议

目录 本节重点网络层IP协议一、 基本概念二、 IP协议报头格式三、网段划分(重要)四、特殊的IP地址五、IP地址的数量限制六、私有IP地址和公网IP地址七、路由八、IP协议全部内容一览图 本节重点 1、理解网络层的作用, 深入理解IP协议的基本原理 2、对整个TCP/IP协议有系统的理解…

llvm后端

SelectionDAGBuilder是LLVM&#xff08;Low Level Virtual Machine&#xff09;编译器中的一个重要组件&#xff0c;它负责将LLVM中间表示&#xff08;Intermediate Representation&#xff0c;IR&#xff09;转换为SelectionDAG&#xff08;选择有向无环图&#xff09;的形式。…

JavaScript进阶

1. 作用域 1.1 局部作用域 1.2 全局作用域 1.3 作用域链 1.4 JS垃圾回收机制&#xff08;闭包做铺垫&#xff09; 1.4.1 什么是垃圾回收机制 1.4.2 内存的声明周期 1.4.3 垃圾回收的算法说明 1.4.3.1 引用计数法 1.4.3.2 标记清除法 1.5 闭包 <!DOCTYPE html> <html …

QTabWidget的tabbar不同方向显示 文字方向设置 图标跟随变化 实现方式 qt控件绘制原理

先来看结果图&#xff1a;&#xff08;参考博客&#xff1a;QTabWidget中tab页文本水平或垂直设置_pyqt tab_widget.settabposition(qtabwidget.west) 字体-CSDN博客&#xff09; 从图中可知&#xff0c;"普通"是qt自己的样式&#xff0c;但是很明显&#xff0c;在垂…

【linux】进程的地址空间

1.代码看现象引入 #include<stdio.h>#include<unistd.h>#include<string.h> #include<stdlib.h>int val100;int main (){ printf("i am father,pid:%d,ppid:%d,val:%d&#xff0c;&val:%p\n",getpid(),getppid(),val,&val);size_t…

Linux:点命令source

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 source命令用于读取一个文件的内容并在当前Shell环境&#xff08;包括交互式Shell或是非交互式Shell&#xff09;执行里面的命令。它被称为点命令是因为命令名source也可…

IIS7/iis8/iis10安装II6兼容模块 以windows2022为例

因安全狗的提示 安全狗防护引|擎安装失败 可能原因是: IIS7及以上版本末安装1IS6兼容模块! .所以操作解决 如下. 在开始菜单中,找到服务器管理器.找到下图的IIS,右键添加角色和功能,找到web服务器的管理工具选项,iis6管理兼容性 打钩并安装. 如下图

自然拼读-组合音(上篇)

自然拼读-组合音 1、元音字母A的二声发音组合 组合音at 注意&#xff1a;“t”是气音&#xff0c;不要太重。 Eg&#xff1a;cat&#xff08;猫&#xff09; fat&#xff08;肥的&#xff09; bat&#xff08;蝙蝠&#xff09; 组合音ap 注意&#xff1a;“p”在尾巴发音…

MRC是谁?- 媒体评级委员会 Media Rating Council

在在线广告的世界里&#xff0c;有许多不同的技术和实践用于提供和衡量广告。对于广告商、出版商和营销人员来说&#xff0c;了解这些技术是如何工作的以及如何有效使用这些技术很重要。在这方面发挥关键作用的一个组织是媒体评级委员会&#xff08;MRC&#xff09;。 1. 了解…

蓝桥杯基础练习详细讲解二(具体代码、解题思路、Python)

试题 基础练习 回文数 提交此题 评测记录 资源限制 内存限制&#xff1a;512.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 1221是一个非常特殊的数&#xff0c;它从左边读和从右边读是一样的&#x…

mysql基础3索引

存储引擎 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式 。存储引擎是基于表的&#xff0c;而不是 基于库的&#xff0c;所以存储引擎也可被称为表类型。 1). 建表时指定存储引擎 CREATE TABLE 表名(字段1 字段1类型 [ COMMENT 字段1注释 ] ,......字段n…

Docker进阶:Docker-compose 实现服务弹性伸缩

Docker进阶&#xff1a;Docker-compose 实现服务弹性伸缩 一、Docker Compose基础概念1.1 Docker Compose简介1.2 Docker Compose文件结构 二、弹性伸缩的原理和实现步骤2.1 弹性伸缩原理2.2 实现步骤 三、技术实践案例3.1 场景描述3.2 配置Docker Compose文件3.3 使用 docker-…

【项目管理后台】Vue3+Ts+Sass实战框架搭建二

Vue3TsSass搭建 git cz的配置mock 数据配置viteMockServe 建立mock/user.ts文件夹测试一下mock是否配置成功 axios二次封装解决env报错问题&#xff0c;ImportMeta”上不存在属性“env” 统一管理相关接口新建api/index.js 路由的配置建立router/index.ts将路由进行集中封装&am…

AIGC实战——Transformer模型

AIGC实战——Transformer模型 0. 前言1. T52. GPT-3 和 GPT-43. ChatGPT小结系列链接 0. 前言 我们在 GPT (Generative Pre-trained Transformer) 一节所构建的 GPT 模型是一个解码器 Transformer&#xff0c;它逐字符地生成文本字符串&#xff0c;并使用因果掩码只关注输入字…

海外媒体宣发:十大国外中文网站-大舍传媒

十大国外中文网站 1、欧洲时报 覆盖欧洲且较具影响力的华文媒体 国外中文新闻网站&#xff0c;欧洲时报文化传媒集团旗舰日报《欧洲时报》旗下官方网站&#xff0c;总部设在法国巴黎&#xff0c;创刊于1983年&#xff0c;现已成为唯一发行覆盖全欧、发行量最大、最具影响力的华…

Vue3 上手笔记

1. Vue3简介 2020年9月18日&#xff0c;Vue.js发布版3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;n 经历了&#xff1a;4800次提交、40个RFC、600次PR、300贡献者 官方发版地址&#xff1a;Release v3.0.0 One Piece vuejs/core 截止2023年10月&#xff0c;最…

STM32最小核心板使用HAL库ADC读取MCU温度(使用DMA通道)

STM32自带CPU的温度数据&#xff0c;需要使用ADC去读取。因此在MX创建项目时如图配置&#xff1a; 模块初始化代码如下&#xff1a; void MX_ADC1_Init(void) {/* USER CODE BEGIN ADC1_Init 0 *//* USER CODE END ADC1_Init 0 */ADC_ChannelConfTypeDef sConfig {0};/* USER…

Docker 入门使用说明

Docker 入门使用说明 Docker 安装 Docker 官网&#xff1a;Docker Docker 安装说明&#xff1a;Docker 安装说明 这里由于 Docker 在实时更新&#xff0c;所以每次安装 Docker 用来导入 key 的链接可能会有变化&#xff0c;这里就参考官方的安装方法即可 Docker 常用命令说…

(ES6)前端八股文修炼Day2

1. let const var 的区别 var&#xff1a; var 是在 ES5 中引入的声明变量的关键字。 具有函数作用域&#xff0c;而不是块作用域&#xff0c;这意味着使用 var 声明的变量在函数内部是可见的。 变量可以被重复声明&#xff0c;而且变量的值可以在声明前使用&#xff0c;这可能…

生成微信小程序二维码

首页 -> 统计 可以通过上面二个地方配置&#xff0c;生成小程序的二维码&#xff0c;并且在推广分析里&#xff0c;有详细的分析数据&#xff0c;