Печатать цветной текст на консоль в С++

Я хотел бы написать класс консоли, который может выводить цветной текст на консоль.

Итак, я могу сделать что-то вроде (в основном обертка для printf):

Console::Print( "This is a non-coloured message\n" );
Console::Warning( "This is a YELLOW warning message\n" );
Console::Error( "This is a RED error message\n" );

Как мне напечатать текст разного цвета на консоли Windows?


person Brock Woolf    schedule 22.05.2009    source источник


Ответы (3)


Ознакомьтесь с этим руководством. Я бы сделал собственный манипулятор, чтобы я мог делать что-то вроде:

std::cout << "standard text" << setcolour(red) << "red text" << std::endl;

Вот небольшое руководство по реализации собственного манипулятора.

Пример быстрого кода:

#include <iostream>
#include <windows.h>
#include <iomanip>

using namespace std;

enum colour { DARKBLUE = 1, DARKGREEN, DARKTEAL, DARKRED, DARKPINK, DARKYELLOW, GRAY, DARKGRAY, BLUE, GREEN, TEAL, RED, PINK, YELLOW, WHITE };

struct setcolour
{
   colour _c;
   HANDLE _console_handle;


       setcolour(colour c, HANDLE console_handle)
           : _c(c), _console_handle(0)
       { 
           _console_handle = console_handle;
       }
};

// We could use a template here, making it more generic. Wide streams won't
// work with this version.
basic_ostream<char> &operator<<(basic_ostream<char> &s, const setcolour &ref)
{
    SetConsoleTextAttribute(ref._console_handle, ref._c);
    return s;
}

int main(int argc, char *argv[])
{
    HANDLE chandle = GetStdHandle(STD_OUTPUT_HANDLE);
    cout << "standard text" << setcolour(RED, chandle) << " red text" << endl;

    cin.get();
}
person Skurmedel    schedule 22.05.2009
comment
Этот код на самом деле не работает, однако ваша предыдущая версия, которую вы только что заменили, работала. Я дважды проверю, у меня это правильно, хотя - person Brock Woolf; 22.05.2009
comment
@Брок Вульф: Да, извини. У меня возникла проблема при копировании HANDLE. - person Skurmedel; 22.05.2009
comment
Если вы хотите изменить цвета в середине строки, убедитесь, что вы отправили std::flush перед повторным вызовом setcolor(). - person jep; 20.06.2015

Я выполнил поиск по запросу «консоль c++ пишет цветной текст» и нашел эту страницу примерно в 4 или 5. Поскольку на сайте есть раздел копирования и вставки, я решил опубликовать его здесь (другой вопрос о гниении ссылок также вызвал это):

#include <stdlib.h>
#include <windows.h>
#include <iostream>

using namespace std;

enum Color { DBLUE=1,GREEN,GREY,DRED,DPURP,BROWN,LGREY,DGREY,BLUE,LIMEG,TEAL,
    RED,PURPLE,YELLOW,WHITE,B_B };
/* These are the first 16 colors anyways. You test the other hundreds yourself.
   After 15 they are all combos of different color text/backgrounds. */

bool quit;

void col(unsigned short color)
{
    HANDLE hcon = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hcon,color);
}

istream &operator>> ( istream &in, Color &c )
{
    int tint;
    cin >> tint;
    if (tint==-1) quit=true;
    c=(Color)tint;
}

int main()
{
    do {
        col(7); // Defaults color for each round.
        cout << "Enter a color code, or -1 to quit... ";
        Color y;
        cin >> y; // Notice that >> is defined above for Color types.
        col(y); // Sets output color to y.
        if (!quit) cout << "Color: " << (int)y << endl;
    } while (!quit);
    return 0;
}

Для C# есть эта страница

person ChrisF    schedule 22.05.2009
comment
Та первая ссылка, которая у вас была, была информативной, хотя это был C#. - person sean e; 22.05.2009
comment
Критерий поиска был c # console.write цветной текст в этом случае - person ChrisF; 22.05.2009

использовать эти функции

enum c_color{BLACK=30,RED=31,GREEN=32,YELLOW=33,BLUE=34,MAGENTA=35,CYAN=36,WHITE=37};
enum c_decoration{NORMAL=0,BOLD=1,FAINT=2,ITALIC=3,UNDERLINE=4,RIVERCED=26,FRAMED=51};
void pr(const string str,c_color color,c_decoration decoration=c_decoration::NORMAL){
  cout<<"\033["<<decoration<<";"<<color<<"m"<<str<<"\033[0m";
}

void prl(const string str,c_color color,c_decoration decoration=c_decoration::NORMAL){
   cout<<"\033["<<decoration<<";"<<color<<"m"<<str<<"\033[0m"<<endl;
}
person Shanaka Rusith    schedule 24.04.2016