如何在不使用第 3 方库的情况下覆盖 Windows 本机 C++ 控制台应用程序中控制台的相同部分?
题
我有一个控制台应用程序需要显示项目的状态,但与其让文本疯狂地滚动,我宁愿看到当前状态不断显示在同一行上。举例来说:
Running... nn% complete
Buffer size: bbbb bytes
应该是输出,其中“nn”是当前完成的百分比,“bbbb”是缓冲区大小,在控制台的同一行上定期更新。
我采用的第一种方法只是在打印新状态之前将正确数量的退格打印到控制台,但这有一个令人讨厌的闪烁,我想摆脱它。我还想坚持使用标准库或 MS 提供的功能 (VC 8),以免为这一简单需求引入另一个依赖项。
其他提示
Joseph、JP 和 CodingTheWheel 都提供了宝贵的帮助。
对于我的简单案例,最直接的方法似乎是基于 编码轮的答案:
// before entering update loop
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO bufferInfo;
GetConsoleScreenBufferInfo(h, &bufferInfo);
// update loop
while (updating)
{
// reset the cursor position to where it was each time
SetConsoleCursorPosition(h, bufferInfo.dwCursorPosition);
//...
// insert combinations of sprintf, printf, etc. here
//...
}
对于更复杂的问题,完整的 控制台API 由提供 JP的回答, ,与通过提供的示例相协调 关联 从 约瑟夫的回答 可能有用,但我发现使用所需的工作 CHAR_INFO
对于这样一个简单的应用程序来说太乏味了。
如果您使用 进行打印并且不使用会生成换行符或在末尾添加 的函数,则光标将返回到行的开头并仅打印您输入的下一个内容。在打印之前生成完整的字符串也可能会减少闪烁。
更新: :问题已更改为 2 行输出,而不是 1 行,这使得我的答案不再完整。可能需要更复杂的方法。JP 的想法是正确的 控制台API. 。我相信以下网站详细介绍了您实现目标所需的许多事情。该网站还提到,减少闪烁的关键是在显示之前将所有内容渲染到屏幕外。每当您在屏幕上显示任何内容时,无论是文本还是图形(2D 或 3D),都是如此。
如果 Joseph 的建议没有给您足够的灵活性,请查看控制台 API: http://msdn.microsoft.com/en-us/library/ms682073(VS.85).aspx.
在 Linux 中,您可以通过将 \b 和/或 打印到 stderr 来完成此操作。您可能需要尝试在 Windows 中找到正确的组合。