我正在尝试将win32控制台应用程序的字体颜色分别设置为特定的RGB值,如50,75,90。我已经尝试了SetConsoleTextAttribute()
,但不幸的是,对于R,G或B,似乎只限于0或255.
这是必要的,因为在命令提示符属性窗口中,您可以设置特定颜色,如此
我搜索了很多但似乎唯一的答案是SetConsoleTextAttribute()
。
答案 0 :(得分:15)
您需要使用SetConsoleScreenBufferInfoEx进行设置,请参阅CONSOLE_SCREEN_BUFFER_INFOEX结构的ColorTable条目。
控制台颜色是一个两级过程:控制台属性,前景和背景各有四位(红色,绿色,蓝色和强度),这似乎将颜色限制为基本的主要和次要颜色。但是这些值用作颜色表的索引,以确定实际的显示值。因此,将字符属性“颜色”位视为“逻辑红色”等而不是物理红色。 (字符属性'red'映射到的值默认情况下实际上是RGB红色,但不一定是。)因此,您总是限制为16种索引颜色;但你可以通过ColorTable将它们设置为你想要的16种全RGB颜色。
您在上面的对话框中看到的彩色方块条基本上就是那个颜色表,并按字符属性顺序列出颜色,第一个颜色是“逻辑黑色”,依此类推。
答案 1 :(得分:1)
很抱歉回答迟了一点,但这是您想要的代码:
CONSOLE_SCREEN_BUFFER_INFOEX info;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfoEx(hConsole, &info);
info.ColorTable[0] = RGB(0,0,0);
...
info.ColorTable[3] = RGB(135, 206, 235);
...
info.ColorTable[15] = RGB (25,25,25);
SetConsoleScreenBufferInfoEx(hConsole, &info);
使用此代码,您可以将所有16种索引颜色的颜色值更改为所需的任何RGB颜色。
比起您可以用所需颜色打印行:
SetConsoleTextAttribute(hConsole, 3);
std::cout << "Hello World!" << std::endl;
这是我的输出: My output windows
答案 2 :(得分:0)
有一种方法可以使文本完全是RGB,但如果您制作文本的副本,则需要“SetPixel
”然后可以更改RGB值,这是我为A制作的内容,这很难做,但我正在制作一个.h文件,所以每个人都可以使用它,在这里你去:
void PrintA(int R, int G, int B)
{
HWND myconsole = GetConsoleWindow();
HDC mydc = GetDC(myconsole);
SetPixel(mydc, i + 0, i2 + 3, RGB(R, G, B));
SetPixel(mydc, i + 0, i2 + 4, RGB(R, G, B));
SetPixel(mydc, i + 0, i2 + 5, RGB(R, G, B));
SetPixel(mydc, i + 0, i2 + 6, RGB(R, G, B));
SetPixel(mydc, i + 0, i2 + 7, RGB(R, G, B));
SetPixel(mydc, i + 0, i2 + 8, RGB(R, G, B));
SetPixel(mydc, i + 0, i2 + 9, RGB(R, G, B));
SetPixel(mydc, i + 1, i2 + 2, RGB(R, G, B));
SetPixel(mydc, i + 1, i2 + 3, RGB(R, G, B));
SetPixel(mydc, i + 1, i2 + 4, RGB(R, G, B));
SetPixel(mydc, i + 1, i2 + 5, RGB(R, G, B));
SetPixel(mydc, i + 1, i2 + 6, RGB(R, G, B));
SetPixel(mydc, i + 1, i2 + 7, RGB(R, G, B));
SetPixel(mydc, i + 1, i2 + 8, RGB(R, G, B));
SetPixel(mydc, i + 1, i2 + 9, RGB(R, G, B));
SetPixel(mydc, i + 2, i2 + 1, RGB(R, G, B));
SetPixel(mydc, i + 2, i2 + 2, RGB(R, G, B));
SetPixel(mydc, i + 2, i2 + 6, RGB(R, G, B));
SetPixel(mydc, i + 3, i2 + 1, RGB(R, G, B));
SetPixel(mydc, i + 3, i2 + 2, RGB(R, G, B));
SetPixel(mydc, i + 3, i2 + 6, RGB(R, G, B));
SetPixel(mydc, i + 4, i2 + 2, RGB(R, G, B));
SetPixel(mydc, i + 4, i2 + 3, RGB(R, G, B));
SetPixel(mydc, i + 4, i2 + 4, RGB(R, G, B));
SetPixel(mydc, i + 4, i2 + 5, RGB(R, G, B));
SetPixel(mydc, i + 4, i2 + 6, RGB(R, G, B));
SetPixel(mydc, i + 4, i2 + 7, RGB(R, G, B));
SetPixel(mydc, i + 4, i2 + 8, RGB(R, G, B));
SetPixel(mydc, i + 4, i2 + 9, RGB(R, G, B));
SetPixel(mydc, i + 5, i2 + 3, RGB(R, G, B));
SetPixel(mydc, i + 5, i2 + 4, RGB(R, G, B));
SetPixel(mydc, i + 5, i2 + 5, RGB(R, G, B));
SetPixel(mydc, i + 5, i2 + 6, RGB(R, G, B));
SetPixel(mydc, i + 5, i2 + 7, RGB(R, G, B));
SetPixel(mydc, i + 5, i2 + 8, RGB(R, G, B));
SetPixel(mydc, i + 5, i2 + 9, RGB(R, G, B));
i += 8;
if (i / 80 == 8)
{
i = 0;
i2 += 12;
}
}