【问题标题】:Window message procedures in Linux vs WindowsLinux 与 Windows 中的窗口消息过程
【发布时间】:2009-02-08 15:49:37
【问题描述】:

在Windows中创建窗口时,必须定义一个(c++)

LRESULT CALLBACK message_proc(HWND Handle, UINT Message, WPARAM WParam, LPARAM LParam);

处理从操作系统发送到窗口的所有消息,例如按键等。

我希望阅读有关同一系统在 Linux 中如何工作的一些信息。也许是因为我在术语上有点不足,但我无法通过谷歌找到任何关于此的内容(尽管我确信一定有很多!)。

  • 是否仍然只有一个 C 函数来处理所有通信?
  • 函数定义在不同的 WM(Gnome、KDE)上是否不同,还是在操作系统的较低级别上处理?

编辑:我研究过 QT 和 WxWidgets 等工具,但这些框架似乎更适合开发 GUI 广泛的应用程序。我宁愿寻找一种方法来为我的 OGL 图形创建一个基本窗口(限制调整大小、边框/装饰)并在多个平台上检索输入。根据我最初的研究,这种函数是检索该输入的唯一方法。

最好的路线是什么?阅读、学习然后使用 QT 或 WxWidgets?或者学习系统如何工作并实现我自己想要的那些基本功能?

【问题讨论】:

  • 如果您需要一些简单的东西,您可以尝试 SDL libsdl.org,这是一个旨在开发游戏/简单应用程序的跨平台库。
  • 我开始意识到这个问题实际上是一个很好的答案。

标签: c++ windows linux cross-platform


【解决方案1】:

在最基本的层面上,您拥有 X Window 协议http://en.wikipedia.org/wiki/X_Window_System_core_protocol,如果您想做任何应用程序,我们可能会非常复杂地处理它。接下来是 Xlib http://en.wikipedia.org/wiki/Xlib,它是 X 协议的“方便”包装器,但对于“现实生活”应用程序来说仍然很复杂。大多数其他框架都是在 Xlib 之上构建的,旨在简化应用程序开发。最了解的有:Xt、Gtk、Qt等。

就像在窗口中一样,你有一个“事件循环”,如果你愿意,你可以在它之上实现一个 GetMessage/DispachMessage 隐喻来模仿窗口的行为。这样你可能有一个 WNDPROC,但 X 本身不提供这样的东西。

在重新发明轮子之前,最好先看看类似的应用程序,它们正在使用什么。

如果您需要一些简单的东西,您可以尝试 SDL http://www.libsdl.org/,这是一个旨在开发游戏/简单应用程序的跨平台库。另一种选择是 Allegro 游戏库http://www.talula.demon.co.uk/allegro/

【讨论】:

  • 您能否详细说明最后的声明?我认为 WNDPROC 是事件循环。在那个循环中,创建我自己的事件,以便应用程序的其余部分不知道它运行在哪个操作系统上,这是我的计划。这就是所谓的调度系统吗?
  • Windows 有一个消息循环msdn.microsoft.com/en-us/library/ms644928(VS.85).aspx。有时这会被您正在使用的框架(即 MFC、.NET 等)隐藏。
  • 对于每个线程,你都有一个消息队列,WM_XXX 消息在生成时存储在其中,消息循环负责查看这些消息并将它们传递到适当的窗口进程。
  • @mizipzor:没错,wndproc 是所有窗口的消息传递例程。但是,这是基于 Microsoft Windows 的东西。 Linux 的工作方式并不完全相同。使用更高级别的库 - 例如 QT
  • 别忘了 GTK 和 Qt 都是跨平台的!
【解决方案2】:

原则上是完全一样的。但是,它与与操作系统的通信无关(在win32上也没有,使用user32.dll是完全可选的)

GUI 应用程序在某处有一个事件循环,它在某个级别处理来自队列的消息。

有很多库通常用于“隐藏”这种行为 - 您可以使用它们(实际上,您应该使用它们)。如果有的话,Xlib 事件系统比 Win32 的 user32.dll 更变态,并且没有被广泛理解,因此很少有人直接使用它。


在 Linux 或 Windows 中,应用程序可以使用低级 GUI,也可以使用库。大多数人使用图书馆。应用程序也可以选择不做任何事情并在没有 GUI 的情况下运行(服务器应用程序通常这样做)。应用程序可以创建多个线程,其中一个位于事件循环中,而其他的工作方式不同。这也是一种流行的方法。

  • 大多数 GUI 应用程序为其 GUI 使用更高级别的库
  • 非交互式应用程序,例如服务器应用程序,完全不要使用 GUI,不要使用库(例如 XLib、user32.dll)
  • 不适合“事件循环”的应用程序(例如游戏)通常使用单独的线程来处理其事件循环。
  • 这些情况在 Win32 和 Linux 上基本正确。

【讨论】:

  • 很好,我希望得到这样的答案。我正在写一个游戏,所以不会有太多的 GUI 或系统事件。但如果我声称事件循环是从用户那里获取输入的唯一方法,你能证明我错了吗?
  • 游戏通常有一个单独的线程来运行与运行游戏逻辑的事件循环——游戏逻辑线程通常从事件处理线程中获取共享变量等中的数据。然而,还有其他可能性。
【解决方案3】:

这是完全不同的。该窗口过程是 100% 特定于 Windows 操作系统的。对于 linux,它将取决于窗口管理器(gnome、kde - 正如您已经提到的)。如果你想做跨平台开发,你可能想看看 QT 之类的东西。

您不妨看看以下网址:

http://www.qtsoftware.com/products/appdev
http://en.wikipedia.org/wiki/Qt_toolkit

【讨论】:

    【解决方案4】:

    正如 xhantt 所说,传输您正在寻找的等效消息的是 X Window 系统。确实,这可能有点复杂。

    使用 XLib,您将需要在主循环中处理事件注册和出队。有关如何进行的完整说明,请参阅XLib manual。但不要忘记,您只会以这种方式捕获窗口和输入事件。不是所有操作系统消息。

    您还可以查找 XCB,它是一个更新且可能更简单的库。

    如果您在这两个库之上构建您的应用程序,它将在(几乎,我们永远无法确定)每个 WM 下顺利运行。而且您不需要任何大多数 linux 用户在安装时还没有的依赖项。如果您使用 Qt、GTK 等...在任何 WM 下都会更容易并且可以工作,但它们可能没有安装库。

    【讨论】:

    • 窗口和输入事件就足够了。如前所述,对于一个简单的游戏,我只想要一个窗口来绘制一些 OGL 并听取输入。感谢您提供 XCB 的链接,我会查一下。
    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 2010-12-19
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    相关资源
    最近更新 更多