Раскрашивание текста в консоли с помощью C ++

Как я могу написать цветной текст на консоли с помощью C ++? То есть как я могу писать разный текст разными цветами?


person Sudantha    schedule 29.10.2010    source источник
comment
Есть, но нет ресурсов для поиска разных цветов в консоли C ++ :)   -  person Sudantha    schedule 29.10.2010
comment
Что за консоль C ++ ??   -  person Edward Strange    schedule 29.10.2010
comment
Возможный дубликат: stackoverflow.com / questions / 3585846 /   -  person karlphillip    schedule 29.10.2010
comment
Будьте осторожны с этими ответами. На вашей консоли будут изменения после выхода из программы, если вы не отмените их самостоятельно.   -  person kayleeFrye_onDeck    schedule 11.07.2017


Ответы (14)


Добавьте немного цвета в текст консоли

  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".

person Sheen    schedule 29.10.2010
comment
Обратите внимание, что это только для Windows. - person DarkDust; 29.10.2010
comment
Что делать, если я хочу добавить несколько цветов в одну строку ?. - person Fadwa; 10.01.2017
comment
@Misaki Я не тестировал, но можете ли вы попробовать удалить бит "endl"? - person Sheen; 10.01.2017
comment
Какую библиотеку мне нужно включить, чтобы знать класс HANDLE? - person STF; 16.03.2017
comment
@STF просто используйте ‹windows.h› - person Sheen; 16.03.2017
comment
как вернуть его по умолчанию? - person Beyondo; 27.04.2018
comment
@KiraSama Используйте API GetConsoleScreenBufferInfo (), чтобы получить текущее значение CONSOLE_SCREEN_BUFFER_INFO, а его членские атрибуты wAttributes будут иметь информацию о текущем цвете. - person Sheen; 12.05.2018
comment
@XStylish void WriteInColor (цвет int, текст строки) {HANDLE hConsole = GetStdHandle (STD_OUTPUT_HANDLE); CONSOLE_SCREEN_BUFFER_INFO cbInfo; GetConsoleScreenBufferInfo (hConsole, & cbInfo); int originalColor = cbInfo.wAttributes; SetConsoleTextAttribute (hConsole, цвет); cout ‹---------------- текст; SetConsoleTextAttribute (hConsole, originalColor); } - person user875234; 04.10.2018
comment
@ user875234 Я уже решил свою проблему, поэтому я не тестировал ваш код, но он явно неверен, вы получаете текущий цвет, который является исходным цветом при только в первый раз временно храним его. После завершения функции она исчезнет, ​​поэтому, если мы изменим консоль на пользовательский цвет после этого, функция WriteInColor станет бесполезной. Вы должны протестировать if you didn't get the original color yet, если истинно, сохранить его в глобальной переменной, поэтому всякий раз, когда мы используем функцию WriteInColor, если мы хотим вернуть ее по умолчанию, мы можем использовать глобальную переменную, которую мы создали на первом этапе. -параметр. - person Beyondo; 05.10.2018
comment
Он устанавливает цвет обратно в конце функции. Я полагал, вы уже поняли это. Я просто писал на случай, если у кого-то будет такая же проблема, как у нас с вами. - person user875234; 05.10.2018
comment
Такой хороший снимок! - person Albert.Qing; 27.06.2019
comment
Кажется, вы можете использовать сокращение SetConsoleTextAttribute( GetStdHandle(-11) , 0x08); - person Danilo; 10.09.2019
comment
А как насчет Linux? - person Pedro77; 20.02.2020

Цветовые коды выхода 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;
}

GCC:

g++ cpp_interactive_terminal.cpp -o cpp_interactive_terminal.cgi
chmod +x cpp_interactive_terminal.cgi
./cpp_interactive_terminal.cgi
person Mehdi Mohammadpour    schedule 06.01.2019
comment
@Mehdi Mohammadpour У меня Windows 10, и ваши escape-коды работают на меня, но мне кажется, что у вас поменяли местами коды переднего плана и фона. Не могли бы вы поменять местами заголовки «FG» и «BG»? - person yamex5; 20.03.2019
comment
Я должен согласиться с @ yamex5 - person smoothware; 03.01.2020
comment
Привет, yamex5 и гладкое ПО, спасибо, хорошо - person Mehdi Mohammadpour; 25.08.2020

В стандартном C ++ нет понятия «цвета». Итак, то, что вы спрашиваете, зависит от операционной системы.

Для Windows вы можете воспользоваться функцией SetConsoleTextAttribute .

В * nix необходимо использовать escape-последовательности ANSI.

person user225312    schedule 29.10.2010
comment
Обратите внимание, что последовательности ASNI (или, по крайней мере, некоторые из них) работают и с Windows CMD.EXE. - person Fund Monica's Lawsuit; 04.05.2016
comment
@Asu, они этого не сделали до Win10 Anniversary Edition. Если у вас установлена ​​последняя версия Win10, она у вас есть. - person kayleeFrye_onDeck; 11.07.2017

Вы можете писать методы и вызывать вот так


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
person Sudantha    schedule 29.10.2010
comment
Обратите внимание, что SetConsoleTextAttribute(hConsole, 15); устанавливает цвет на Ярко-белый, а не на Белый. 7 - белый. и 15 - ярко-белый. - person GooDeeJAY; 28.04.2020

