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

时间:2013-06-27 16:09:09

标签: c++ winapi console-application

我想将控制台的文本颜色设置为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在被调用时保持不变。

我做错了什么?

此外,如果它有效,我认为背景颜色也会因为我改变整个调色板而改变,所以如何将颜色表中的文本颜色设置为特定值,例如我将ci->ColorTable[2] = cr;放在changeColor()函数而不是for循环中,如何将文本颜色设置为现在存储在ColorTable[2]中的颜色?

2 个答案:

答案 0 :(得分:3)

您需要使用SetConsoleTextAttribute设置当前文字颜色和背景颜色,有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/ms686047(v=vs.85).aspx

答案 1 :(得分:3)

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;
}