跳到主要内容

颜色

终端不仅只有黑白的显示,还可以支持多种颜色。

system 函数

通过 system("color XY"),可以设置终端文本的前景色和背景色。

其中,X 代表前景色,Y 代表背景色,它们都是十六进制数字(0150 \sim 15),每个数字对应一种颜色。

数字颜色数值数字颜色数值
00黑色000000\color{000000}\text{000000}88灰色808080\color{808080}\text{808080}
11蓝色000080\color{000080}\text{000080}99亮蓝色0000ff\color{0000ff}\text{0000ff}
22绿色008000\color{008000}\text{008000}1010亮绿色00ff00\color{00ff00}\text{00ff00}
33青色008080\color{008080}\text{008080}1111亮青色00ffff\color{00ffff}\text{00ffff}
44红色800000\color{800000}\text{800000}1212亮红色ff0000\color{ff0000}\text{ff0000}
55紫色800080\color{800080}\text{800080}1313亮紫色ff00ff\color{ff00ff}\text{ff00ff}
66黄色808000\color{808000}\text{808000}1414亮黄色ffff00\color{ffff00}\text{ffff00}
77白色c0c0c0\color{c0c0c0}\text{c0c0c0}1515亮白色ffffff\color{ffffff}\text{ffffff}

system 函数的缺点是只能修改整个终端的颜色,无法仅修改特定部分的文字颜色。

Windows API

如果你需要只修改某一段文字的颜色,可以使用 Windows API 来实现。

定义一个 color 函数,传入两个参数 ab,表示前景色和背景色的颜色编号,对应的颜色与 system 函数相同。

void color(short a,short b)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a<<4|b);
}

Windows API 的缺点是颜色种类有限(只有 1616 种)。

ANSI 转义序列

ANSI 转义序列支持 24 位真彩色,也就是常见的 RGB 颜色格式。

但此功能默认未开启,需启用虚拟终端处理。

void enableVirtualTerminalProcessing()
{
HANDLE hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
DWORD dwMode=0;
GetConsoleMode(hConsole,&dwMode);
dwMode|=ENABLE_VIRTUAL_TERMINAL_PROCESSING;
SetConsoleMode(hConsole,dwMode);
}

定义两个 color 函数,传入三个参数 rgb,表示 RGB 颜色值。

void foreColor(int r,int g,int b)
{
printf("\033[38;2;%d;%d;%dm",r,g,b);
}
void backColor(int r,int g,int b)
{
printf("\033[48;2;%d;%d;%dm",r,g,b);
}