Colorear texto en la consola con C ++

99

¿Cómo puedo escribir texto en color en la consola con C ++? Es decir, ¿cómo puedo escribir texto diferente con colores diferentes?

Sudantha
fuente
Hice pero no hay recursos para encontrar diferentes colores en la consola de C ++ :)
Sudantha
2
¿Qué es la consola C ++?
Edward Strange
Posible duplicado de: stackoverflow.com/questions/3585846/…
karlphillip
Tenga cuidado con estas respuestas. Su consola tendrá los cambios después de que se cierre el programa si no los revierte usted mismo.
kayleeFrye_onDeck

Respuestas:

123

Agregue un poco de color al texto de su consola

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

texto alternativo

Atributos de los caracteres A continuación se explica cómo se interpreta el valor "k".

Brillo
fuente
41
Tenga en cuenta que esto es solo para Windows.
DarkDust
2
¿Y si quiero agregar varios colores en una línea ?.
Fadwa
3
@Misaki No lo he probado, pero ¿puedes intentar eliminar el bit 'endl'?
Sheen
3
¿Qué biblioteca necesito incluir para conocer la clase HANDLE?
STF
2
@STF solo usa <windows.h>
Sheen
36

Códigos de color de escape 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ódigo de muestra para 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
Mehdi Mohammadpour
fuente
3
@Mehdi Mohammadpour Tengo Windows 10 y sus códigos de escape están trabajando para mí, pero me parece que usted tiene el primer plano y los códigos de fondo invertido. ¿Puede invertir los títulos 'FG' y 'BG', por favor?
yamex5
Estoy de acuerdo con @ yamex5
smoothware
Hola yamex5 y smoothware, Gracias, de acuerdo
Mehdi Mohammadpour
23

C ++ estándar no tiene noción de 'colores'. Entonces, lo que pregunte depende del sistema operativo.

Para Windows, puede consultar SetConsoleTextAttribute función .

En * nix, debe usar las secuencias de escape ANSI .

user225312
fuente
3
Tenga en cuenta que las secuencias ASNI (o al menos algunas de ellas) también funcionan en CMD.EXE de Windows.
Financia la demanda de Monica
3
@Asu, no lo hacen antes de Win10 Anniversary Edition. Si su Win10 nos está actualizado, lo tiene.
kayleeFrye_onDeck
7

Puedes escribir métodos y llamar así


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
Sudantha
fuente
2
Tenga en cuenta que SetConsoleTextAttribute(hConsole, 15);establece el color en Blanco brillante , no en Blanco . 7 - Blanco. and 15 - Bright White
GooDeeJaY
5

En Windows 10, puede usar secuencias de escape de esta manera:

#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;
Krzysztof Buchacz
fuente
4

Suponiendo que está hablando de una ventana de consola de Windows, busque las funciones de la consola en la documentación de MSDN Library.

De lo contrario, o de forma más general, depende de la consola. Los colores no son compatibles con la biblioteca C ++. Pero una biblioteca para el manejo de la consola puede admitir colores. Por ejemplo, google "colores ncurses".

Para terminales en serie conectados y emuladores de terminal, puede controlar las cosas generando "secuencias de escape". Por lo general, comienzan con ASCII 27 (el carácter de escape en ASCII). Existe un estándar ANSI y muchos esquemas personalizados.

Saludos y hth. - Alf
fuente
Desde que se escribió esa respuesta, Windows 10 ganó soporte para secuencias de escape ANSI para los flujos de consola estrechos.
Saludos y hth. - Alf
2

No estoy seguro de lo que realmente quieres hacer, pero supongo que quieres que tu programa C ++ genere texto en color en la consola, ¿verdad? No sé sobre Windows, pero en todos los Unices (incluido Mac OS X), simplemente usaría secuencias de escape ANSI para eso.

DarkDust
fuente
2

En Windows, puede usar cualquier combinación de rojo, verde y azul en el primer plano (texto) y el fondo.

/* 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;

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

cambuntious
fuente
2

La forma más sencilla de hacerlo es:

#include <stdlib.h>

system("Color F3");

Donde "F" es el código para el color de fondo y 3 es el código para el color del texto.

Juega con él para ver otras combinaciones de colores:

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;

Nota: solo probé en Windows. Trabajos. Como se señaló, esto no es multiplataforma, no funcionará en sistemas Linux.

Inconnu
fuente
4
¡Este es un mal enfoque! El código no es multiplataforma, no funcionará en sistemas Linux
GooDeeJaY
1

No es necesario utilizar ninguna biblioteca. Solo escriba el sistema ("color 4f");

usuario12558829
fuente
4
Esto es solo para Windows, e IIRC esto solo hará que toda la pantalla sea de un color
nathanfranke
0

No utilice "sistema (" Color ... ")" si no desea que toda la pantalla se llene de color. Este es el script necesario para hacer texto en 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;
}
Software de microprod
fuente