代码之家  ›  专栏  ›  技术社区  ›  Patrick Johnmeyer

在不使用第三方库的情况下,如何在Windows本机C++控制台应用程序中重写控制台的相同部分?

  •  13
  • Patrick Johnmeyer  · 技术社区  · 16 年前

    我有一个控制台应用程序需要显示项目的状态,但我宁愿看到当前的状态一直显示在同一行上,而不是像mad一样让文本滚动。为了举例:

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

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

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

    5 回复  |  直到 16 年前
        1
  •  8
  •   user2189331    16 年前

    你可以使用 SetConsoleCursorPosition . 你需要打电话 GetStdHandle 获取输出缓冲区的句柄。

        2
  •  7
  •   Community c0D3l0g1c    7 年前

    约瑟夫、JP和编纂者都提供了宝贵的帮助。

    对于我的简单案例,最直接的方法似乎是基于 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
      //...
    }
    

    对于更复杂的问题, console API 由提供的 JP's answer ,与通过 link Joseph's answer 可能证明有用,但我发现有必要使用 CHAR_INFO 对于这样一个简单的应用程序来说太乏味了。

        3
  •  5
  •   loraderon    16 年前

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

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

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

        4
  •  3
  •   Johannes Passing    16 年前

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

        5
  •  0
  •   Ben Collins    16 年前

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