Kolorowanie tekstu w konsoli za pomocą C ++


99

Jak mogę napisać kolorowy tekst do konsoli za pomocą C ++? To znaczy, jak mogę napisać inny tekst w różnych kolorach?


Zrobiłem, ale nie ma zasobów, aby znaleźć różne kolory w konsoli C ++ :)
Sudantha

2
Jaka jest konsola C ++?
Edward Strange


Uważaj na te odpowiedzi. Twoja konsola będzie miała zmiany po zakończeniu programu, jeśli nie cofniesz ich samodzielnie.
kayleeFrye_onDeck,

Odpowiedzi:


123

Dodaj trochę koloru do tekstu konsoli

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

tekst alternatywny

Atrybuty znaków Oto jak należy interpretować wartość „k”.


41
Zauważ, że jest to tylko Windows.
DarkDust

2
Co jeśli chcę dodać kilka kolorów w jednej linii?
Fadwa,

3
@Misaki Nie testowałem, ale czy możesz spróbować usunąć bit „endl”?
Sheen

3
Jaką bibliotekę muszę dołączyć, aby poznać klasę HANDLE?
STF

2
@STF po prostu użyj <windows.h>
Sheen

36

Kody kolorów ucieczki 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

Przykładowy kod dla 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 mam system Windows 10, a kody ucieczkowe pracujący dla mnie, ale wydaje mi się, że masz na pierwszy plan i tło kody odwrócone. Czy możesz zamienić nagłówki „FG” i „BG”?
yamex5

Muszę się zgodzić z @ yamex5
smoothware

Cześć yamex5 i smoothware, dzięki, OK
Mehdi Mohammadpour

23

Standardowy C ++ nie ma pojęcia „kolory”. Więc to, o co prosisz, zależy od systemu operacyjnego.

W systemie Windows możesz sprawdzić funkcję SetConsoleTextAttribute .

Na * nix musisz użyć sekwencji specjalnych ANSI .


3
Zwróć uwagę, że sekwencje ASNI (lub przynajmniej niektóre z nich) działają również na CMD.EXE w systemie Windows.
Pozew Moniki z

3
@Asu, nie robią tego przed Win10 Anniversary Edition. Jeśli Twój Win10 jest aktualny, masz go.
kayleeFrye_onDeck,

7

Możesz pisać metody i wywoływać w ten sposób


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
Zwróć uwagę, że SetConsoleTextAttribute(hConsole, 15);ustawia kolor na jasną biel , a nie na biały . 7 - biały. i 15 - Bright White
GooDeeJaY

5

W systemie Windows 10 możesz użyć sekwencji ucieczki w ten sposób:

#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

Zakładając, że mówisz o oknie konsoli systemu Windows, poszukaj funkcji konsoli w dokumentacji biblioteki MSDN.

W przeciwnym razie lub bardziej ogólnie zależy to od konsoli. Kolory nie są obsługiwane przez bibliotekę C ++. Ale biblioteka do obsługi konsoli może / będzie obsługiwać kolory. Np. Google „ncurses colors”.

W przypadku podłączonych terminali szeregowych i emulatorów terminali można sterować, wyświetlając „sekwencje specjalne”. Zazwyczaj zaczynają się od ASCII 27 (znak zmiany znaczenia w ASCII). Istnieje standard ANSI i wiele niestandardowych schematów.


Odkąd napisano tę odpowiedź, system Windows 10 zyskał obsługę sekwencji ucieczki ANSI dla wąskich strumieni konsoli.
Pozdrawiam i hth. - Alf

2

Nie jestem pewien, co naprawdę chcesz robić, ale domyślam się, że chcesz, aby Twój program C ++ wyświetlał kolorowy tekst w konsoli, prawda? Nie wiem o systemie Windows, ale we wszystkich Unices (w tym Mac OS X) po prostu użyjesz do tego sekwencji ucieczki ANSI .


2

W systemie Windows można użyć dowolnej kombinacji koloru czerwonego, zielonego i niebieskiego na pierwszym planie (w tekście) i w tle.

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

Źródło: https://msdn.microsoft.com/en-us/library/windows/desktop/ms682088(v=vs.85).aspx#_win32_character_attributes


2

Najprostszy sposób, jaki możesz zrobić, to:

#include <stdlib.h>

system("Color F3");

Gdzie „F” to kod koloru tła, a 3 to kod koloru tekstu.

Zadzieraj z nim, aby zobaczyć inne kombinacje kolorów:

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;

Uwaga: testowałem tylko w systemie Windows. Pracuje. Jak wskazano, to nie jest wieloplatformowa, nie będzie działać w systemach Linux.


4
To jest złe podejście! Kod nie jest wieloplatformowy, nie będzie działać w systemach Linux
GooDeeJaY

1

Nie musisz korzystać z żadnej biblioteki. Po prostu napisz system („kolor 4f”);


4
To tylko okna, a IIRC sprawi, że cały ekran będzie miał jeden kolor
nathanfranke

0

Nie używaj opcji „system („ Kolor… ”)”, jeśli nie chcesz, aby cały ekran był wypełniony kolorem. Oto skrypt potrzebny do stworzenia kolorowego tekstu:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.