Как изменить цвет текста или фона в консольном приложении Windows

Какая функция С++ изменяет цвет текста или фона (MS Visual Studio)? Например cout<<"This text"; как сделать "Этот текст" красным цветом.


person Wizard    schedule 27.11.2011    source источник
comment
Какой текст? Какой фон? Пожалуйста, будьте более конкретными.   -  person Konrad Rudolph    schedule 27.11.2011
comment
Так вы имеете дело с консольным приложением?   -  person Bart    schedule 27.11.2011
comment
Взгляните на [функции консоли](msdn .microsoft.com/en-us/library/ms682073(VS.85%29.aspx)   -  person Bart    schedule 27.11.2011
comment
Спасибо дружище, я серьезно!   -  person Wizard    schedule 27.11.2011


Ответы (3)


Цвет — это не C++, а свойство вашего терминала. Если ваш терминал использует ANSI (например, любой терминал Linux, DOS или Windows NT, если вы добавите DEVICE=C:\DOS\ansi.sys к config.sys, или более позднюю версию Windows, если вы вызовете оболочку с помощью cmd.exe /kansicon), то вы можете попробовать следующий трюк:

#define ANSI_COLOR_RED     "\x1b[31m"
#define ANSI_COLOR_GREEN   "\x1b[32m"
#define ANSI_COLOR_YELLOW  "\x1b[33m"
#define ANSI_COLOR_BLUE    "\x1b[34m"
#define ANSI_COLOR_MAGENTA "\x1b[35m"
#define ANSI_COLOR_CYAN    "\x1b[36m"

#define ANSI_COLOR_BRIGHT  "\x1b[1m"
#define ANSI_COLOR_RESET   "\x1b[0m"


std::cout << ANSI_COLOR_RED "Hello World\n" ANSI_COLOR_RESET;

В Википедии есть список управляющих последовательностей ANSI.

person Kerrek SB    schedule 27.11.2011
comment
@Kyberias: в Windows NT это происходит, если вы загружаете ansi.sys, как и в DOS, или позже, если вы скажете cmd.exe /kansicon. - person Kerrek SB; 28.12.2014
comment
Windows 10 с Threshold 2 изначально поддерживает это без аргументов. - person ildjarn; 10.06.2016
comment
@ildjarn: Прогресс не остановить! - person Kerrek SB; 10.06.2016

Вы можете изменить цвета для консольного приложения с помощью Win32, и вот пример того, как это сделать:

#include "stdafx.h"
#include <Windows.h>
#include <iostream>

using namespace std; 

int main(void) 
{ 
    HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE); 
    if (hStdout == INVALID_HANDLE_VALUE) 
    {
        cout << "Error while getting input handle" << endl;
        return EXIT_FAILURE;
    }
    //sets the color to intense red on blue background
    SetConsoleTextAttribute(hStdout, FOREGROUND_RED | BACKGROUND_BLUE | FOREGROUND_INTENSITY);

    cout << "This is intense red text on blue background" << endl;
    //reverting back to the normal color
    SetConsoleTextAttribute(hStdout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);

    return EXIT_SUCCESS;
}

Посмотрите документацию MSDN для функции SetConsoleTextAttribute и Буферы экрана консоли для получения дополнительной информации.

Более полный пример консольных приложений, использующих Win32, доступен здесь.

person Nasreddine    schedule 27.11.2011
comment
+1 хороший ответ ... но я должен прокомментировать #include stdafx.h, чтобы запустить этот код в кодовых блоках ide. - person nKandel; 17.12.2012

Я полагаю, что вы ищете функцию SetConsoleTextAttribute. Первый параметр, hConsoleOutput, будет стандартным дескриптором вывода, полученным через GetStdHandle(STD_OUTPUT_HANDLE). Второй параметр представляет собой комбинацию побитового ИЛИ (|) желаемого атрибуты персонажа.

См. также: KB319883 Как изменить цвета переднего плана и цвета фона текста в окне консоли с помощью Visual C#

person Daniel Trebbien    schedule 27.11.2011