【问题标题】:C++ The whole line is colored when it shouldn't beC ++整行不应该被着色
【发布时间】:2016-04-05 19:12:30
【问题描述】:

我正在使用 Windows。我设法将问题简化为这个。

#include<iostream>
#include<conio.h>
#include<windows.h>
using namespace std;
int main()
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),23);
    for (int i=0;i<400;++i)
    {
        cout<<i<<'\n';
    }
    cout.flush();
    getch();
    return 0;
}

它应该只为文本和整行着色,但在第 300 行之后,整行被着色,而不仅仅是文本。使用 '\n' 和 endl 之间似乎没有任何区别。此外,文本是什么或者我是否多次更改颜色都无关紧要,只是行数。我也尝试过使用 printf,但它也没有什么不同。

这是截图:

任何想法为什么会这样做以及我该如何解决?

【问题讨论】:

  • 仅供参考,不要使用“幻数”,它会使代码更难理解。传递给SetConsoleTextAttribute() 的值23 对应于传递以下标志:FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | BACKGROUND_BLUE,这些标志在wincon.h 中定义。
  • @RemyLebeau 是的,那只是为了测试,通常我不会那样做。顺便说一句,我刚刚注意到颜色的代码是这样设置的,这样你就可以像用光一样混合它们并得到正确的结果。

标签: c++ windows colors printf cout


【解决方案1】:

问题在于您的循环输出的数据多于控制台的屏幕缓冲区可以容纳的数据。初始缓冲区包含 300 行。当您的循环输出超出该初始缓冲区的末尾时,旧内容将被丢弃,并且显然新内容现在继承了丢弃开始之前最后一个输出的特征。未写入缓冲单元的颜色最初为黑色,但在缓冲区开始滚动后变为蓝色。

您可以使用GetConsoleScreenBufferInfo() 检索初始缓冲区大小,然后使用SetConsoleScreenBufferSize() 增加缓冲区中的行数。如果您将行数设置为 401+,您将不会再看到蓝色填充整行(假设您的应用开始运行时屏幕上还没有显示任何内容)。

HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

CONSOLE_SCREEN_BUFFER_INFO info = {0};
GetConsoleScreenBufferInfo(hConsole, &info);
info.dwSize.Y = 401;
SetConsoleScreenBufferSize(hConsole, info.dwSize);
SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | BACKGROUND_BLUE);

for (int i=0;i<400;++i)
{
    cout<<i<<'\n';
}
cout.flush();

【讨论】:

  • 谢谢!还有没有办法改变控制台窗口的大小?
  • SetConsoleWindowInfo(): "设置控制台屏幕缓冲区窗口的当前大小和位置。"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多