首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC++

VC++ 控制台程序實現彩色文本輸出完整指南

     編輯:VC++

告別黑白命令行,用 Windows API 為控制台賦色

核心 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 位
}

完整示例:彩色 Hello World


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;
}

進階技巧

  1. 保存/恢復屬性:
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(hOut, &csbi);
    WORD oldAttr = csbi.wAttributes;
    // ... 設置新顏色 ...
    SetConsoleTextAttribute(hOut, oldAttr); // 恢復
    
  2. 區域著色:配合 SetConsoleCursorPosition 實現局部高亮。
  3. VT100 轉義序列 (Win10 TH2+):啟用 ENABLE_VIRTUAL_TERMINAL_PROCESSING 後可直接用 \033[31m ANSI 碼,跨平台更友好。

常見問題

  • 顏色不生效?檢查是否重定向輸出(管道/文件無屬性)。
  • 背景色顯示異常?控制台字體光柵化可能導致背景色塊不完整,建議使用 TrueType 字體(Consolas)。
  • 多線程並發輸出?需同步訪問控制台句柄,避免屬性互相覆蓋。

掌握控制台著色,能讓診斷日誌、CLI 工具、教學演示的可讀性大幅提升。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved