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

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

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

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"
这是什么东西呢,咱们对它查看定义来看一下:code

#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表明这后面的数字是十六位进制
并且根据宏定义名可简单的归类:
前四个是对字体的 蓝色,绿色,红色,亮度 进行设置
后四个是对背景的 蓝色,绿色,红色,亮度 进行设置htm

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

对应属性 蓝色字体 绿色字体 红色字体 高亮字体 蓝色背景 绿色背景 红色背景 高亮背景
十进制 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"查看,哦,开启第一位和第四位的属性,那么也就是打开启 蓝色字体高亮字体的属性。
还有就是 这里的红绿蓝其实就是三原色,通过经过 红绿 红蓝 绿蓝 还可获得 黄色 青色 粉色 这三种颜色。get

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

这里我把混合的颜色写上来,能够在本身的代码里添加这个宏定义方便使用混搭颜色博客

相关文章
相关标签/搜索