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