【问题标题】:SetConsoleTextAttribute : Foreground onlySetConsoleTextAttribute : 仅前台
【发布时间】:2012-05-05 16:00:33
【问题描述】:

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

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

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

【问题讨论】:

  • 您将背景更改为黑色。您需要同时指定两者,因此也要使用现有的背景颜色。正如克里斯暗示的那样。

标签: c++


【解决方案1】:

使用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 确实需要您设置 cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX);否则SetConsoleScreenBufferInfoEx 失败。我猜GetConsoleScreenBufferInfoEx 也失败了。我试图遵循您的代码;所有调用都表明没有错误,但我的输出没有着色。有什么想法吗?
  • @JulianKirsch,我没有任何直接的想法。您可以使用 minimal reproducible example 提出一个新问题,其中显示错误检查和您获得的结果并返回此处以显示您已尝试搜索。
【解决方案2】:

也设置背景颜色(否则会变成黑色) 例如: 红色背景上的绿色书写(注意:使用按位或运算符 | )

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    相关资源
    最近更新 更多