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

VC++ 主控台程式顯示彩色文字:SetConsoleTextAttribute 完整教學

     編輯:VC 教學

前言

VC++ 主控台應用程式預設僅有黑底白字,缺乏視覺提示。Win32 API 提供 GetStdHandle 取得主控台緩衝區控制代碼,搭配 SetConsoleTextAttribute 即可設定前景色與背景色,無需第三方函式庫。

核心 API

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;

完整範例:彩色 Hello World

#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 後支援)。
  • 重新導向輸出至檔案時,顏色屬性會遺失,僅保留純文字。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved