在 Windows 中使用 C++ 的颜色控制台输出
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/9262270/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Color console output with C++ in Windows
提问by Rakosman
Is there a way to output colored text to the console? I am using Visual Studio 2010, and only need the code to work in Windows.
有没有办法将彩色文本输出到控制台?我使用的是 Visual Studio 2010,只需要代码即可在 Windows 中工作。
I have been unsuccessful in finding anything except the windows COLOR command, but that changed the color for the entire screen, and I am looking for something that will change only the part I wish to output. I've seen it done in Managed C++
除了 windows COLOR 命令之外,我一直没有找到任何东西,但这改变了整个屏幕的颜色,我正在寻找只会改变我希望输出的部分的东西。我已经看到它在托管 C++ 中完成
E.g.,
例如,
{color red}
cout << "Hello ";
{color blue}
cout << "world\n";
would yield "Hello world" in red and blue.
将产生红色和蓝色的“Hello world”。
回答by INS
I took this code from here:
我从这里拿了这个代码:
// color your text in Windows console mode
// colors are 0=black 1=blue 2=green and so on to 15=white
// colorattribute = foreground + background * 16
// to get red text on yellow use 4 + 14*16 = 228
// light red on yellow would be 12 + 14*16 = 236
// a Dev-C++ tested console application by vegaseat 07nov2004
#include <iostream>
#include <windows.h> // WinApi header
using namespace std; // std::cout, std::cin
int main()
{
HANDLE hConsole;
int k;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
// you can loop k higher to see more color choices
for(k = 1; k < 255; k++)
{
// pick the colorattribute k you want
SetConsoleTextAttribute(hConsole, k);
cout << k << " I want to be nice today!" << endl;
}
cin.get(); // wait
return 0;
}
回答by jrebacz
Coloring C++ output in Windows is done through SetConsoleTextAttribute, where the HANDLE of the console passed in along with attributes. However, calling SetConsoleTextAttribute is cumbersome. Fortunately, there are lots of small libraries on the internet and github that can assist, you should just pick one with an API you like. If you want to change colors with operator<<, I recommend this header-only library https://github.com/ikalnitsky/termcolor. The api looks like this:
Windows 中的 C++ 输出着色是通过 SetConsoleTextAttribute 完成的,其中控制台的 HANDLE 与属性一起传入。但是,调用 SetConsoleTextAttribute 很麻烦。幸运的是,互联网和 github 上有很多小型库可以提供帮助,您应该选择一个带有您喜欢的 API 的库。如果你想用 operator<< 改变颜色,我推荐这个只有头文件的库https://github.com/ikalnitsky/termcolor。api 看起来像这样:
using namespace termcolor;
std::cout << grey << "grey message" << reset << std::endl;
std::cout << red << "red message" << reset << std::endl;
If having to reset the color turns you off, try my library. It's header-only too, Windows only, and it lets you color printf statements easily: https://github.com/jrebacz/colorwin. The api looks like this:
如果不得不重置颜色会让你失望,试试我的图书馆。它也是仅限标题,仅限 Windows,它可以让您轻松地为 printf 语句着色:https: //github.com/jrebacz/colorwin。api 看起来像这样:
using namepsace wincolor;
std::cout << color(gray) << "grey message\n";
std::cout << color(red) << "red message\n";
std::cout << "normal color\n";
{
withcolor scoped(red);
std::cout << "|red\n";
std::cout << "|red again\n";
}
std::cout << "normal color\n";
withcolor(cyan).printf("A cyan printf of %d\n", 1234);
回答by Michael Haephrati
Here is our in house solution:
这是我们的内部解决方案:
inline void setcolor(int textcol, int backcol)
{
if ((textcol % 16) == (backcol % 16))textcol++;
textcol %= 16; backcol %= 16;
unsigned short wAttributes = ((unsigned)backcol << 4) | (unsigned)textcol;
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbi;
SetConsoleTextAttribute(hStdOut, wAttributes);
}
and here are examples of colors to choose from:
以下是可供选择的颜色示例:
#define LOG_COLOR_WHITE 7
#define COLOR_GREEN 10
#define COLOR_YELLOW 14
#define COLOR_MAGENTA 13
回答by ddacot
You can use the system("") command, which is used like that:
您可以使用 system("") 命令,其用法如下:
cout<<"lol";
system("color 1") // the colours are from 1 to 15.
cout<<"Coloured text! yay";