【问题标题】:How to colorize console background with COLOREF RGB code?如何使用 COLOR RGB 代码为控制台背景着色?
【发布时间】:2021-10-31 11:56:20
【问题描述】:

在这里我问你:我们应该如何仅使用COLOREF 数据类型作为参数为控制台背景着色?

最常见的背景着色方法是使用windows header函数system("color --")

但是,这种方式是不可能的,我的任务是找出我们是否可以仅使用 COLOREF 数据类型为控制台背景着色。

我做了一些研究,发现的是SetConsoleAttribute(),还有windows header函数system("color --")

这是我期望的代码:

COLOREF data = RGB(255, 0, 0);//red, basically

SetConsoleBackground(HDC *console, data);

有什么办法吗?提前致谢。

【问题讨论】:

  • system("color --") 与 Windows API完全无关。现在看来您想使用 "Windows API" (实际上不是 Windows API),同时尝试避免使用 Windows API(甚至没有意识到您 是指的是Windows API)。对于您要做什么以及您有什么要求,事情是完全不透明的。投票结束。
  • @makhan 必须明白,由于system()windows 标头的一部分,他必须假定它是Windows API 的一部分,或者与它相关。 @makhan,编辑您的问题并删除system()WINAPI 的关系
  • 对不起,WINAPIsystem() 之间的关系被误解了,我会编辑我的问题。
  • @ine system 未在 任何 Windows SDK 头文件中声明。

标签: c++ console


【解决方案1】:

[新答案(编辑)] 所以@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");
}

[旧答案] 控制台仅支持用 8 位长的 WORD 定义的 256 种不同颜色组合。背景颜色存储在高 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);
}

【讨论】:

  • 迄今为止的最佳答案。 +代表
  • 但是控制台本身的背景颜色,而不是文本呢?
  • "
  • 这个答案是正确的,十年前。今天,Windows 的控制台supports 24-bit colors。当然,这是“迄今为止的最佳答案”。这也是迄今为止最糟糕的答案。
  • 你可以再说一遍。呵呵
猜你喜欢
  • 2022-01-16
  • 2012-06-15
  • 1970-01-01
  • 2012-08-20
  • 1970-01-01
  • 2017-11-18
  • 2015-05-01
  • 2015-02-27
相关资源
最近更新 更多