我写了一个输出彩色文本的函数:
void COLOR_PRINT(const char* s, int color){HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | color);printf(s);SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | 7);}
开头需要添加引用:
#include <windows.h>#include <stdio.h>
颜色代号:
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 10 = 淡绿色
3 = 浅绿色 11 = 淡浅绿色
4 = 红色 12 = 淡红色
5 = 紫色 13 = 淡紫色
6 = 黄色 14 = 淡黄色
7 = 白色 15 = 亮白色
如果颜色代号大于15,字体颜色就会呈周期性循环,而底色会按颜色代号的顺序进行更换。
比如说,0字体是黑色,底色也是黑色(0),16字体是黑色,底色是蓝色(1),32也是黑色,对应底色是绿色(2),依次类推。这是
因为SetConsoleTextAttribute
函数是通过一个字节的低4位(16种颜色,2的4次方)控制前景色(字体颜色),高四位控制背景颜色,而本该是四位前景色如果大于15多出来的位数就会溢出到高四位,进而改变了背景色。
那么我们就可以稍微改动一下,让背景色代号乘16(放到高位)后再和前景色代号逻辑或,就可以用两个0-15的颜色代号分别控制前景色和背景色了,改动后的函数如下:
void COLOR_PRINT2(const char* s, int front_color,int back_color){HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | back_color*16 |FOREGROUND_INTENSITY | front_color);printf(s);SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | 7);}