如何在 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