【问题标题】:How do you create a window in Linux with C++?如何使用 C++ 在 Linux 中创建窗口?
【发布时间】:2012-06-26 19:15:25
【问题描述】:

我期待一个类似于 Windows API 的 Linux API。我在 Google 上看到的只是对 Qt 和 GTK 的引用。我真的只需要一个简单的窗口就可以使用 OpenGL 进行绘制,所以这些库对于我的使用来说显得臃肿不堪。 Qt 和 GTK 在 Linux 下使用什么来创建窗口?没有比这更底层的了吗?

【问题讨论】:

  • X Windows API 通常是 *nix 上通用“窗口化”的最低级别 API。 tronche.com/gui/x/xlib/introduction
  • 我很好奇:为什么您会期望“linux api”(无论您的意思是什么)与 winapi 相同?
  • 你真的不想降级。使用更高级别的抽象之一(QT/GTK/WxLib/More),否则您将陷入许多您不想处理的细节中,而更高级别的框架会处理这些细节。它们都允许您获取 OpenGL 层并在其上绘图。
  • 如果有人要求尽可能低的 API,请回答该问题。请不要谈论“为什么使用那个,使用这个,......”。

标签: c++ linux window


【解决方案1】:

我知道这是一篇旧帖子。但是对于像我这样最近发现这一点的人来说,这里有一个有用的图表。这只是您想要/需要抽象多远的问题;如果你不小心,你最终会尝试用二进制编码。 XLib 是 SFML 的依赖项,XLib 有它的依赖项。

Diagram of GUI Layers

【讨论】:

    【解决方案2】:

    假设通过简单窗口,您的意思是绘图应该出现在屏幕上: The Weston compositor uses EGLOutput/EGLDevice to display the composited Weston desktop or individual Wayland applications on a physical display device.

    用其他厂商的硬件画图学习GEM可以给点提示。

    【讨论】:

      【解决方案3】:

      2019 年的更新答案。类 Unix 系统通常使用 X 窗口系统。您可以使用 Xlib 直接使用它,这是低级 API。但是您可能需要一个更受欢迎和跨平台的解决方案。您可以使用:

      GLFW 是用 C 语言编写的,并且原生支持 Windows、macOS 和许多使用 X Window 系统的类 Unix 系统,例如 Linux 和 FreeBSD。

      安装后,创建一个窗口:

      #include <GLFW/glfw3.h>
      .
      . //Entry and glfwInit()
      .
      GLFWwindow* window = glfwCreateWindow(1000, 1000, "MyWindow", NULL, NULL);
      glfwMakeContextCurrent(window);
      

      【讨论】:

        【解决方案4】:

        X 窗口系统通常进行绘图 - 然后您在原始 Xlib 之上使用 Qt 或 GTK 等工具包来提供事件循环、拖放、鼠标点击启动应用程序和所有其他“桌面”内容

        直接使用Xlib and opengl 相当容易,或者如果您只是想学习opengl,glut 提供了显示窗口、处理鼠标/键盘事件等所需的框架。

        【讨论】:

        • 原则上,您甚至可以避免使用 Xlib,而只传输(接收和解释)原始 X11 协议。但这是不合理的。
        【解决方案5】:

        Ax Martin 说,X11(或者现在它的分支 XOrg)是窗口系统,但实际上你可以在不使用工具包的情况下编写 X11 应用程序(即客户端),只需使用 X 库。有关文档,请参阅 here

        这样做通常不是最好的主意,因为它相当痛苦,并且会涉及大量代码,以使相对简单的应用程序按您期望的方式工作。

        【讨论】:

          【解决方案6】:

          对于 OpenGL,最简单的方法是使用 GLUTSDL。下面是一个使用 GLUT 的近似示例:

          #include <GL/glut.h>
          
          int main (int argc, char **argv)
          {
              glutInit(&argc, argv);
              glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
              glutInitWindowSize(800, 600);
              glutInitWindowPosition(100, 100);
              glutCreateWindow("My new window");
              /* ... */
          }
          

          您确实希望避免直接使用 Xlib,因为它使用起来非常乏味。此外,GLUT 和 SDL 可以更轻松地将 OpenGL 应用程序移植到不同的平台。

          【讨论】:

          • 如何访问图形层以与 OpenGL 一起使用?
          • @LokiAstari:如果你的意思是某种保持绘图状态的不透明类型,我真的不知道。当我过去在 OpenGL 中编码时(回到 1.2 版),只有一个全局的绘制位置,由 OpenGL 实现在内部处理。
          猜你喜欢
          • 1970-01-01
          • 2016-12-02
          • 1970-01-01
          • 2011-01-08
          • 2022-11-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-08
          相关资源
          最近更新 更多