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


99

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


Сделал, но не нашел ресурсов, чтобы найти разные цвета в консоли C ++ :)
Суданта,

2
Что за консоль C ++ ??
Эдвард Стрэндж,

Возможный дубликат: stackoverflow.com/questions/3585846/…
karlphillip

Будьте осторожны с этими ответами. На вашей консоли будут изменения после выхода из программы, если вы не отмените их самостоятельно.
kayleeFrye_onDeck

Ответы:


123

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

  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;
  }

альтернативный текст

Атрибуты символа Вот как следует интерпретировать значение «k».


42
Обратите внимание, что это только для Windows.
DarkDust

2
Что, если я хочу добавить несколько цветов в одну строку ?.
Fadwa

3
@Misaki Я не тестировал, но можете ли вы попробовать удалить бит "endl"?
Sheen

3
Какую библиотеку мне нужно включить, чтобы знать класс HANDLE?
STF

2
@STF просто используйте <windows.h>
Sheen

36

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

3
@Mehdi Mohammadpour У меня есть для Windows 10, и ваши управляющих коды будут работать для меня, но мне кажется , что у вас есть передний план и фон кода наоборот. Не могли бы вы поменять местами заголовки «FG» и «BG»?
yamex5

Я согласен с @ yamex5
smoothware

Привет, yamex5 и гладкое ПО, спасибо, хорошо
Мехди Мохаммадпур

23

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

Для Windows вы можете проверить функцию SetConsoleTextAttribute .

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


3
Обратите внимание, что последовательности ASNI (или, по крайней мере, некоторые из них) работают и с CMD.EXE Windows.
Иск Фонда Моники

3
@Asu, они этого не сделали до Win10 Anniversary Edition. Если у вас установлена ​​последняя версия Win10, она у вас есть.
kayleeFrye_onDeck

7

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


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

2
Обратите внимание, что для SetConsoleTextAttribute(hConsole, 15);цвета устанавливается « Ярко-белый» , а не « Белый» . 7 - Белый. и 15 - Ярко-белый
GooDeeJaY

5

В 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;

4

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

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

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


С тех пор, как этот ответ был написан, Windows 10 получила поддержку управляющих последовательностей ANSI для узких консольных потоков.
Приветствия и hth. - Alf

2

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


2

В 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


2

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

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


4
Это плохой подход! Код не является кроссплатформенным, он не будет работать в системах Linux
GooDeeJaY

1

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


4
Это только окна, и IIRC это просто сделает весь экран одного цвета
Натанфранке

0

Не используйте «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;
}

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.