Цвет консоли С++ Win32

Я немного знаю, как делать цвета в консоли Win32 С++. Но это не очень эффективно. Например:

 SYSTEM("color 01")

Замедляет много вашего процесса. Также:

 HANDLE h = GetStdHandle ( STD_OUTPUT_HANDLE );
 WORD wOldColorAttrs;
 CONSOLE_SCREEN_BUFFER_INFO csbiInfo;

 /*
  * First save the current color information
  */

 GetConsoleScreenBufferInfo(h, &csbiInfo);
 wOldColorAttrs = csbiInfo.wAttributes;

 /*
  * Set the new color information
  */

 SetConsoleTextAttribute ( h, FOREGROUND_RED );

Отлично работает, но он не имеет большого количества цветов. Кроме того, FOREGROUND_RED темно-красный.

Итак, что я хочу задать, не существует ли способ, как свойство CLR Console::ForegroundColor, поэтому вы можете использовать любой цвет из перечисления ConsoleColor?

Ответ 1

Консоль поддерживает только 16 цветов, которые создаются путем объединения четырех значений следующим образом (я мог бы смутить серый /darkgray, но вы поняли):

namespace ConsoleForeground
{
  enum {
    BLACK             = 0,
    DARKBLUE          = FOREGROUND_BLUE,
    DARKGREEN         = FOREGROUND_GREEN,
    DARKCYAN          = FOREGROUND_GREEN | FOREGROUND_BLUE,
    DARKRED           = FOREGROUND_RED,
    DARKMAGENTA       = FOREGROUND_RED | FOREGROUND_BLUE,
    DARKYELLOW        = FOREGROUND_RED | FOREGROUND_GREEN,
    DARKGRAY          = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE,
    GRAY              = FOREGROUND_INTENSITY,
    BLUE              = FOREGROUND_INTENSITY | FOREGROUND_BLUE,
    GREEN             = FOREGROUND_INTENSITY | FOREGROUND_GREEN,
    CYAN              = FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE,
    RED               = FOREGROUND_INTENSITY | FOREGROUND_RED,
    MAGENTA           = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE,
    YELLOW            = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN,
    WHITE             = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE,
  };
}

Ответ 2

Консоль имеет ограниченный набор цветов. В реализации .NET используется ConsoleColor, чтобы установить цвета, которые являются всего лишь перечислением 16 цветов.

Базовая консоль Win32 имеет 8 базовых цветов, которые удваиваются благодаря использованию флага интенсивности (как упоминается в комментарии Shaktal по вашему вопросу).