【问题标题】:How can I overwrite the same portion of the console in a Windows native C++ console app, without using a 3rd Party library?如何在不使用 3rd 方库的情况下覆盖 Windows 本机 C++ 控制台应用程序中控制台的相同部分?
【发布时间】:2010-09-07 21:36:06
【问题描述】:

我有一个控制台应用程序需要显示项目的状态,但与其疯狂地滚动文本,我宁愿看到当前状态一直显示在同一行上。举个例子:

Running... nn% complete
Buffer size: bbbb bytes

应该是输出,其中“nn”是当前完成百分比,“bbbb”是缓冲区大小,在控制台的同一行上定期更新。

我采用的第一种方法只是在打印新状态之前将正确数量的退格键打印到控制台,但这有一个令人讨厌的闪烁,我想摆脱它。我还想坚持使用标准库或 MS 提供的功能 (VC 8),以免为这个简单的需求引入另一个依赖项。

【问题讨论】:

    标签: c++ windows console


    【解决方案1】:

    在 Linux 中,您可以通过将 \b 和/或 \r 打印到 stderr 来完成此操作。您可能需要尝试在 Windows 中找到正确的组合。

    【讨论】:

      【解决方案2】:

      如果您使用 \r 打印并且不使用会生成换行符或在末尾添加 \n 的函数,则光标将返回到行首并仅在您放置的下一个内容上打印.在打印之前生成完整的字符串也可以减少闪烁。

      更新:问题已更改为 2 行输出而不是 1 行,这使我的答案不再完整。可能需要更复杂的方法。 JP 对Console API 有正确的想法。我相信以下网站详细介绍了您实现目标所需的许多事情。该网站还提到减少闪烁的关键是在显示之前将所有内容渲染到屏幕外。当您在屏幕上显示任何内容时,无论是文本还是图形(2D 或 3D)都是如此。

      http://www.benryves.com/tutorials/?t=winconsole

      【讨论】:

        【解决方案3】:

        您可以使用SetConsoleCursorPosition。您需要调用 GetStdHandle 来获取输出缓冲区的句柄。

        【讨论】:

        • 有关更多详细信息,请参阅我的答案,但对于我的简单情况,这是最简单的方法。
        【解决方案4】:

        如果 Joseph 的建议没有给您足够的灵活性,请查看控制台 API:http://msdn.microsoft.com/en-us/library/ms682073(VS.85).aspx

        【讨论】:

          【解决方案5】:

          Joseph、JP 和 CodingTheWheel 都提供了宝贵的帮助。

          对于我的简单案例,最直接的方法似乎是基于CodingTheWheel's answer

          // 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
            //...
          }
          

          对于更复杂的问题,JP's answer 提供的完整console APIJoseph's answer 中通过link 提供的示例相协调可能会很有用,但我发现使用CHAR_INFO 需要做的工作对于这么简单的应用来说太乏味了。

          【讨论】:

            猜你喜欢
            • 2010-10-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-24
            相关资源
            最近更新 更多