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

Linux与Windows中的窗口消息过程

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

    在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 回复  |  直到 15 年前
        1
  •  4
  •   MarkR    15 年前

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

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

    有很多库通常用于“隐藏”这种行为——您可以使用它们(实际上,您应该这样做)。如果有的话,xlib事件系统甚至比win32的user32.dll事件系统更为反常,并且不被广泛理解,因此直接使用它的人就更少了。


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

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

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

        3
  •  5
  •   Mark Ingram    15 年前

    完全完全不同。该窗口过程100%特定于Windows操作系统。对于Linux,它将取决于窗口管理器(gnome、kde——正如您已经提到的那样)。如果您希望进行跨平台开发,那么您可能需要查看Qt之类的内容。

    您可能希望查看以下URL:

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

        4
  •  2
  •   ___    15 年前

    如xhantt所述,传输您要查找的等价消息的是x窗口系统。这确实有点复杂。

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

    你也可以找 XCB 这是一个更新的,可能更简单的图书馆。

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