我正在编写一个编辑器,但我遇到了一个问题,这意味着从我的 opengl 应用程序调用本机文件保存/打开对话框。编辑器是用我在游戏中的 opengl gui 编写的。所以我想出了一个想法,当用户按下“加载”或“保存”时,我将创建一个线程,该线程将创建所需的(不可见的)wx 窗口,它将调用 wxFileDialog 并在工作完成后删除该线程. 从opengl应用程序以跨平台方式访问文件打开/保存对话框是否有可能或者有更好的方法?
3 回答
wxWidget 有一个 OpenGL 小部件。将您的 OpenGL 内容放入其中,将小部件接收到的事件转发到您的 GUI 系统,然后您就不必为事件循环而战了。
如果您使用的是 GLUT 或等效的,那么您没有跨平台框架。如果您想要一个跨平台的应用程序,那么您将不得不选择一个框架(例如 wxWidgets 或 Qt 或其他)并从那里开始。否则,如果您在 Windows 上,则可以使用对 Windows API 的本机调用,在其他平台上也可以使用等效方法。
GLUT 只给你一个控制台风格的应用程序。如果你想要一个 GUI,那么你必须选择一个 GUI 框架,即使你不想要跨平台。有很多选择,选择主要取决于你最熟悉的。然后,您从您的 GUI 应用程序中添加对 OpenGL 库的调用,无论是如何构建的。这样,您就不必处理多个线程。
您可能对 GLUT 应用程序进行了大量投资,并且不想仅仅为了获得一些 GUI 功能而放弃它。在这种情况下,我建议构建一个新的 GUI 应用程序,与您的 GLUT 应用程序分开,它使用套接字(或其他进程间通信系统)与您现有的应用程序通信,但在单独的进程中运行。这样您就不会遇到由多线程应用程序创建的所有可怕的、难以修复的错误。
正如其他人已经说过的,最简单的解决方案是将 wxWidgets 用于主循环,将 wxGLCanvas用于 OpenGL 的东西。
但如果这是不可能的,出于某种原因,您确实应该能够从另一个线程使用 wxWidgets。请记住,wxWidgets GUI 功能只能在单个线程中使用,因此您也需要从该线程中初始化它。而且,当然,您需要自己处理线程同步,因为 wxWidgets 对您程序的其余部分一无所知。