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

打印结果: 

相关推荐

  1. spdlog 日志部分源码说明

    2024-03-21 11:28:02       19 阅读
  2. rasterio简介及函数说明

    2024-03-21 11:28:02       22 阅读
  3. ajax函数axios基本使用

    2024-03-21 11:28:02       31 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-21 11:28:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-21 11:28:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-21 11:28:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-21 11:28:02       20 阅读

热门阅读

  1. AT+MQTTUSERCFG报错ERROR

    2024-03-21 11:28:02       18 阅读
  2. is ignored, because it exists, maybe from xml file

    2024-03-21 11:28:02       18 阅读
  3. web学习笔记(四十一)

    2024-03-21 11:28:02       19 阅读
  4. 机器学习和深度学习的区别

    2024-03-21 11:28:02       25 阅读
  5. 大模型-什么是Fine-tuning

    2024-03-21 11:28:02       20 阅读
  6. C语言经典面试题目(二十三)

    2024-03-21 11:28:02       21 阅读
  7. C语言开启蜂鸣器和风扇

    2024-03-21 11:28:02       20 阅读
  8. C#关键字 sealed、unsafe、virtual、volatile

    2024-03-21 11:28:02       21 阅读