使用 C + + 在控制台中为文本着色

如何使用 C + + 将彩色文本写入控制台?也就是说,我怎样才能用不同的颜色写出不同的文本?

391003 次浏览

为控制台文本添加一些颜色

  HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
// you can loop k higher to see more color choices
for(int k = 1; k < 255; k++)
{
// pick the colorattribute k you want
SetConsoleTextAttribute(hConsole, k);
cout << k << " I want to be nice today!" << endl;
}

alt text

角色属性 下面是如何解释“ k”值。

标准 C + + 没有“颜色”的概念,所以你要问的问题取决于操作系统。

对于 Windows,可以查看 属性函数。

在 * nix 上,必须使用 ANSI转义序列。

这里的 例子是一个如何在控制台中使用颜色的例子。

假设您谈论的是 Windows 控制台窗口,请在 MSDNLibrary 文档中查找控制台函数。

否则,或者更一般地说,它取决于控制台。C + + 库不支持颜色。但是用于控制台处理的库可能会支持颜色。例如,谷歌“ ncurses 颜色”。

对于连接的串行终端和终端模拟器,您可以通过输出“转义序列”来控制。它们通常以 ASCII 27(ASCII 中的转义字符)开始。有一个 ANSI 标准和许多自定义方案。

我不确定您真正想要做什么,但是我猜想您希望您的 C + + 程序在控制台中输出彩色文本,对吗?不了解 Windows,但是在所有的 Unice (包括 MacOSX)上,你只需要使用 ANSI 转义序列就可以了。

您可以像这样编写方法和调用


HANDLE  hConsole;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
int col=12;


// color your text in Windows console mode
// colors are 0=black 1=blue 2=green and so on to 15=white
// colorattribute = foreground + background * 16
// to get red text on yellow use 4 + 14*16 = 228
// light red on yellow would be 12 + 14*16 = 236


FlushConsoleInputBuffer(hConsole);
SetConsoleTextAttribute(hConsole, col);


cout << "Color Text";


SetConsoleTextAttribute(hConsole, 15); //set back to black background and white text

在 Windows 中,可以在前景(文本)和背景上使用红绿和蓝色的任何组合。

/* you can use these constants
FOREGROUND_BLUE
FOREGROUND_GREEN
FOREGROUND_RED
FOREGROUND_INTENSITY
BACKGROUND_BLUE
BACKGROUND_GREEN
BACKGROUND_RED
BACKGROUND_INTENSITY
*/


HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
std::cout << "I'm cyan! Who are you?" << std::endl;

资料来源: https://msdn.microsoft.com/en-us/library/windows/desktop/ms682088(v=vs.85).aspx#_win32_character_attributes

你能做的最简单的方法是:

#include <stdlib.h>


system("Color F3");

其中“ F”是背景颜色的代码,3是文本颜色的代码。

把它弄乱,看看其他的颜色组合:

system("Color 1A");
std::cout << "Hello, what is your name?" << std::endl;
system("Color 3B");
std::cout << "Hello, what is your name?" << std::endl;
system("Color 4c");
std::cout << "Hello, what is your name?" << std::endl;

注: 我只在 Windows.Works 上进行了测试。正如前面指出的,这不是跨平台的,它不能在 Linux 系统上工作。

ANSI 转义色码:

Name            FG  BG
Black           30  40
Red             31  41
Green           32  42
Yellow          33  43
Blue            34  44
Magenta         35  45
Cyan            36  46
White           37  47
Bright Black    90  100
Bright Red      91  101
Bright Green    92  102
Bright Yellow   93  103
Bright Blue     94  104
Bright Magenta  95  105
Bright Cyan     96  106
Bright White    97  107

C/C + + 的示例代码:

#include <iostream>
#include <string>


int main(int argc, char ** argv){
    

printf("\n");
printf("\x1B[31mTexting\033[0m\t\t");
printf("\x1B[32mTexting\033[0m\t\t");
printf("\x1B[33mTexting\033[0m\t\t");
printf("\x1B[34mTexting\033[0m\t\t");
printf("\x1B[35mTexting\033[0m\n");
    

printf("\x1B[36mTexting\033[0m\t\t");
printf("\x1B[36mTexting\033[0m\t\t");
printf("\x1B[36mTexting\033[0m\t\t");
printf("\x1B[37mTexting\033[0m\t\t");
printf("\x1B[93mTexting\033[0m\n");
    

printf("\033[3;42;30mTexting\033[0m\t\t");
printf("\033[3;43;30mTexting\033[0m\t\t");
printf("\033[3;44;30mTexting\033[0m\t\t");
printf("\033[3;104;30mTexting\033[0m\t\t");
printf("\033[3;100;30mTexting\033[0m\n");


printf("\033[3;47;35mTexting\033[0m\t\t");
printf("\033[2;47;35mTexting\033[0m\t\t");
printf("\033[1;47;35mTexting\033[0m\t\t");
printf("\t\t");
printf("\n");


return 0;
}

