@Zadavatel_Voprosov

Как вывести в консоль цветной текст из программы на C++ & Visual Studio под Windows?

Всем привет! Есть потребность в выводе цветного текста в консоль.
Пробовал разные варианты:

1) SetConsoleTextAttribute();
Развернуть для просмотра
Выводим скобки белым, слово ERR! красным:
#include <Windows.h>
#include <stdio.h>

int main() {
	HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
	printf("[ ");
       SetConsoleTextAttribute(console, FOREGROUND_RED);
        printf("ERR!");
	SetConsoleTextAttribute(console, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED);
	printf(" ]");
	system("pause");
	return 0;
}
Да, способ хороший, но приходится вызывать printf 3 раза и делать HANDLE.
Если программа будет запускаться на XP с 64 Мегабайтами DDR2 и старинным (медленном) HDD, то будет видно, что выводятся символы последовательно (особенно с процом на 233 МГц).


1) SetConsoleColor(); (самопис.h)
Развернуть для просмотра
Выводим тоже самое, но с помощью своего самописа:
#include <Windows.h>
#include <stdio.h>

int main() {
	HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
	printf("[ ");
        SetConsoleColor(Red, Black);
        printf("ERR!");
	SetConsoleColor(White, Black);
	printf(" ]");
	system("pause");
	return 0;
}
А вот тут уже проблемы, т.к. функция SetConsoleColor основана на консольной команде color, которая весь текст окрашивает, а не его часть.
Можно конечно переписать для упрощения первый способ в эту библиотеку, но от трёх разового printf(); не избавит.


В Java это всё делается через ANSI коды, что даёт вывести многоцветный текст за один раз, но такое не работает в C++.
Java пример
System.out.println("\u001B[31mRed Text!\u001B[0mNormal Text");
Что можете предложить?
  • Вопрос задан
  • 8867 просмотров
Пригласить эксперта
Ответы на вопрос 2
myjcom
@myjcom Куратор тега C++
windows 10
EXAMPLE_OF_ENABLING_VIRTUAL_TERMINAL_PROCESSING

code
#include <stdio.h>
#include <wchar.h>
#include <windows.h>

int main()
{
  HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
  if (hOut == INVALID_HANDLE_VALUE)
  {
    return GetLastError();
  }

  DWORD dwMode = 0;
  if (!GetConsoleMode(hOut, &dwMode))
  {
    return GetLastError();
  }

  dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
  if (!SetConsoleMode(hOut, dwMode))
  {
    return GetLastError();
  }

  wprintf(L"\u001B[31mRed Text!\u001B[0mNormal Text\r\n");
  
  getchar();
  return 0;
}

OUT:
5bd5f6b534a33368727521.png
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы