目录
什么是 SetConsoleTextAttribute?
函数签名
参数详解
常见的颜色值
怎么用它?
再试一个多彩的例子
为什么要恢复默认颜色?
跟其他函数的关系
注意事项
什么是 SetConsoleTextAttribute?
SetConsoleTextAttribute 是一个 Windows API 函数,用来设置控制台文字的颜色和样式。它就像一个“调色盘”,可以改变你输出到屏幕上的文字颜色(比如红色、蓝色)或者背景颜色。
想象你在黑板上写字,默认是白色粉笔,但用这个函数,你可以换成彩色粉笔,还能给文字加个彩色背景。
函数签名
SetConsoleTextAttribute
的全称是 "Set Console Text Attribute",可以拆解成以下部分来理解:
-
Set
:表示设置(更改某个属性或状态)。 -
Console
:指的是控制台(Console),即 Windows 终端窗口。 -
Text
:指的是文本,即显示在控制台上的字符。 -
Attribute
:指的是属性,在这里主要指的是文本的颜色和背景颜色。
它的定义是:
BOOL SetConsoleTextAttribute(HANDLE hConsoleOutput, // 屏幕的“钥匙”WORD wAttributes // 颜色和样式的“调色盘”
);
-
HANDLE hConsoleOutput: 你用 GetStdHandle(STD_OUTPUT_HANDLE) 拿到的屏幕句柄。
-
WORD wAttributes: 一个数字,代表文字和背景的颜色组合。
-
返回值是 BOOL:TRUE 表示成功,FALSE 表示失败。
参数详解
1. HANDLE hConsoleOutput - 屏幕的“钥匙”
-
这是什么:跟 WriteConsoleA 一样,是屏幕的句柄。
-
作用:告诉函数:“我要调整屏幕上文字的颜色。”
-
怎么用:
HANDLE screen = GetStdHandle(STD_OUTPUT_HANDLE);
2. WORD wAttributes - 颜色和样式的“调色盘”
-
这是什么:一个 16 位整数(WORD),用来指定前景色(文字颜色)和背景色。
-
作用:决定文字是什么颜色,背景是什么颜色。
-
怎么用:用一些预定义的颜色值组合起来。
常见的颜色值
这些值是 Windows 定义好的,你可以直接用:
-
前景色(文字颜色):
-
FOREGROUND_BLUE (1):蓝色
-
FOREGROUND_GREEN (2):绿色
-
FOREGROUND_RED (4):红色
-
FOREGROUND_INTENSITY (8):加亮(使颜色更鲜艳)
-
-
背景色:
-
BACKGROUND_BLUE (16):蓝色背景
-
BACKGROUND_GREEN (32):绿色背景
-
BACKGROUND_RED (64):红色背景
-
BACKGROUND_INTENSITY (128):背景加亮
-
组合颜色
可以用 |(按位或)把颜色加在一起:
-
红字绿底:FOREGROUND_RED | BACKGROUND_GREEN(4 | 32 = 36)
-
亮蓝字黑底:FOREGROUND_BLUE | FOREGROUND_INTENSITY(1 | 8 = 9)
怎么用它?
我们写个例子,把文字变成红色:
#include <windows.h>
#include <cstring>int main() {// 1. 拿到屏幕钥匙HANDLE screen = GetStdHandle(STD_OUTPUT_HANDLE);if (screen == INVALID_HANDLE_VALUE) {return 1;}// 2. 设置文字为红色SetConsoleTextAttribute(screen, FOREGROUND_RED);// 3. 输出文字const char* message = "我是红色的!";DWORD written;WriteConsoleA(screen, message, strlen(message), &written, NULL);return 0;
}
运行过程:
-
拿到钥匙:GetStdHandle(STD_OUTPUT_HANDLE) 给你屏幕句柄。
-
调颜色:SetConsoleTextAttribute 把文字颜色设为红色(FOREGROUND_RED 是 4)。
-
写文字:WriteConsoleA 输出“我是红色的!”,显示为红色。
运行结果:屏幕上显示红色的“我是红色的!”。
再试一个多彩的例子
我们输出几种不同颜色的文字:
#include <windows.h>
#include <cstring>int main() {HANDLE screen = GetStdHandle(STD_OUTPUT_HANDLE);if (screen == INVALID_HANDLE_VALUE) {return 1;}DWORD written;// 红字SetConsoleTextAttribute(screen, FOREGROUND_RED);const char* msg1 = "红色的字\n";WriteConsoleA(screen, msg1, strlen(msg1), &written, NULL);// 亮蓝字SetConsoleTextAttribute(screen, FOREGROUND_BLUE | FOREGROUND_INTENSITY);const char* msg2 = "亮蓝色的字\n";WriteConsoleA(screen, msg2, strlen(msg2), &written, NULL);// 绿字红底SetConsoleTextAttribute(screen, FOREGROUND_GREEN | BACKGROUND_RED);const char* msg3 = "绿字红底\n";WriteConsoleA(screen, msg3, strlen(msg3), &written, NULL);// 恢复默认(白字黑底)SetConsoleTextAttribute(screen, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);const char* msg4 = "回到默认颜色\n";WriteConsoleA(screen, msg4, strlen(msg4), &written, NULL);return 0;
}
运行结果:
-
“红色的字” 是红色。
-
“亮蓝色的字” 是亮蓝色。
-
“绿字红底” 是绿色文字、红色背景。
-
“回到默认颜色” 是白色文字、黑色背景(默认样式)。
为什么要恢复默认颜色?
-
SetConsoleTextAttribute 设置的颜色会一直生效,直到你再次改变它。
-
如果不恢复默认,后面所有输出都会用最后一次设置的颜色。
-
默认颜色是白字黑底,用 FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE(4 | 2 | 1 = 7)表示。
跟其他函数的关系
-
搭配 WriteConsoleA:先用 SetConsoleTextAttribute 调颜色,再用 WriteConsoleA 输出。
-
跟 SetConsoleCursorPosition 一起用:可以控制颜色和位置,做出彩色的布局。
注意事项
-
颜色范围:
-
只有 16 种基本颜色(通过组合红、绿、蓝)。
-
加 INTENSITY 可以变亮,但没法调出所有颜色。
-
-
中文支持:
如果显示乱码,可能需要设置 UTF-8 代码页:
system("mode con cp=65001");
3.检查返回值
if (!SetConsoleTextAttribute(screen, FOREGROUND_RED)) {return 1; // 出错了
}