C/C++ 中怎样使用SetConsoleTextAttribute()函数来控制输出字符的颜色

 更新时间:2021年03月15日 08:42:23   作者:Ridiculer  
这篇文章主要介绍了C/C++ 中如何使用SetConsoleTextAttribute()函数来控制输出字符的颜色,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

当我们在命令行输出字符的时候,会想着,要是能控制输出字符的颜色就好了。
现在,满足你,有这么一个函数能够帮助我们实现这个想法。
↓↓↓↓↓
SetConsoleTextAttribute();

依照惯例我们来看看这个函数的构成。

SetConsoleTextAttribute(
 _In_ HANDLE hConsoleOutput,
 _In_ WORD wAttributes
 );

HANDLE在上一篇博客中我们见过。注意在使用前,要先将其变为标准输出句柄。

typedef void *HANDLE;//HANDLE是vodi*的重定义
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出句柄

现在我们主要来看一下WORD的定义。
typedef unsigned short WORD;

从上可以的除WORD其实是个无符号的整型,一般这样的话,线索就好像是断了,只看数值的话只能知道取值范围是0-65535。
但是我们去网上搜索这个函数后,我们就发现了简单的用法,这里我来举个例子:

#include <stdio.h>
#include <windows.h>

int main() {
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); // 获取标准输出句柄
	SetConsoleTextAttribute(hOut, FOREGROUND_INTENSITY | FOREGROUND_BLUE);//字体设置为蓝色
	printf("R\n");
}

我们看到不仅我们输出的字符"R"变成了蓝色,且后面的自动弹出的提示也变成了蓝色。
我们可以把输出字符的命令当作是一支画笔,而我们通过SetConsoleTextAttribute();改变了画笔的颜色。//这里提醒一下,直到下次更改前颜色会一直保持
而且我们可以看到,本来应该是填入WORD类型数据的地方,现在变成了"FOREGROUND_INTENSITY | FOREGROUND_BLUE"。
这是什么东西呢,我们对它查看定义来看一下:

#define FOREGROUND_BLUE  0x0001 // text color contains blue.
#define FOREGROUND_GREEN  0x0002 // text color contains green.
#define FOREGROUND_RED  0x0004 // text color contains red.
#define FOREGROUND_INTENSITY 0x0008 // text color is intensified.
#define BACKGROUND_BLUE  0x0010 // background color contains blue.
#define BACKGROUND_GREEN  0x0020 // background color contains green.
#define BACKGROUND_RED  0x0040 // background color contains red.
#define BACKGROUND_INTENSITY 0x0080 // background color is intensified.

从看到上的的注释不难看出,这些函数是对一些十六位进制的值的宏定义。//0x代表这后面的数字是十六位进制
而且根据宏定义名可简单的归类:
前四个是对字体的 蓝色,绿色,红色,亮度 进行设置
后四个是对背景的 蓝色,绿色,红色,亮度 进行设置

相信机智的你已经看出来了,SetConsoleTextAttribute(HANDLE,WORD);其实是通过判断WORD的二进制,其相对应位置上的值来开启颜色属性的。
(short是二字节,但是这里方便书写就写一字节了)

对应属性 蓝色字体 绿色字体 红色字体 高亮字体 蓝色背景 绿色背景 红色背景 高亮背景
十进制 0x0001 0x0002 0x0004 0x0008 0x0010 0x0020 0x0040 0x0080
二进制 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000

上诉例子里的值也可以这么转换下来:
" FOREGROUND_INTENSITY|FOREGROUND_BLUE "--->" 0x0008|0x0001 "--->" 00001000|00000001 "
--->"00001001"
然后根据"00001001"查看,哦,开启第一位和第四位的属性,那么也就是打开启 蓝色字体和高亮字体的属性。
还有就是 这里的红绿蓝其实就是三原色,经过通过 红绿 红蓝 绿蓝 还可得到 黄色 青色 粉色 这三种颜色。

//宏定义字体颜色
#define FOREGROUND_WHITE  0x0007 //白色(红+绿+蓝) 默认颜色
#define FOREGROUND_YELLOW  0x0006 //黄色(红+绿)
#define FOREGROUND_PINK  0x0005 //粉色(红+蓝)
#define FOREGROUND_INDIGO  0x0003 //青色(绿+蓝)

这里我把混合的颜色写上来,为了方便使用,可以在自己的代码里添加这个宏定义方便使用

到此这篇关于C/C++ 中怎样使用SetConsoleTextAttribute()函数来控制输出字符的颜色的文章就介绍到这了,更多相关C/C++控制输出字符的颜色内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言详细图解浮点型数据的存储实现

    C语言详细图解浮点型数据的存储实现

    使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。您可能需要存储各种数据类型的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么
    2022-05-05
  • 浅谈C++基类的析构函数为虚函数

    浅谈C++基类的析构函数为虚函数

    本文重点:应该为多态基类声明虚析构器。一旦一个类包含虚函数,它就应该包含一个虚析构器。如果一个类不用作基类或者不需具有多态性,便不应该为它声明虚析构器。
    2015-10-10
  • c++实现超简单的贪吃蛇游戏实例介绍

    c++实现超简单的贪吃蛇游戏实例介绍

    大家好,本篇文章主要讲的是c++实现超简单的贪吃蛇游戏实例介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • 解析C++中派生的概念以及派生类成员的访问属性

    解析C++中派生的概念以及派生类成员的访问属性

    这篇文章主要介绍了解析C++中派生的概念以及派生类成员的访问属性,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C/C++中for语句循环用法以及练习举例

    C/C++中for语句循环用法以及练习举例

    for语句是一种循环语句,它是对while语句的推广,下面这篇文章主要给大家介绍了关于C/C++中for语句循环用法以及练习举例的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • C++ requires关键字简单介绍

    C++ requires关键字简单介绍

    requires 是 C++20 中引入的一个新关键字,用于在函数模板或类模板中声明所需的一组语义要求,它可以用来限制模板参数,类似于 typename 和 class 关键字,这篇文章主要介绍了C++ requires关键字简介,需要的朋友可以参考下
    2023-05-05
  • OpenCV实现物体的凸包检测的示例代码

    OpenCV实现物体的凸包检测的示例代码

    给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸边形,它是包含点集中所有的点。本文将利用OpenCV实现物体的凸包检测,感兴趣的可以了解一下
    2022-08-08
  • C++发送邮件实现代码

    C++发送邮件实现代码

    这篇文章主要为大家详细介绍了C++发送邮件的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • 聊一聊OpenCV相机标定

    聊一聊OpenCV相机标定

    这篇文章主要为大家详细介绍了OpenCV相机标定的相关资料,即获得相机参数的过程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 解析C++多文件编程问题

    解析C++多文件编程问题

    在某些场景中,考虑到编译效率和可移植性,#pragma once 和 #ifndef 经常被结合使用来避免头文件被 重复引入,这里介绍用 _Pragma 操作符避免头文件重复引入的问题,感兴趣的朋友跟随小编一起看看吧
    2021-10-10

最新评论