颜色
终端不仅只有黑白的显示,还可以支持多种颜色。
system 函数
通过 system("color XY")
,可以设置终端文本的前景色和背景色。
其中,X 代表前景色,Y 代表背景色,它们都是十六进制数字(),每个数字对应一种颜色。
数字 | 颜色 | 数值 | 数字 | 颜色 | 数值 |
---|---|---|---|---|---|
黑色 | 灰色 | ||||
蓝色 | 亮蓝色 | ||||
绿色 | 亮绿色 | ||||
青色 | 亮青色 | ||||
红色 | 亮红色 | ||||
紫色 | 亮紫色 | ||||
黄色 | 亮黄色 | ||||
白色 | 亮白色 |
system
函数的缺点是只能修改整个终端的颜色,无法仅修改特定部分的文字颜色。
Windows API
如果你需要只修改某一段文字的颜色,可以使用 Windows API 来实现。
定义一个 color
函数,传入两个参数 a
和 b
,表示前景色和背景色的颜色编号,对应的颜色与 system
函数相同。
void color(short a,short b)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a<<4|b);
}
Windows API 的缺点是颜色种类有限(只有 种)。
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
函数,传入三个参数 r
、g
和 b
,表示 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);
}