【问题标题】:Multiple console windows from one Win32 console app来自一个 Win32 控制台应用程序的多个控制台窗口
【发布时间】:2012-08-21 09:02:44
【问题描述】:

我在 VS2008 中基于一个空的 Win32 控制台应用程序编写了一个程序,该程序在 Win7 64 位上运行。该程序完全基于菜单,从main.cpp 生成,它仅调用外部函数,这些函数根据用户需求(例如收银员、库存、报告等)引导到其他接口。我想做的是为每个界面提供一个新的控制台窗口。

理想情况下,它会在调用任何其他界面等时关闭主菜单,以在用户完成其功能时关闭,包括在必要时重新打开主菜单。

这样做的基础是我下周开始新学期,用 C++ 深入研究 OOP,我想复习我的文本并完成随着主题进展的顶点项目,以确保我拥有所有的基础知识拍拍。尽管我很想以最聪明、最简单的方式做到这一点,但最好还是坚持本书中提供的有限知识,这些知识只暗示STL,而没有提到像boost 这样的其他库。

当然,我已经搜索过 SO 和其他地方寻找解决方案。我找到了答案,其中大多数都超出了我的严格要求,有些是从头开始构建控制台窗口。虽然从头开始似乎是最有前途的,但它似乎是在处理那些不使用像 VS 这样强大的 IDE 的人,我不知道它是否会导致更多的冲突而不是它的价值,或者它是否甚至可以用于多重性。然而,大多数人给我的印象是这是不可能的。一个例外是将控制台链接到进程。这就是我希望在我的未来!

让我想到这一点的原因是需要清晰地审视每一个事件的转折。起初我试图用void clearScreen(int lines); 之类的基本功能来清除屏幕,但这总是会从底部清除。所以,如果我在下一个界面之前清除屏幕,它仍然在底部。如果我清除它然后接受输入,提示仍然在底部。

如果到目前为止还不清楚。我的问题是:
是否有可能在合理的范围内生成多个与进程相关的控制台窗口,或者是否有一种我不知道的简单方法来操纵主控制台窗口的滚动?
尽管我“需要”保持在传统学习的初级过程的范围内,但除了切换应用程序类型之外,我很乐意听到任何意见。

这更像是一个强迫症问题,而不是任务要求,所以如果付出的努力不值得,那也没关系。

【问题讨论】:

    标签: c++ visual-studio-2008 windows-console


    【解决方案1】:

    没有可移植的方式在控制台窗口中移动光标 - 在 Unix/Linux 中,您可以为此发送终端代码,在 Windows 中我不知道。

    跨平台工作,但速度非常慢且不太好,将是:

    • 逐个字符读取您的输入
    • 记住下一个字符应该出现在屏幕上的什么位置
    • 每次按键后重绘整个屏幕

    如果你想做得更好,你必须转向特定于平台的解决方案,或者找到一个可以为你做这件事的库(就像 Unix 世界中的 ncurses),但我不知道这些是否适合您的要求。

    【讨论】:

      【解决方案2】:

      您可以在 Windows 上使用 SetConsoleCursorPosition 设置光标位置。

      【讨论】:

        【解决方案3】:

        既然您说的是 VS,我认为将自己限制在 Windows 上不是问题。如果是这样,您可以为此使用Windows API

        除此之外,ncurses 似乎至少部分移植到大多数常见平台。

        如果您正在寻找一种在标准 C++ 中执行此操作的方法 - 它不存在。 C++ 甚至不需要运行它的平台有控制台,因此没有控制台操作功能。

        两者都不是很难使用,但如果这真的只是一些学生的东西,你希望从中学到有用的东西,你可能不应该打扰。控制台操作不是您经常拥有或想要做的事情。

        【讨论】:

          【解决方案4】:

          虽然在我最初的问题中可能不清楚,但我一直在寻找在控制台窗口中使用的解决方案。理想情况下,该解决方案至少可以在 Linux 和 Windows 上运行,因为我为学校编写的任何程序都必须在每个程序上编译。这不是一项任务,但学习在那里也有用的东西显然是有利的。

          这是我发现的

          ...感谢 Tim Wei 的解决方案

          void clearScreen()
          {
              #ifdef _WIN32
                  system("cls");
              #else
                  system("clear");
              #endif
          }
          

          这很简单,正是我想要的。该函数清除屏幕并将光标放在控制台窗口的顶部,从而提供一种方法来提供带有变化数据表的静态标题或标题。它还允许简单的基于文本的动画——如果你喜欢那种东西的话。本学期我的控制台应用程序的外观、感觉和一致性都发生了显着变化!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-01-18
            • 2010-11-04
            • 2015-08-23
            • 1970-01-01
            • 1970-01-01
            • 2010-10-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多