Розфарбовування тексту в консолі за допомогою C ++


98

Як я можу написати кольоровий текст на консолі за допомогою C ++? Тобто, як я можу писати різний текст з різними кольорами?


Не мав ресурсів, щоб знайти різні кольори на консолі C ++ :)
Суданта

2
Що таке консоль С ++ ??
Едвард Стрендж

Можливий дублікат: stackoverflow.com/questions/3585846 / ...
karlphillip

Будьте обережні з цими відповідями. Якщо ви не скасуєте їх самостійно, зміни на вашій консолі матимуться після виходу програми.
kayleeFrye_onDeck

Відповіді:


122

Додайте трохи кольору до тексту консолі

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


41
Зверніть увагу, що це лише для Windows.
DarkDust

2
Що робити, якщо я хочу додати кілька кольорів в один рядок ?.
Фадва

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

3
Яку бібліотеку мені потрібно включити для знання класу HANDLE?
STF

2
@STF просто використовуй <windows.h>
Шин,

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 ви повинні використовувати послідовності екранування 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 ви можете використовувати екранні послідовності таким чином:

#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 ++ не підтримує кольори. Але бібліотека для роботи з консоллю може / буде підтримувати кольори. Наприклад, Google "ncurses кольори".

Для підключених послідовних терміналів та емуляторів терміналів ви можете керувати речами, виводячи "екранні послідовності". Вони, як правило, починаються з ASCII 27 (символ входу в ASCII). Існує стандарт ANSI і безліч спеціальних схем.


З моменту написання цієї відповіді Windows 10 отримала підтримку захисних послідовностей ANSI для вузьких консольних потоків.
Вітаю і hth. - Альф

3

Найпростіший спосіб зробити це:

#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. Працює.


3
Це поганий підхід! Код не є крос-платформним, він не буде працювати в системах Linux
GooDeeJaY

2

Я не впевнений, що ви насправді хочете зробити, але я думаю, ви хочете, щоб ваша програма C ++ виводила кольоровий текст на консоль, так? Не знаю про Windows, але на всіх Unices (включаючи Mac OS X) ви просто використовували б для цього послідовності екранування 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


1

Вам не потрібно користуватися жодною бібліотекою. Просто запишіть лише систему ("колір 4f");


3
Це лише для Windows, і IIRC це просто зробить весь екран одним кольором
nathanfranke

0

Не використовуйте "система (" Колір ... ")", якщо ви не хочете, щоб весь екран був заповнений кольором. Це сценарій, необхідний для створення кольорового тексту:

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