VC++ 主控台應用程式預設僅有黑底白字,缺乏視覺提示。Win32 API 提供 GetStdHandle 取得主控台緩衝區控制代碼,搭配 SetConsoleTextAttribute 即可設定前景色與背景色,無需第三方函式庫。
HANDLE GetStdHandle(DWORD nStdHandle);
// nStdHandle: STD_OUTPUT_HANDLE (標準輸出), STD_ERROR_HANDLE, STD_INPUT_HANDLE
BOOL SetConsoleTextAttribute(HANDLE hConsoleOutput, WORD wAttributes);
// wAttributes 為前景/背景色旗標組合
| 前景色 | 背景色 | 增亮 |
|---|---|---|
FOREGROUND_BLUE (0x0001) | BACKGROUND_BLUE (0x0010) | FOREGROUND_INTENSITY (0x0008) |
FOREGROUND_GREEN (0x0002) | BACKGROUND_GREEN (0x0020) | BACKGROUND_INTENSITY (0x0080) |
FOREGROUND_RED (0x0004) | BACKGROUND_RED (0x0040) |
組合範例:亮紅字加藍底 = FOREGROUND_RED | FOREGROUND_INTENSITY | BACKGROUND_BLUE (0x0004|0x0008|0x0010 = 0x001C)。
void SetConsoleColor(WORD foreColor = 7, WORD backColor = 0)
{
HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hCon, foreColor | backColor);
}
// 常用顏色常數
const WORD CLR_RED = FOREGROUND_RED | FOREGROUND_INTENSITY;
const WORD CLR_GREEN = FOREGROUND_GREEN | FOREGROUND_INTENSITY;
const WORD CLR_YELLOW = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY;
const WORD CLR_BLUE = FOREGROUND_BLUE | FOREGROUND_INTENSITY;
const WORD CLR_WHITE = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY;
const WORD BG_BLUE = BACKGROUND_BLUE | BACKGROUND_INTENSITY;
#include <windows.h>
#include <iostream>
using namespace std;
void SetConsoleColor(WORD fore = 7, WORD back = 0) {
HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hCon, fore | back);
}
int main()
{
SetConsoleColor(); // 預設白字黑底
cout << "Hello World!" << endl;
SetConsoleColor(CLR_RED, BG_BLUE); // 紅字藍底
cout << "Hello World!" << endl;
SetConsoleColor(CLR_GREEN); // 亮綠字
cout << "Success!" << endl;
SetConsoleColor(CLR_YELLOW); // 黃字
cerr << "Warning!" << endl; // 標準錯誤輸出同樣受影響
SetConsoleColor(); // 恢復預設
return 0;
}
enum LogLevel { INFO, WARN, ERROR };
void Log(LogLevel level, const char* msg)
{
switch (level) {
case INFO: SetConsoleColor(CLR_WHITE); break;
case WARN: SetConsoleColor(CLR_YELLOW); break;
case ERROR: SetConsoleColor(CLR_RED); break;
}
cout << msg << endl;
SetConsoleColor(); // 重置
}
SetConsoleCursorPosition)或使用 VT 序列(Windows 10 Threshold 2 後支援)。