2013-01-20 42 views
7

作为跨平台文本编辑器Sublime Text 2的粉丝,我一直在研究它是如何开发的。开发人员已经注意到,它对于Linux的一些GTK具有99%的C++,并且使用他称之为“Sublime GUI”的自定义UI工具包。这是来自dev的报价C++自定义UI ToolKit - 跨平台抽象层的选项

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

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

我很欣赏UI工具包的好处,但如果我想让自己的手变得肮脏,并且在Windows,Linux,Mac上支持我的应用程序,我不确定从哪里开始。

回答

4

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

当我看到它有绘图两种方法:

  1. 创建OpenGL上下文,并用OpenGL绘制你的部件。像glui
  2. 使用本机绘图基础结构。像在windows上的GDI+,在X11上的XLib一样。

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

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

最后,您还应该有一个抽象层,用于创建绘制窗口小部件的主窗口并从中获取事件。

使用OpenGL时,您可以从glut开始,它已经处理窗口创建和事件处理。请记住,我从未执行过这样的任何事情。不过,我可能会尝试OpenGL方法,因为我相信达成目标的工作量较小。

+0

基于我所看到的,它可能使用GDI和XLib。使用类似Fraps的东西,如果正在使用gpu,您会看到调试信息,但不存在调试信息。所以我相信它正在做软件渲染。还运行gDEbugger,有0个OpenGL调用。虽然我只在Windows上进行测试,但是可能在其他平台上使用OpenGL,尽管我怀疑它。 – leetNightshade

1

有跨平台工作的许多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对于Unix) 。

当您编译您指定的目标平台的代码,这决定其IFDEF部分在被编译。

当然这是过于简化,并且非常谨慎,必须要采取这样的接口,你暴露对映射到本地等价物并不太痛苦。

+0

是否有任何教程解释一个基本的窗口,只有很少的组件创建。只是为了得到一个想法。 – programmer

+0

#代码中的#ifdefs很难维护,所以绝不是一个好主意。有一个抽象的绘图,然后在这里使用会好得多。当然,这种抽象仍然依赖于操作系统,但最小化为库中的小型专用部件。这是顺便说一句。正是Qt所做的。如果您查看与平台相关的部分,您会注意到> 98%的Qt与平台无关。所以只需使用Qt,这是正确的选择。 – dhaumann