wxWidgets GUI + 控制台/模拟控制台 (wxTextCtrl?)

3
我有一个wxWidgets GUI程序,我想为它附加一个标准的控制台窗口,以便stdout等输出到其中。
如果有人知道如何实现这个(一个GUI应用程序和一个控制台窗口),那就太好了。但是,从搜索结果来看,我怀疑这不是直接可能的。
根据这个相似的帖子,我得出的印象是可以在单独的wxFrame中使用wxTextCtrl模拟它。如果这是一种好方法,是否有任何已经完成的示例?还有其他方法可以实现这一点吗?
编辑:我想要一个控制台窗口(或者至少尽可能地模拟它)--因此,黑色背景,白色字符,固定宽度字体等。
2个回答

1

您可以使用wxStreamToTextRedirector将例如std::cout重定向到wxTextCtrl,但它并不能真正替代Windows下的真实控制台或Unix下的PTY,因为只有通过std::cout输出的文本才会被重定向,而不是使用printf()或任何其他函数打印的任何内容。如果您需要后者,则需要执行特定于平台的操作,在这种情况下,您应该告诉我们您正在使用哪些平台以及您需要做什么。


是的,我确实需要printf(...)。实际上,我想做的是创建一个“控制台”,它尽可能地与非GUI程序中提供的控制台无法区分。 - geometrian
1
为此,您需要在 Windows 下使用普通控制台,无法模拟它。只需在链接时将应用程序设置为控制台应用程序(/subsystem:console),并且不要从控制台分离。请注意,在“控制台”应用程序中仍然可以毫无问题地使用 GUI 类。 - VZ.
当在控制台模式下创建时,我总是得到“未解析的外部符号 _main”? - geometrian
1
可以使用IMPLEMENT_APP_CONSOLE代替普通的IMPLEMENT_APP,或者更好的方法是告诉链接器使用WinMain()作为入口点,即使它是一个控制台应用程序,使用/ENTRY链接器选项。 - VZ.
我在toplevel.cpp的第495行收到了访问冲突错误。我认为问题在于wxTheApp被定义为:#define wxTheApp static_cast<wxApp*>(wxApp::GetInstance()),而不是wxAppConsole。使用/ENTRY会导致大量的LNK4210错误,然后是CRT无效的堆断言错误。 - geometrian
显示剩余2条评论

1

我建议从stdout升级到wxWidgets日志类,这些类更加灵活。这里是概述。


有没有使用这些类来模拟控制台的示例? - geometrian
一些示例应用程序使用日志记录类。它们不会“模拟”控制台 - 关键是它们比控制台更好、更灵活。通过仔细使用样式、背景颜色和字体,您可以使日志窗口看起来像控制台一样。 - ravenspoint
通过使用wxLogWindow,我能够让一些东西工作起来,但是我找不到一种方法来自定义它的外观,使其看起来像控制台。 - geometrian
你知道如何通过使用样式、背景颜色和字体来改变 wxWidgets 窗口的外观吗?然后,你可以在 wxLogWindow 实例上调用方法,或者子类化 wxLogWindow 并在新构造函数中调用方法。 - ravenspoint

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接