如何在 C++ 中改變控制檯的顏色

Jinku Hu 2023年1月30日 2020年10月27日
  1. 使用 ANSI 轉義碼改變控制檯顏色
  2. 使用 SetConsoleTextAttribute() 方法在 C++ 中更改控制檯文字的顏色
如何在 C++ 中改變控制檯的顏色

本文將介紹幾種在 C++ 中更改控制檯文字顏色的方法。

使用 ANSI 轉義碼改變控制檯顏色

由於顏色不是標準 C++ 庫的一部分,而且特定於控制檯的功能大多由作業系統處理,所以沒有本地語言功能來為輸出流新增顏色。雖然,我們討論了一些平臺特有的處理文字輸出著色的方法。

ANSI 轉義碼是解決這個問題的一種相對可移植的方法。轉義碼是一個位元組序列,主要以 ASCII 轉義字元和括號字元開頭,後面是引數。這些字元嵌入到輸出文字中,控制檯將這些序列解釋為命令而不是要顯示的文字。ANSI 程式碼包括多種顏色格式,完整的細節可以在本頁上看到。在下面的程式碼示例中,我們演示了將幾個顏色字元定義為巨集,並在隨後將這些符號包含在 printf 字串引數中。請注意,printf 將多個雙引號的字串連線在第一個引數的地方傳遞。

#include <iostream>

#define NC "\e[0m"
#define RED "\e[0;31m"
#define GRN "\e[0;32m"
#define CYN "\e[0;36m"
#define REDB "\e[41m"

using std::cout; using std::endl;

int main(int argc, char *argv[])
{
    if (argc < 2) {
        printf(RED "ERROR"
               NC  ": provide argument as follows -> ./program argument\n");
        exit(EXIT_FAILURE);
    }
    printf(GRN "SUCCESS!\n");

    return EXIT_SUCCESS;
}

輸出(無程式引數):

ERROR: provide argument as follows -> ./program argument

輸出(帶有程式引數):

SUCCESS!

另外,同樣的轉義碼也可以用於 cout 呼叫。注意,不需要多次使用 << 流插入操作符,只需將巨集符號與字串字面結合,因為它們會自動組合在一起。

#include <iostream>

#define NC "\e[0m"
#define RED "\e[0;31m"
#define GRN "\e[0;32m"
#define CYN "\e[0;36m"
#define REDB "\e[41m"

using std::cout; using std::endl;

int main()
{
    cout << CYN "Some cyan colored text" << endl;
    cout << REDB "Add red background" NC << endl;
    cout << "reset to default colors with NC" << endl;

    return EXIT_SUCCESS;
}

輸出:

Some cyan colored text
Add red background
reset to default with NC

使用 SetConsoleTextAttribute() 方法在 C++ 中更改控制檯文字的顏色

SetConsoleTextAttribute 是 Windows API 方法,用於使用不同的引數設定輸出文字的顏色,該函式設定了由 WriteFileWriteConsole 函式寫入控制檯螢幕緩衝區的字元的屬性。該函式設定 WriteFileWriteConsole 函式寫入控制檯螢幕緩衝區的字元的屬性。字元屬性的完整描述可以在這個頁面上看到。

#include <iostream>
#include <string>
#include <<windows.h>>

using std::cout; using std::endl;

int main()
{
    std::string str("HeLLO tHERe\n");
    DWORD bytesWritten = 0;

    HANDLE cout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(console_handle, FOREGROUND_RED | BACKGROUND_INTENSITY);
    WriteFile(cout_handle, str.c_str(), str.size(), &bytesWritten, NULL);

    return EXIT_SUCCESS;
}

輸出:

Some red colored text
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C++ IO