海湾合作委员会:

g++ cpp_interactive_terminal.cpp -o cpp_interactive_terminal.cgi
chmod +x cpp_interactive_terminal.cgi
./cpp_interactive_terminal.cgi

在 Windows10上,你可以这样使用转义序列:

#ifdef _WIN32
SetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), ENABLE_VIRTUAL_TERMINAL_PROCESSING);
#endif
// print in red and restore colors default
std::cout << "\033[32m" << "Error!" << "\033[0m" << std::endl;

不要使用“系统(“颜色...”)”,如果你不想让整个屏幕充满颜色。这是制作彩色文本所需的脚本:

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


int main()
{
const WORD colors[] =
{
0x1A, 0x2B, 0x3C, 0x4D, 0x5E, 0x6F,
0xA1, 0xB2, 0xC3, 0xD4, 0xE5, 0xF6
};


HANDLE hstdin = GetStdHandle(STD_INPUT_HANDLE);
HANDLE hstdout = GetStdHandle(STD_OUTPUT_HANDLE);
WORD   index = 0;




SetConsoleTextAttribute(hstdout, colors[index]);
std::cout << "Hello world" << std::endl;
FlushConsoleInputBuffer(hstdin);
return 0;
}

您不需要使用任何库,只需编写系统(“ color 4f”) ;

我发现只有头文件的开源 C + + 库可以在多个平台上工作: Https://github.com/imfl/color-console

彩色控制台:

一个轻量级的只有头文件的 C + + 库,为你的 Windows 带来色彩 控制台提供了一个非常易于使用的 API,使您免除了 每次打电话都要设置和重置屏幕颜色。

enter image description here

#include "../include/color.hpp"
#include <iostream>


int main() {
std::cout << dye::aqua("Hello, World!") << std::endl;
return 0; }

你们正在水中看到的是“你好,世界!”。
enter image description
此处”/> 香港中文大学图书馆
<p>为什么要使用它?<a href=enter image description here

不需要重置: 市场上的大多数解决方案都像操纵者一样有效, 它不断要求你重置屏幕颜色后,你设置 虽然这个传统的方法也提供在这个图书馆 色调命名空间..。

表格:

如果你不仅想改变颜色,而且想以更易读的形式打印文本(例如表格的形式) ,也可以使用 https://github.com/p-ranav/tabulate来改变颜色并在控制台中绘制表格。

只需将 include/添加到您的 Include _ directory,应该就可以了 也可以在 single _ include/中找到 version。 注意列表支持 > = C + + 11。 enter image description here

下面是我的轻量级解决方案,可以同时使用 Windows 和 Linux:

#include <iostream>
#include <string>
#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#define VC_EXTRALEAN
#include <Windows.h> // for displaying colors
#endif // Windows
using namespace std;


#define color_black      0
#define color_dark_blue  1
#define color_dark_green 2
#define color_light_blue 3
#define color_dark_red   4
#define color_magenta    5
#define color_orange     6
#define color_light_gray 7
#define color_gray       8
#define color_blue       9
#define color_green     10
#define color_cyan      11
#define color_red       12
#define color_pink      13
#define color_yellow    14
#define color_white     15


