如何使用 COLOR RGB 代码为控制台背景着色?
How to colorize console background with COLOREF RGB code?
在这里我问你:我们应该如何仅使用 COLOREF
数据类型作为参数来为控制台背景着色?
最常用的背景着色方法是使用 windows header
函数 system("color --")
但是,这种方法是行不通的,我的任务是找出我们是否可以仅使用 COLOREF
数据类型来为控制台背景着色。
我做了一些研究,我遇到的是 SetConsoleAttribute()
,windows header
函数 system("color --")
。
我希望我的代码是这样的:
COLOREF data = RGB(255, 0, 0);//red, basically
SetConsoleBackground(HDC *console, data);
有什么办法吗?提前致谢。
[新答案(编辑)]
所以@IInspectable 指出控制台现在支持 24 位全 rgb 颜色,所以我做了一些研究并设法让它工作。
我就是这样解决的:
#include <Windows.h>
#include <string>
struct Color
{
int r;
int g;
int b;
};
void SetBackgroundColor(const Color& aColor)
{
std::string modifier = "\x1b[48;2;" + std::to_string(aColor.r) + ";" + std::to_string(aColor.g) + ";" + std::to_string(aColor.b) + "m";
printf(modifier.c_str());
}
void SetForegroundColor(const Color& aColor)
{
std::string modifier = "\x1b[38;2;" + std::to_string(aColor.r) + ";" + std::to_string(aColor.g) + ";" + std::to_string(aColor.b) + "m";
printf(modifier.c_str());
}
int main()
{
// Set output mode to handle virtual terminal sequences
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD dwMode = 0;
GetConsoleMode(hOut, &dwMode);
dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
SetConsoleMode(hOut, dwMode);
SetForegroundColor({ 100,100,20 });
SetBackgroundColor({ 50,100,10 });
printf("Hello World\n");
system("pause");
}
[旧答案]
控制台只支持 256 种不同的颜色组合,用一个 8 位长的 WORD 定义。背景颜色存储在高 4 位中。这意味着控制台仅支持 16 种不同的颜色:
enum class Color : int
{
Black = 0,
DarkBlue = 1,
DarkGreen = 2,
DarkCyan = 3,
DarkRed = 4,
DarkPurple = 5,
DarkYellow = 6,
DarkWhite = 7,
Gray = 8,
Blue = 9,
Green = 10,
Cyan = 11,
Red = 12,
Purple = 13,
Yellow = 14,
White = 15,
};
要设置输入字符的背景颜色,您可以这样做:
void SetWriteColor(const Color& aColor)
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, static_cast<WORD>(aColor) << 4);
}
在这里我问你:我们应该如何仅使用 COLOREF
数据类型作为参数来为控制台背景着色?
最常用的背景着色方法是使用 windows header
函数 system("color --")
但是,这种方法是行不通的,我的任务是找出我们是否可以仅使用 COLOREF
数据类型来为控制台背景着色。
我做了一些研究,我遇到的是 SetConsoleAttribute()
,windows header
函数 system("color --")
。
我希望我的代码是这样的:
COLOREF data = RGB(255, 0, 0);//red, basically
SetConsoleBackground(HDC *console, data);
有什么办法吗?提前致谢。
[新答案(编辑)] 所以@IInspectable 指出控制台现在支持 24 位全 rgb 颜色,所以我做了一些研究并设法让它工作。 我就是这样解决的:
#include <Windows.h>
#include <string>
struct Color
{
int r;
int g;
int b;
};
void SetBackgroundColor(const Color& aColor)
{
std::string modifier = "\x1b[48;2;" + std::to_string(aColor.r) + ";" + std::to_string(aColor.g) + ";" + std::to_string(aColor.b) + "m";
printf(modifier.c_str());
}
void SetForegroundColor(const Color& aColor)
{
std::string modifier = "\x1b[38;2;" + std::to_string(aColor.r) + ";" + std::to_string(aColor.g) + ";" + std::to_string(aColor.b) + "m";
printf(modifier.c_str());
}
int main()
{
// Set output mode to handle virtual terminal sequences
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD dwMode = 0;
GetConsoleMode(hOut, &dwMode);
dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
SetConsoleMode(hOut, dwMode);
SetForegroundColor({ 100,100,20 });
SetBackgroundColor({ 50,100,10 });
printf("Hello World\n");
system("pause");
}
[旧答案] 控制台只支持 256 种不同的颜色组合,用一个 8 位长的 WORD 定义。背景颜色存储在高 4 位中。这意味着控制台仅支持 16 种不同的颜色:
enum class Color : int
{
Black = 0,
DarkBlue = 1,
DarkGreen = 2,
DarkCyan = 3,
DarkRed = 4,
DarkPurple = 5,
DarkYellow = 6,
DarkWhite = 7,
Gray = 8,
Blue = 9,
Green = 10,
Cyan = 11,
Red = 12,
Purple = 13,
Yellow = 14,
White = 15,
};
要设置输入字符的背景颜色,您可以这样做:
void SetWriteColor(const Color& aColor)
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, static_cast<WORD>(aColor) << 4);
}