2

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

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

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

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

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

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

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

4

4 回答 4

4

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

什么可以跨平台工作,但是非常慢而且不太好,将是:

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

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

于 2012-08-21T09:13:45.363 回答
3

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

于 2012-08-21T09:17:41.427 回答
1

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

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

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

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

于 2012-08-21T10:05:37.517 回答
1

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

这是我发现的

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

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

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

于 2013-01-06T02:22:12.943 回答