string get_textcolor_code(const int textcolor) { // Linux only
switch(textcolor) {
case  0: return "30"; // color_black      0
case  1: return "34"; // color_dark_blue  1
case  2: return "32"; // color_dark_green 2
case  3: return "36"; // color_light_blue 3
case  4: return "31"; // color_dark_red   4
case  5: return "35"; // color_magenta    5
case  6: return "33"; // color_orange     6
case  7: return "37"; // color_light_gray 7
case  8: return "90"; // color_gray       8
case  9: return "94"; // color_blue       9
case 10: return "92"; // color_green     10
case 11: return "96"; // color_cyan      11
case 12: return "91"; // color_red       12
case 13: return "95"; // color_pink      13
case 14: return "93"; // color_yellow    14
case 15: return "97"; // color_white     15
default: return "37";
}
}
string get_backgroundcolor_code(const int backgroundcolor) { // Linux only
switch(backgroundcolor) {
case  0: return  "40"; // color_black      0
case  1: return  "44"; // color_dark_blue  1
case  2: return  "42"; // color_dark_green 2
case  3: return  "46"; // color_light_blue 3
case  4: return  "41"; // color_dark_red   4
case  5: return  "45"; // color_magenta    5
case  6: return  "43"; // color_orange     6
case  7: return  "47"; // color_light_gray 7
case  8: return "100"; // color_gray       8
case  9: return "104"; // color_blue       9
case 10: return "102"; // color_green     10
case 11: return "106"; // color_cyan      11
case 12: return "101"; // color_red       12
case 13: return "105"; // color_pink      13
case 14: return "103"; // color_yellow    14
case 15: return "107"; // color_white     15
default: return  "40";
}
}
string get_print_color(const int textcolor) { // Linux only
return "\033["+get_textcolor_code(textcolor)+"m";
}
string get_print_color(const int textcolor, const int backgroundcolor) { // Linux only
return "\033["+get_textcolor_code(textcolor)+";"+get_backgroundcolor_code(backgroundcolor)+"m";
}
void print_color(const int textcolor) {
#if defined(_WIN32)
static const HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(handle, textcolor);
#elif defined(__linux__)
cout << get_print_color(textcolor);
#endif // Windows/Linux
}
void print_color(const int textcolor, const int backgroundcolor) {
#if defined(_WIN32)
static const HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(handle, backgroundcolor<<4|textcolor);
#elif defined(__linux__)
cout << get_print_color(textcolor, backgroundcolor);
#endif // Windows/Linux
}
void print_color_reset() {
#if defined(_WIN32)
static const HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(handle, 7); // reset color
#elif defined(__linux__)
cout << "\033[0m"; // reset color
#endif // Windows/Linux
}


void println(const string& s="") {
cout << s << endl;
}
void print(const string& s="") {
cout << s;
}
void print(const string& s, const int textcolor) {
print_color(textcolor);
cout << s;
print_color_reset();
}
void print(const string& s, const int textcolor, const int backgroundcolor) {
print_color(textcolor, backgroundcolor);
cout << s;
print_color_reset();
}
void print_no_reset(const string& s, const int textcolor) { // print with color, but don't reset color afterwards (faster)
print_color(textcolor);
cout << s;
}
void print_no_reset(const string& s, const int textcolor, const int backgroundcolor) { // print with color, but don't reset color afterwards (faster)
print_color(textcolor, backgroundcolor);
cout << s;
}

下面是一个如何使用它的例子:

int main() {
print("Hello ", color_red, color_blue);
print("World!\n", color_black, color_yellow);
println();
return 0;
}

您可以使用 ANSI 转义序列来着色控制台文本,它适用于 Windows 和 Linux。对于 Windows,您需要激活虚拟终端。

#include <iostream>


#ifdef _WIN32
#include <windows.h>


#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
#define DISABLE_NEWLINE_AUTO_RETURN  0x0008


void activateVirtualTerminal()
{
HANDLE handleOut = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD consoleMode;
GetConsoleMode( handleOut , &consoleMode);
consoleMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
consoleMode |= DISABLE_NEWLINE_AUTO_RETURN;
SetConsoleMode( handleOut , consoleMode );
}
#endif


using namespace std;


enum COLORS {
NC=-1,
BLACK,
RED,
GREEN,
YELLOW,
BLUE,
MAGENTA,
CYAN,
WHITE,
};


/**
* Colorize terminal colors ANSI escape sequences.
*
* @param font font color (-1 to 7), see COLORS enum
* @param back background color (-1 to 7), see COLORS enum
* @param style font style (1==bold, 4==underline)
**/
const char *colorize(int font, int back = -1, int style = -1) {
static char code[20];
    

if (font >= 0)
font += 30;
else
font = 0;
if (back >= 0)
back += 40;
else
back = 0;


if (back > 0 && style > 0) {
sprintf(code, "\033[%d;%d;%dm", font, back, style);
} else if (back > 0) {
sprintf(code, "\033[%d;%dm", font, back);
} else {


sprintf(code, "\033[%dm", font);
}


return code;
}




int main()
{
#ifdef _WIN32
activateVirtualTerminal();
#endif


cout << colorize(RED) << "trying red" << colorize(NC) << endl;
cout << colorize(RED, BLACK) << "red and black background" << colorize(NC) << endl;
cout << colorize(YELLOW, BLUE, 1) << "yellow blue bold" << colorize(NC) << endl;
cout << colorize(BLACK, WHITE) << "Black white" << colorize(NC) << endl;
cout << colorize(MAGENTA, CYAN) << "Magenta cyan" << colorize(NC) << endl;


return 1;
}