2013-06-27 66 views
1

我想将控制台的文本颜色设置为RGB颜色。 我创建了一个函数来获取控制台的ColorTable并更改其中的颜色,但它不起作用。我不知道如何将文本颜色设置为颜色表中的值,所以我只是更改整个颜色表,但它什么都不做。C++将控制台文本颜色设置为RGB值

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]中的颜色?

+0

我不知道这是否是有用的,但你可以看看相关的问题http://stackoverflow.com/questions/8285825/how-to-change -text-or-background-color-in-a-windows-console-application和http://stackoverflow.com/questions/4053837/c-colors-in-console-different-colors-in-different-text。 –

回答

3

您需要使用SetConsoleTextAttribute来设置当前的文字颜色和背景颜色,详见http://msdn.microsoft.com/en-us/library/windows/desktop/ms686047(v=vs.85).aspx

+0

谢谢,但有了这个功能,我没有RGB颜色。我刚刚发现这个问题http://stackoverflow.com/questions/9509278/rgb-specific-console-text-color-c,接受的答案告诉修改颜色表就像我试图做的,然后选择颜色从颜色表通过'SetConsoleTextAttribue'(如果我理解正确)。但是我没有修改颜色表。 – user1950929

+0

你检查过'SetConsoleScreenBufferInfoEx'的返回值吗?看看它是否成功?如果失败了,就调用GetLastError? – Mgetz

+0

刚刚测试,'getlastError()'返回'0x57',对于'SetConsoleScreenBufferInfoEx'和'GetConsoleScreenBufferInfoEx'都是'ERROR_INVALID_PARAMETER'。任何想法为什么参数可能无效?也许我在使用错误的句柄? – user1950929

2

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