SetConsoleTextAttribute:仅限前景

时间:2012-05-05 16:00:34

标签: c++

我想更改控制台应用程序的前景色文本,而不是背景文本颜色和控制台背景颜色。换句话说:我希望保留以前的颜色,除了前景文字颜色。

目前我使用下面的代码,但文本背景也会改变。

#include <windows.h>
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{

    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
    cout << "green?" << endl;
    cin.ignore();
    return 0;
}

2 个答案:

答案 0 :(得分:2)

使用GetConsoleScreenBufferInfoEx检索当前颜色属性,并仅更改前景。

以下(尽管未经测试)无论您从哪种背景颜色开始都应该有效:

HANDLE outputHandle = GetStdHandle (STD_OUTPUT_HANDLE); //used twice
CONSOLE_SCREEN_BUFFER_INFOEX cbie; //hold info

//article didn't say this was necessary, but to be on the safe side...
cbie.cbSize = sizeof (CONSOLE_SCREEN_BUFFER_INFOEX);

GetConsoleScreenBufferInfoEx (outputHandle, &cbie); //get info

//first, cancel out all foreground attributes
//then, set the ones you want (I use bright red)
cbie.wAttributes &= 
    ~(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
cbie.wAttributes |= (FOREGROUND_RED | FOREGROUND_INTENSITY);

SetConsoleScreenBufferInfoEx (outputHandle, &cbie); //pass updated info back

答案 1 :(得分:1)

同样设置背景颜色(否则会变为黑色) 例如: 红色背景上的绿色写作(注意:使用按位OR运算符|)

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | BACKGROUND_RED);