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

C++ c++;自定义UI工具包--跨平台抽象层选项,c++,qt,user-interface,sublimetext2,C++,Qt,User Interface,Sublimetext2,作为跨平台文本编辑器Sublime text 2的粉丝,我一直在研究它是如何开发的。开发人员注意到,它有99%个C++,其中有一些GTK用于Linux,并且它使用了他称为“崇高GUI”的自定义UI工具包。这是开发人员的一段引述 升华文本2本身使用自定义UI工具包。有很多应用程序这样做可能没有意义,但对于Sublime Text来说,这并不是一个不合理的选择,因为我一直都知道,无论使用何种工具包(例如,文本控件和选项卡控件),很多UI控件都必须是自定义的。UI工具包位于跨平台抽象层之上,它更像是平

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

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

我的问题是,跨平台抽象层有哪些选项?我假设这比GTK、QT、SDL的水平低。我试图弄明白如何创建一个跨平台的定制UI工具包,并且只需编写一次代码


我很欣赏UI工具包的好处,但是如果我想在Windows、Linux和Mac上获得对我的应用程序的支持,我不知道从哪里开始。

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

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

  • 创建OpenGL上下文并使用OpenGL绘制小部件。喜欢
  • 使用本机图形基础结构。就像在windows和X11上一样
  • 当然,您需要为每个平台实现某些东西。使用OpenGL,您需要为每个平台编写上下文(WGL、GLX等)处理,而使用本机绘图基础设施,您需要做更多的工作。由于所有的绘图基础结构都是唯一的,所以您可能希望为绘图编写一个抽象,然后使用绘图抽象层实现小部件

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

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

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


    记住,我从来没有实施过这样的事情。然而,我可能会尝试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节


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

    根据我看到的情况,它可能使用GDI和XLib。使用类似Fraps的东西,如果正在使用gpu,您会看到调试信息,但是没有调试信息。所以我相信它是在做软件渲染。同样运行gDEbugger的还有0个OpenGL调用。虽然我只是在Windows上测试,所以OpenGL也有可能在其他平台上使用,尽管我对此表示怀疑。是否有任何教程解释了一个基本的窗口,其中很少有组件创建。只是想了解一下。在代码中包含ifdef很难维护,所以从来都不是一个好主意。最好有一个用于绘图的抽象,然后在这里使用。当然,这个抽象仍然依赖于操作系统,但是最小化为库中的一个小部分和专用部分。顺便说一句,Qt就是这么做的。如果您查看与平台相关的部分,您会注意到>98%的Qt是与平台无关的。所以只要使用Qt,它就是正确的选择。