告別黑白命令行,用 Windows API 為控制台賦色
GetStdHandle(STD_OUTPUT_HANDLE):獲取標準輸出設備句柄(控制台屏幕緩衝區)。SetConsoleTextAttribute(hConsole, wAttributes):設置文本屬性(前景色 + 背景色 + 亮度)。| 分類 | 常量 | 說明 |
|---|---|---|
| 前景色 | FOREGROUND_BLUE | 藍色分量 |
| FOREGROUND_GREEN | 綠色分量 | |
| FOREGROUND_RED | 紅色分量 | |
| FOREGROUND_INTENSITY | 高亮(加亮) | |
| 背景色 | BACKGROUND_BLUE | 藍色分量 |
| BACKGROUND_GREEN | 綠色分量 | |
| BACKGROUND_RED | 紅色分量 | |
| BACKGROUND_INTENSITY | 高亮背景 |
組合方式:屬性 = 前景色 | 背景色。例如:FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY = 高亮黃色字。
#include
#include
void SetConsoleColor(WORD fg = FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE,
WORD bg = 0) {
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hOut, fg | bg);
}
// 便捷枚舉
enum ConsoleColor {
CL_DEFAULT = 0x07,
CL_RED = FOREGROUND_RED | FOREGROUND_INTENSITY,
CL_GREEN = FOREGROUND_GREEN | FOREGROUND_INTENSITY,
CL_BLUE = FOREGROUND_BLUE | FOREGROUND_INTENSITY,
CL_YELLOW = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY,
CL_CYAN = FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY,
CL_MAGENTA = FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY,
CL_WHITE = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY,
// 背景色組合同理
};
void SetColorEx(ConsoleColor fg, ConsoleColor bg = CL_DEFAULT) {
SetConsoleColor(fg, bg & 0xF0); // 背景色佔高 4 位
}
int main() {
// 預設白字黑底
std::cout << "預設顏色\n";
SetConsoleColor(FOREGROUND_RED | FOREGROUND_INTENSITY);
std::cout << "高亮紅色文本\n";
SetConsoleColor(FOREGROUND_BLUE | FOREGROUND_INTENSITY,
BACKGROUND_YELLOW); // 需定義 BACKGROUND_YELLOW = BACKGROUND_RED|BACKGROUND_GREEN
std::cout << "藍字黃底\n";
SetConsoleColor(); // 恢復預設
std::cout << "恢復預設\n";
// 使用封裝枚舉
SetColorEx(CL_GREEN);
std::cout << "綠色通過枚舉設置\n";
SetColorEx(CL_RED, BACKGROUND_BLUE | BACKGROUND_INTENSITY);
std::cout << "紅字亮藍底\n";
return 0;
}
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(hOut, &csbi);
WORD oldAttr = csbi.wAttributes;
// ... 設置新顏色 ...
SetConsoleTextAttribute(hOut, oldAttr); // 恢復
SetConsoleCursorPosition 實現局部高亮。ENABLE_VIRTUAL_TERMINAL_PROCESSING 後可直接用 \033[31m ANSI 碼,跨平台更友好。掌握控制台著色,能讓診斷日誌、CLI 工具、教學演示的可讀性大幅提升。