Colorir texto no console com C ++


95

Como posso escrever texto colorido no console com C ++? Ou seja, como posso escrever um texto diferente com cores diferentes?


Não usei recursos para encontrar cores diferentes no console C ++ :)
Sudantha

2
Qual é o console C ++ ??
Edward Strange


Tenha cuidado com essas respostas. Seu console terá as alterações após a saída do programa, se você não as reverter.
kayleeFrye_onDeck

Respostas:


118

Adicione um pouco de cor ao texto do console

  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 caracteres Aqui está como o valor "k" deve ser interpretado.


39
Observe que este é apenas para Windows.
DarkDust

2
E se eu quiser adicionar várias cores em uma linha?
Fadwa de

2
@Misaki Eu não testei, mas você pode tentar remover a parte 'final'?
Sheen de

3
Que biblioteca preciso incluir para conhecer a classe HANDLE?
STF

2
como configurá-lo de volta ao padrão?
Beyondo

31

Códigos de cor 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 amostra 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

3
@Mehdi Mohammadpour Tenho o Windows 10 e seus códigos de escape estão funcionando para mim, mas me parece que você inverteu os códigos de primeiro e segundo plano. Você pode inverter os títulos 'FG' e 'BG', por favor?
yamex5 de

Eu tenho que concordar com o @ yamex5
smoothware

Olá yamex5 & smoothware, Obrigado, OK
Mehdi Mohammadpour

23

O C ++ padrão não tem noção de 'cores'. Portanto, o que você está perguntando depende do sistema operacional.

Para Windows, você pode verificar a função SetConsoleTextAttribute .

Em * nix, você deve usar as sequências de escape ANSI .


3
Observe que as sequências ASNI (ou pelo menos algumas delas) também funcionam no CMD.EXE do Windows.
Processo de Fundo Monica

3
@Asu, eles não fazem isso antes do Win10 Anniversary Edition. Se o seu Win10 estiver atualizado, você o tem.
kayleeFrye_onDeck

7

Você pode escrever métodos e chamar assim


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
Observe que SetConsoleTextAttribute(hConsole, 15);define a cor para Branco Brilhante , não para Branco . 7 - Branco. e 15 - Bright White
GooDeeJaY

5

No Windows 10, você pode usar sequências de escape desta forma:

#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

Supondo que você esteja falando sobre uma janela de console do Windows, consulte as funções do console na documentação da Biblioteca MSDN.

Caso contrário, ou mais geralmente, depende do console. As cores não são suportadas pela biblioteca C ++. Mas uma biblioteca para manipulação de console pode / irá suportar cores. Por exemplo, google "cores ncurses".

Para terminais seriais e emuladores de terminal conectados, você pode controlar as coisas emitindo "sequências de escape". Normalmente começam com ASCII 27 (o caractere de escape em ASCII). Existe um padrão ANSI e muitos esquemas personalizados.


Desde que essa resposta foi escrita, o Windows 10 ganhou suporte para sequências de escape ANSI para os fluxos de console estreitos.
Saúde e hth. - Alf

3

A maneira mais simples de fazer é:

#include <stdlib.h>

system("Color F3");

Onde "F" é o código para a cor de fundo e 3 é o código para a cor do texto.

Mexa nele para ver outras combinações de cores:

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: Eu só testei no Windows. Trabalho.


1
Esta é uma abordagem ruim! O código não é multiplataforma, não funcionará em sistemas Linux
GooDeeJaY

2

Não tenho certeza do que você realmente deseja fazer, mas meu palpite é que você deseja que seu programa C ++ produza texto colorido no console, certo? Não sei sobre o Windows, mas em todos os Unices (incluindo Mac OS X), você simplesmente usaria sequências de escape ANSI para isso.


2

No Windows, você pode usar qualquer combinação de vermelho, verde e azul no primeiro plano (texto) e no plano de fundo.

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

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


1

Você não precisa usar nenhuma biblioteca. Basta escrever sistema ("cor 4f");


2
Este é apenas o Windows, e IIRC isso tornará a tela inteira de uma cor
nathanfranke

0

Não use "sistema (" Cor… ")" se não quiser que toda a tela seja preenchida com cores. Este é o script necessário para fazer o texto colorido:

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.