C++ SetConsoleTextAttribute:仅前景

C++ SetConsoleTextAttribute:仅前景,c++,C++,我只想更改控制台应用程序的前景色文本,而不是背景文本颜色或控制台背景颜色。换句话说:除了前景文本颜色外,我想保持以前的颜色不变 目前,我使用下面的代码,但文本下的背景也发生了变化 #include <windows.h> #include <iostream> using namespace std; int main(int argc, char* argv[]) { SetConsoleTextAttribute(GetStdHandle(STD_OUTP

我只想更改控制台应用程序的前景色文本,而不是背景文本颜色或控制台背景颜色。换句话说:除了前景文本颜色外,我想保持以前的颜色不变

目前,我使用下面的代码,但文本下的背景也发生了变化

#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;
}
#包括
#包括
使用名称空间std;
int main(int argc,char*argv[])
{
SetConsoleTextAttribute(GetStdHandle(标准输出句柄),前景绿色);

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


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


使用
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

使用
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

您将背景更改为黑色。您需要同时指定两者,因此也要使用现有的背景色。正如chris所暗示的。您将背景更改为黑色。您需要同时指定两者,因此也要使用现有的背景色。正如chris所暗示的。
GetConsoleScreenBufferInfoEx
确实需要您设置
cbSize=sizeof(控制台屏幕缓冲区INFOEX)
;否则
SetConsoleScreenBufferInfoEx
会失败。我猜
GetConsoleScreenBufferInfoEx
也会失败。我试图按照您的代码进行操作;所有调用都表明没有错误,但我的输出没有颜色。有什么想法吗?@JulianKirsch,我没有任何即时想法。您可以通过显示错误检查和您获得的结果并链接回此处以显示您已尝试搜索。
GetConsoleScreenBufferInfoEx
确实需要您设置
cbSize=sizeof(控制台屏幕缓冲区INFOEX)
;否则
SetConsoleScreenBufferInfoEx
会失败。我猜
GetConsoleScreenBufferInfoEx
也会失败。我试图按照您的代码进行操作;所有调用都表明没有错误,但我的输出没有颜色。有什么想法吗?@JulianKirsch,我没有任何即时想法。您可以通过显示错误检查和您获得的结果并链接回此处,以显示您已尝试搜索。