【问题标题】:C++ Win32 Console ColorC++ Win32 控制台颜色
【发布时间】:2013-06-12 02:29:12
【问题描述】:

我知道一点如何在 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枚举中的任何颜色?

【问题讨论】:

  • 您是否尝试过设置FOREGROUND_INTENSITY 标志以使其呈鲜红色?例如:SetConsoleTextAttribute( h, FOREGROUND_RED | FOREGROUND_INTENSITY )
  • 可行,但我仍然想知道是否有任何方法可以获得更多颜色,也许是调色板?
  • Console 仅支持 16 种颜色,由 FOREGROUND_RED、FOREGROUND_BLUE、FOREGROUND_GREEN 和 FOREGROUND_INTENSITY 组合而成。
  • 有16种颜色。从颜色表中检索实际颜色值。可由用户在系统菜单中编辑。您可以在代码中更新它,SetConsoleScreenBufferEx() 函数。

标签: c++ winapi colors console


【解决方案1】:

这里是 BackgroundForeGround 颜色的完整列表。 Complete list of WinAPI colors

【讨论】:

    【解决方案2】:

    控制台仅支持 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,
      };
    }
    

    【讨论】:

    • 您可以删除所有分配,它仍然可以工作,因为颜色代码是按递增顺序排列的。
    • 值得注意的是,使用SetConsoleScreenBufferInfoEx可以改变颜色。它们不是一成不变的,改变调色板是完全可能的。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-09-21
      • 2014-01-03
      • 2011-03-17
      • 2011-03-31
      • 2014-04-29
      • 2013-06-27
      • 2017-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多