是否可以将控制台中的文本颜色和背景颜色更改为不同的颜色,同时仍然在同一行上? C++

Posted

技术标签:

【中文标题】是否可以将控制台中的文本颜色和背景颜色更改为不同的颜色,同时仍然在同一行上? C++【英文标题】:Is it possible to change text color and background color in the console to different colors while still on the same line? C++ 【发布时间】:2017-06-11 08:26:51 【问题描述】:

我发现的一些解决方案似乎不适用于我的 Windows 终端。仅将整行的文本更改为一种颜色。 示例:

HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, 0 | 15);
cout << 1;

hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole,5 | 0);
cout << 2;

仅将文本和背景更改为一种颜色。 感谢您的帮助!

【问题讨论】:

std::cout 被缓冲。每次写入后尝试刷新它。 带 cout 完美!冲洗使它工作,非常感谢!已经为此工作了好几个小时! 【参考方案1】:

是的,这是可能的。它对您不起作用的原因是您的代码错误。你永远不会设置背景颜色;你只需操纵前景色。

几乎可以肯定,问题的根源在于您使用的是幻数(0 | 155 | 0)而不是 &lt;Windows.h&gt; 中定义的常量:

#define FOREGROUND_BLUE      0x0001 // text color contains blue.
#define FOREGROUND_GREEN     0x0002 // text color contains green.
#define FOREGROUND_RED       0x0004 // text color contains red.
#define FOREGROUND_INTENSITY 0x0008 // text color is intensified.
#define BACKGROUND_BLUE      0x0010 // background color contains blue.
#define BACKGROUND_GREEN     0x0020 // background color contains green.
#define BACKGROUND_RED       0x0040 // background color contains red.
#define BACKGROUND_INTENSITY 0x0080 // background color is intensified.

以下代码对我来说很好用:

const HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

// yellow on blue
SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_BLUE);
std::cout << 1;

// blue on bright green
SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_INTENSITY);
std::cout << 2;

// reset to black on white
SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
std::cout << std::endl;

这是我的控制台窗口的屏幕截图,以证明它有效。 (但请注意,我的控制台颜色已针对 Tango 主题进行了自定义,因此您的控制台可能会使用略有不同的颜色。)

我建议通过定义一个枚举来让自己的生活更轻松:

enum ConsoleColors

   BlackFore   = 0,
   MaroonFore  = FOREGROUND_RED,
   GreenFore   = FOREGROUND_GREEN,
   NavyFore    = FOREGROUND_BLUE,
   TealFore    = FOREGROUND_GREEN | FOREGROUND_BLUE,
   OliveFore   = FOREGROUND_RED | FOREGROUND_GREEN,
   PurpleFore  = FOREGROUND_RED | FOREGROUND_BLUE,
   GrayFore    = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE,
   SilverFore  = FOREGROUND_INTENSITY,
   RedFore     = FOREGROUND_INTENSITY | FOREGROUND_RED,
   LimeFore    = FOREGROUND_INTENSITY | FOREGROUND_GREEN,
   BlueFore    = FOREGROUND_INTENSITY | FOREGROUND_BLUE,
   AquaFore    = FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE,
   YellowFore  = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN,
   FuchsiaFore = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE,
   WhiteFore   = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE,

   BlackBack   = 0,
   MaroonBack  = BACKGROUND_RED,
   GreenBack   = BACKGROUND_GREEN,
   NavyBack    = BACKGROUND_BLUE,
   TealBack    = BACKGROUND_GREEN | BACKGROUND_BLUE,
   OliveBack   = BACKGROUND_RED | BACKGROUND_GREEN,
   PurpleBack  = BACKGROUND_RED | BACKGROUND_BLUE,
   GrayBack    = BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE,
   SilverBack  = BACKGROUND_INTENSITY,
   RedBack     = BACKGROUND_INTENSITY | BACKGROUND_RED,
   LimeBack    = BACKGROUND_INTENSITY | BACKGROUND_GREEN,
   BlueBack    = BACKGROUND_INTENSITY | BACKGROUND_BLUE,
   AquaBack    = BACKGROUND_INTENSITY | BACKGROUND_GREEN | BACKGROUND_BLUE,
   YellowBack  = BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN,
   FuchsiaBack = BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_BLUE,
   WhiteBack   = BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE,
;

然后像这样设置颜色:

SetConsoleTextAttribute(hConsole, ConsoleColors::BlackBack |
                                  ConsoleColors::RedFore));

【讨论】:

我只是直接复制了代码,它编译得很好,但我的控制台正常显示,完全没有颜色。它在我的主要功能中。除了您列出的标题之外,我还需要任何特定的标题吗? 我使用的唯一标头是&lt;windows.h&gt;&lt;iostream&gt;。很奇怪,它不起作用。您使用的是什么版本的 Windows? @max 我在 netbeans IDE 中使用 Windows 10 和 Cygwin 编译器。我正在编译它,然后在 IDE 之外运行它,因为颜色不会显示在 IDE 中。 我不知道该告诉你什么。我没有 Cygwin 来测试。在 Visual Studio 中编译后,这在所有版本的 Windows 上运行良好。不过,编译器应该无关紧要。我认为您没有自定义控制台的颜色以使其成为单色? 不,对我来说超级奇怪的是,我原来的问题中的代码改变了 cmd 输出的颜色/背景,但是当我使用它时它只是保持黑色。即使我将 #defines 更改为 1 ,2 ,4 等。我将其编译为 exe 然后在包含三个 dll 的 cygwin.dll 等的文件夹中运行它,因为没有这些它不会运行,如果这有什么不同的话.无论如何,感谢您的帮助!

以上是关于是否可以将控制台中的文本颜色和背景颜色更改为不同的颜色,同时仍然在同一行上? C++的主要内容,如果未能解决你的问题,请参考以下文章

是否可以更改图像的颜色?

是否可以将状态栏文本(前景)颜色更改为任意颜色(即不是黑色或白色)? [复制]

将突出显示的文本更改为不同的颜色

如何更改搜索控制器中的 uitextfield 颜色?

根据背景颜色更改文本颜色

在按钮悬停时将文本和路径更改为不同颜色