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?

Sudantha
fonte
Não usei recursos para encontrar cores diferentes no console C ++ :)
Sudantha
2
Qual é o console C ++ ??
Edward Strange
Possível duplicata de: stackoverflow.com/questions/3585846/…
karlphillip
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.

Brilho
fonte
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
Mehdi Mohammadpour
fonte
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 .

user225312
fonte
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
Sudantha
fonte
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;
Krzysztof Buchacz
fonte
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.

Saúde e hth. - Alf
fonte
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.

Inconnu
fonte
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.

DarkDust
fonte
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

cambaleante
fonte
1

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

user12558829
fonte
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;
}
Microprod Software
fonte
-1

Aqui o exemplo cplusplus é um exemplo de como usar cores no console.

Łukasz Milewski
fonte