代码之家  ›  专栏  ›  技术社区  ›  Mizipzor

Linux与Windows中的窗口消息过程

  •  6
  • Mizipzor  · 技术社区  · 16 年前

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

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

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

    我想读一些关于同一系统在Linux中是如何工作的。也许是因为我在术语上有点不足,但我在谷歌上找不到任何东西(尽管我确信肯定有很多!)。

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

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

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

    4 回复  |  直到 16 年前
        1
  •  4
  •   MarkR    16 年前

    在最基本的层面上,你有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/ .

        2
  •  7
  •   Ismael Philip Pryde    16 年前

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

    GUI应用程序在某个地方有一个事件循环,它在某种程度上处理来自队列的消息。

    有很多库通常用于“隐藏”这种行为——你可以使用它们(事实上,你应该使用它们)。如果说有什么不同的话,那就是Xlib事件系统比Win32的user32.dll事件系统更反常,而且不太被广泛理解,因此直接使用它的人更少。


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

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

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

    您可能希望查看以下网址:

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

        4
  •  2
  •   ___    16 年前

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

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

    您还可以查找 XCB 这是一个更新的,可能更容易的库。

    如果你在这两个库的基础上构建你的应用程序,它将在每个WM下平稳运行(几乎,我们永远不能太确定)。而且,您不需要任何大多数linux用户对其安装没有的依赖性。如果你使用Qt、GTK等……它会更容易,在任何WM下都能工作,但它们可能没有安装库。