如何在 C++ 中改变控制台的颜色

Jinku Hu 2023年12月11日
  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 << windows.h>>

#include <iostream>
#include <string>

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
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 创始人。Jinku 在机器人和汽车行业工作了8多年。他在自动测试、远程测试及从耐久性测试中创建报告时磨练了自己的编程技能。他拥有电气/电子工程背景,但他也扩展了自己的兴趣到嵌入式电子、嵌入式编程以及前端和后端编程。

LinkedIn Facebook

相关文章 - C++ IO