13

我知道一点如何在 Win32 C++ 控制台中做颜色。但这并不是真正有效的。例如:

 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 枚举中的任何颜色?

4

3 回答 3

28

控制台仅支持 16 种颜色,它们是通过组合以下四个值创建的(我可能对灰色/深灰色感到困惑,但您明白了):

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,
  };
}
于 2013-06-15T16:10:24.700 回答
2

控制台只有一组有限的颜色。.NET 实现用于ConsoleColor设置颜色,这只是 16 种颜色的枚举。

底层 Win32 控制台有 8 种基色,通过使用强度标志加倍(如 Shaktal 在您的问题下的评论中所述)。

于 2013-06-15T16:03:14.887 回答
1

这是背景前景颜色的完整列表。 WinAPI 颜色的完整列表

于 2018-04-19T20:54:30.413 回答