9

作为跨平台文本编辑器 Sublime Text 2 的粉丝,我一直在研究它是如何开发的。开发人员注意到它是 99% 的 c++ 和一些用于 Linux 的 GTK,并且它使用了一个他称之为“Sublime GUI”的自定义 UI 工具包。这是来自开发者的引述

Sublime Text 2 本身使用自定义 UI 工具包。有很多应用程序可能没有意义,但对于 Sublime Text 来说,这并不是一个不合理的选择,我一直知道无论工具包如何,很多 UI 控件都必须是自定义的(例如,文本控件和选项卡控件)。UI 工具包位于跨平台抽象层之上,它更像是平台功能的结合,而不是最低公分母。

我的问题是,跨平台抽象层有哪些选择?我认为这比 GTK、QT、SDL 低。我试图弄清楚如何创建一个跨平台的自定义 UI 工具包,并且只需要编写一次代码。

我很欣赏 UI 工具包的好处,但如果我想亲自动手并在 Windows、Linux、Mac 上支持我的应用程序,我不知道从哪里开始。

4

2 回答 2

5

我想最重要的问题是如何绘制和获取键盘和鼠标事件。

正如我所看到的,有两种绘图方法:

  1. 创建 OpenGL 上下文并使用 OpenGL 绘制小部件。像一样。
  2. 使用本机绘图基础架构。就像Windows上的GDI+ ,X11 上的XLib

当然,您需要为每个平台实现某些东西。使用 OpenGL,您需要为每个平台编写上下文(WGL、GLX、..)处理,而使用本机绘图基础架构则需要更多的工作。由于所有绘图基础设施都是独一无二的,您可能希望为绘图编写一个抽象,然后使用绘图抽象层实现您的小部件。

至于事件处理,我认为您还需要编写自己的抽象,因为每个平台的事件处理都是独一无二的。

最后,您还应该有一个抽象层来创建主窗口,您可以在其中绘制小部件并从中获取事件。

使用 OpenGL 时,您可以从glut开始,它已经处理了窗口创建和事件处理。

请记住,我从未实施过这样的事情。但是,我可能会尝试使用 OpenGL 方法,因为我认为实现目标的工作量更少。

于 2013-01-25T09:10:36.533 回答
2

有许多跨平台工作的 GUI 工具包(Tk、QT 和 GTK 仅举几例)

但是,如果您想编写自己的,它不必是比 GTK、QT 或类似工具低级别的工具包。

您可以公开与此类似的接口

void draw_window(mywindow *mw, char *name){
    non platform specific code goes here (maybe arg parsing, etc.)

#IFDEF windows
    windows specific code goes here
#ENDIF
#IFDEF macosx
    mac specific code goes here
#ENDIF
#IFDEF linux
    linux specific code goes here
#ENDIF

    non platform specific code goes here (tidying up, recording state, etc.)
}

在每个特定于平台的部分中,您可以分派到该平台的 gui 工具包或使用任何可用的接口(即,用于 Unix 的 X11)。

当您编译代码时,您指定目标平台,这决定了哪些 IFDEF 部分被编译。

当然,这被过度简化了,并且必须非常小心,以便您公开的界面不会太痛苦而无法映射到本机等价物。

于 2013-02-13T22:12:01.593 回答