C++自定义UI工具包--跨平台抽象层的选项

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上获得应用程序的支持,我不确定从哪里开始。
2个回答

5
我想最重要的问题是如何绘制并获取键盘和鼠标事件。
在我看来,有两种绘制方法:
1.创建OpenGL上下文并使用OpenGL绘制窗口小部件,例如glui
2.使用本地绘图基础架构,在Windows上使用GDI+,在X11上使用XLib
当然,你需要为每个平台实现一些特定的功能。对于OpenGL,你需要为每个平台编写上下文(WGL、GLX等)处理,而对于本地绘图基础架构,你需要更多的工作。由于所有绘图基础架构都是独特的,所以你可能想编写一个抽象层用于绘制,然后使用你的绘制抽象层实现你的窗口小部件。
至于事件处理,我认为你也需要编写自己的抽象层,因为每个平台的事件处理方式都是独特的。
最后,你还应该有一个抽象层来创建主窗口,在其中绘制你的窗口小部件并获取事件。
当使用OpenGL时,您可以从glut开始,它已经处理了窗口创建和事件处理。
请记住,我从未实现过类似的东西。然而,我可能会尝试使用OpenGL方法,因为我认为这样可以更少地达到目标。

根据我所看到的,它可能使用GDI和XLib。如果使用类似Fraps的工具,您会看到调试信息,如果GPU正在使用,但没有调试信息。因此,我认为它正在进行软件渲染。同时,在运行gDEbugger时,没有OpenGL调用。虽然我只在Windows上进行测试,因此在其他平台上可能会使用OpenGL,但我怀疑这一点。 - leetNightshade

2

有许多GUI工具包可以跨平台使用(例如Tk、QT和GTK)

如果您想自己编写GUI工具包,它不必比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部分要进行编译。

当然,这过于简化了,必须非常小心,以确保您公开的接口不太难映射到本机等效项上。


有没有任何教程可以解释一下如何创建一个带有几个组件的基本窗口,只是为了了解一下。 - programmer
在代码中使用#ifdef很难维护,所以这不是一个好主意。更好的方法是为绘图创建一个抽象,然后在此处使用它。当然,这个抽象仍然依赖于操作系统,但是被最小化到库中的一个小而专用部分。这正是Qt所做的。如果您查看平台相关部分,您会注意到> 98%的Qt是与平台无关的。因此只需使用Qt,这是正确的选择。 - dhaumann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接