如何在 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 方法,用於使用不同的引數設定輸出文字的顏色,該函式設定了由 WriteFile
或 WriteConsole
函式寫入控制檯螢幕緩衝區的字元的屬性。該函式設定 WriteFile
或 WriteConsole
函式寫入控制檯螢幕緩衝區的字元的屬性。字元屬性的完整描述可以在這個頁面上看到。
#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
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