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

c++ custom UI ToolKit -- Options for cross platform abstraction layer

本文关键字:选项 抽象 跨平台 UI 工具包 c++ 自定义      更新时间:2023-10-16

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

的引语

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

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

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

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

在我看来,有两种绘制方法:

  1. 创建OpenGL上下文并使用OpenGL绘制小部件。像glui。
  2. 使用本地绘图基础设施。像windows上的GDI+, X11上的XLib。

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

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

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

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

记住,我从来没有实现过这样的东西。然而,我可能会尝试OpenGL方法,因为我相信它更容易达到目标。

有许多跨平台的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工具包或使用任何可用的界面(例如;X11 for Unix)。

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

当然,这是过度简化的,必须非常小心,以便您公开的接口不会太痛苦地映射到本机等价物。