将C++控制台文本颜色设置为RGB值

3

我想将控制台的文本颜色设置为RGB颜色。我创建了一个函数来获取控制台的ColorTable并更改其中的颜色,但它不起作用。我不知道如何将文本颜色设置为颜色表中的值,所以我只更改了整个颜色表,但这没有任何效果。

void setColor(int r, int g, int b)
{
    COLORREF cr;
    cr = RGB(r, g, b);
    PCONSOLE_SCREEN_BUFFER_INFOEX ci;
    CONSOLE_SCREEN_BUFFER_INFOEX cir;
    ci = ○
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfoEx(hConsole , ci);
    cout <<hex<< ci->ColorTable[2];
    for(int i=0;i<16;i++){
            ci->ColorTable[i] = cr;
    }
    SetConsoleScreenBufferInfoEx(hConsole, ci);

    GetConsoleScreenBufferInfoEx(hConsole , ci);

    cout <<endl <<  ci->ColorTable[2];
}

main() 中,我多次调用该函数,但每次调用的输出都相同且颜色不会改变。 SetConsoleScreenBufferInfoEx()GetConsoleScreenBufferInfoEx()似乎没有任何作用,当它们被调用时,ci保持不变。
你做错了什么?
此外,如果它起作用,我假设背景颜色也会改变,因为我改变了整个调色板,那么如何将文本颜色设置为来自颜色表的特定值,例如我在changeColor()函数中放置 ci->ColorTable [2] = cr; 而不是for循环,如何将文本颜色设置为现在存储在ColorTable [2]中的颜色?

我不确定这是否有用,但你可以看一下相关的问题:https://dev59.com/5F3Va4cB1Zd3GeqPCqyN和https://dev59.com/82855IYBdhLWcg3w-JXR。 - Daniel Daranas
2个回答

5

谢谢,但是这个函数不能使用RGB颜色。我刚刚找到了这个问题的链接https://dev59.com/ymkw5IYBdhLWcg3w_fiJ,接受的答案告诉我要修改颜色表,就像我尝试做的那样,然后通过`SetConsoleTextAttribute`从颜色表中选择颜色(如果我理解正确的话)。然而,我没有成功修改颜色表。 - user1950929
你有检查过SetConsoleScreenBufferInfoEx的返回值吗?看看它是否成功了?如果失败了,你有调用过GetLastError吗? - Mgetz
刚刚测试了一下,getlastError() 返回的是 0x57,对于 SetConsoleScreenBufferInfoExGetConsoleScreenBufferInfoEx 来说,这个错误代码代表的是 ERROR_INVALID_PARAMETER。有没有什么想法为什么参数会无效?也许我使用的句柄不正确? - user1950929
不,你忘了设置传入的CONSOLE_SCREEN_BUFFER_INFOEX结构体的cbSize成员。 - Mgetz
谢谢,现在可以工作了。我猜一次只能有16种不同的颜色,对吗? - user1950929
根据结构定义,是的,看起来确实是这种情况。 - Mgetz

4
一张 Windows 控制台颜色表如下所示:
Color            Background Foreground
---------------------------------------------
Black            0           0
Blue             1           1
Green            2           2
Cyan             3           3
Red                  4           4
Magenta          5           5
Brown            6           6
White            7           7
Gray             -           8
Intense Blue     -           9
Intense Green    -           10
Intense Cyan     -           11
Intense Red          -           12
Intense Magenta  -           13
Yellow           -           14
Intense White    -               15

为设置背景颜色,你需要使用以下公式将前景色代码与背景色代码结合起来:
finalcolor = (16*backgroundcolor) + foregroundcolor

如果您想设置具有蓝色背景和白色文本的文本颜色,只需在表格中查找颜色代码。蓝色为1,白色为15;因此,int backgroundcolor=1;int foregroundcolor=15;
#include <windows.h>
#include <iostream> 
using namespace std;

void setcolor(int color)
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color);
    return;
}

int main()
{

    int foregroundcolor=15;
    int backgroundcolor=1;
    int finalcolor;

    finalcolor=(16*backgroundcolor)+foregroundcolor;

    setcolor(finalcolor);
    cout<<"finalcolor=(16*backgroundcolor)+foregroundcolor\n";
    setcolor(7);

    return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接