В Windows 10 вы можете использовать escape-последовательности следующим образом:

#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;
person Krzysztof Buchacz    schedule 29.01.2019
comment
ENABLE_VIRTUAL_TERMINAL_PROCESSING у меня почему-то не работает в Windows 10. Я получаю [32mError![0m в качестве вывода. Я что-то упускаю? - person ProjectPhysX; 18.03.2021
comment
Ваш код сбрасывает любые другие флаги консоли вывода - person Alexey Biryukov; 06.05.2021

Предполагая, что вы говорите об окне консоли Windows, поищите функции консоли в документации библиотеки MSDN.

В противном случае или в более общем плане это зависит от консоли. Цвета не поддерживаются библиотекой C ++. Но библиотека для работы с консолью может / будет поддерживать цвета. Например. Google "цвета ncurses".

Для подключенных последовательных терминалов и эмуляторов терминалов вы можете управлять вещами, выводя «escape-последовательности». Обычно они начинаются с ASCII 27 (escape-символ в ASCII). Есть стандарт ANSI и множество нестандартных схем.

person Cheers and hth. - Alf    schedule 29.10.2010
comment
С тех пор, как этот ответ был написан, Windows 10 получила поддержку управляющих последовательностей ANSI для узких консольных потоков. - person Cheers and hth. - Alf; 03.10.2016

Самый простой способ сделать это:

#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. Работает. Как уже отмечалось, это не кроссплатформенный вариант, он не будет работать в системах Linux.

person Inconnu    schedule 01.01.2017
comment
Это плохой подход! Код не является кроссплатформенным, он не будет работать в системах Linux. - person GooDeeJAY; 28.04.2020
comment
Мало того, вы также вызываете системные команды. Это ужасно неэффективно. - person Noud Zandbergen; 25.12.2020

Я обнаружил, что библиотека C ++ с открытым исходным кодом только для заголовков работает на нескольких платформах: https://github.com/imfl/color-console

Цвет консоли:

Облегченная библиотека C ++, содержащая только заголовки, для переноса цветов на консоль Windows с очень простым в использовании API, который освобождает вас от бремени настройки и сброса цветов экрана при каждом вызове.

введите описание изображения здесь

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

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

Вы видите Hello, World! в воде.
 введите описание изображения здесь

Зачем это нужно? введите описание изображения здесь

Нет необходимости сбрасывать: большинство решений на рынке работают как манипуляторы, которые постоянно требуют, чтобы вы сбрасывали цвет экрана после того, как вы его установили. Хотя этот традиционный подход также предлагается в этой библиотеке в пространстве имен hue ...

табулировать:

Если Вы хотите не только изменить цвета, но и распечатать текст в более читаемой форме (например, в виде таблицы), также используйте https://github.com/p-ranav/tabulate, который может изменять цвета и рисовать таблицы в консоли.

tabulate - это библиотека только для заголовков. Просто добавьте include / в свои include_directories, и все будет в порядке. Версия файла с одним заголовком также доступна в single_include /. ПРИМЕЧАНИЕ Табулирование поддерживает ›= C ++ 11. введите описание изображения здесь

person baziorek    schedule 06.03.2021
comment
Они оба очень хороши. большое спасибо. Плохо то, что во-первых, только для Windows. - person Rika; 06.04.2021
comment
За последние два дня я нашел лучшую многоплатформенную библиотеку для цветов: github.com/jupyter-xeus / cpp-terminal Он разрабатывается Jupyter-xeus - людьми из CERN. - person baziorek; 06.04.2021

Я не уверен, что вы действительно хотите сделать, но предполагаю, что вы хотите, чтобы ваша программа на C ++ выводила цветной текст в консоль, верно? Не знаю о Windows, но во всех Unices (включая Mac OS X) вы должны просто использовать escape ANSI последовательности для этого.

person DarkDust    schedule 29.10.2010

В 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

person cambunctious    schedule 28.06.2016

Здесь пример cplusplus является примером использования цветов в консоли.

person Łukasz Milewski    schedule 29.10.2010

Не используйте «system (« Color… »)», если не хотите, чтобы весь экран был заполнен цветом. Это сценарий, необходимый для создания цветного текста:

#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;
}
person Community    schedule 04.05.2019

Вам не нужно использовать какую-либо библиотеку. Только система записи («цвет 4f»);

person user12558829    schedule 18.12.2019
comment
Это только окна, и IIRC это просто сделает весь экран одного цвета - person nathanfranke; 20.04.2020

Вот мое легковесное решение, работающее как в Windows, так и в Linux:

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

#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;
}
person ProjectPhysX    schedule 21.04.2021
comment
Привет, у меня вопрос. Я прав, что reset цвет для Windows - это просто color_light_gray, если вы используете 7 для сброса цвета? - person hazer_hazer; 11.06.2021
comment
@hazer_hazer, да, именно так. Светло-серый текст и черный фон - это цвет по умолчанию для консоли Windows. Если вы установили другой цвет по умолчанию, вы можете сделать глобальную переменную defaultcolor, инициализировать ее в начале GetConsoleTextAtteibute (handle, defaultcolor); и используйте это для print_color_reset () ;. Вариант Linux, напротив, всегда возвращается к тем, которые вы установили в качестве цветов по умолчанию, не обязательно к светло-серому на черном. - person ProjectPhysX; 12.06.2021