【问题标题】:RGB Specific Console Text Color C++RGB 特定控制台文本颜色 C++
【发布时间】:2012-03-19 12:55:26
【问题描述】:

我正在尝试将 win32 控制台应用程序的字体颜色设置为特定的 RGB 值,例如分别为 50、75、90。我已经尝试过SetConsoleTextAttribute(),但不幸的是它似乎限制为 R、G 或 B 的 0 或 255。

这必须是可能的,因为在命令提示符属性窗口中你可以设置特定的颜色,像这样

我搜索了很多,但似乎唯一的答案是SetConsoleTextAttribute()

【问题讨论】:

  • 红、绿、蓝颜色实际上在 0 到 255 的范围内。任何颜色都是 3 个八位的组合。另请参阅 - service.real.com/help/library/guides/realone/ProductionGuide/…
  • 你有没有看我的问题?
  • 当然。绝对不清楚您的问题到底是什么。你有位掩码,你有一个函数 - 调用它并让你的控制台充满颜色。
  • @Vlad;没那么简单:Win32 控制台使用了一个具有 4 位索引的颜色表,您不能只将任何字符设置为任何 RBG 值。这确实是关于 Win32 功能/怪癖/限制的问题,而不是关于 RGB 值如何工作的问题,这可能是 OP 认为您的回复没有用的原因。

标签: c++ windows winapi


【解决方案1】:

您需要使用SetConsoleScreenBufferInfoEx 进行设置,请参阅CONSOLE_SCREEN_BUFFER_INFOEX 结构的ColorTable 条目。

控制台颜色是一个两级过程:有控制台属性,前景和背景各有四位(红色、绿色、蓝色和强度),这似乎将颜色限制为基本的原色和次要颜色。但是这些值被用作颜色表的索引,以确定实际显示值。因此,将字符属性“颜色”位视为“逻辑红色”等,而不是物理红色。 (默认情况下,Character Attribute 'red' 映射到的值实际上是 RGB 红色,但并非必须如此。)因此,您始终被限制为 16 种索引颜色;但是您可以通过 ColorTable 将它们设置为您想要的任何 16 种全 RGB 颜色。

您在上面的对话框中看到的彩色方块条基本上就是那个颜色表,并按照字符属性顺序列出颜色,第一个 suqare 是“逻辑黑色”,依此类推。

【讨论】:

  • 哇,很好的解释。谢谢你!你摇滚。
【解决方案2】:

抱歉回答得有点晚了,但这里是您想要的代码:

CONSOLE_SCREEN_BUFFER_INFOEX info;
info.cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX);

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

【讨论】:

  • 谢谢,太好了。你知道如何将它与背景颜色一起使用吗?这似乎只适用于前色?
  • @DavidLedger info.ColorTable[0] 是背景的颜色值
【解决方案3】:

有一种方法可以使文本完全为 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;
    }
}

【讨论】:

  • 您不能在不属于您的窗口上进行渲染。使用最慢的方法也无济于事。也不会泄露设备上下文。
猜你喜欢
  • 2013-06-25
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 2020-10-06
  • 2013-06-12
  • 2012-12-27
  • 2016-03-04
  • 2014-09-06
相关资源
最近更新 更多