先贴一段fltk的官网介绍:
FLTK (pronounced "fulltick") is a cross-platform C++ GUI toolkit for UNIX®/Linux® (X11), Microsoft® Windows®, and MacOS® X. FLTK provides modern GUI functionality without the bloat and supports 3D graphics via OpenGL® and its built-in GLUT emulation.
FLTK是一套适用于unix/linux、windows和macos的跨平台c++界面库,尺寸精简,具有现代GUI功能,支持OpenGL,内置glut
FLTK is designed to be small and modular enough to be statically linked, but works fine as a shared library. FLTK also includes an excellent UI builder called FLUID that can be used to create applications in minutes.
FLTK的设计非常小巧和模块化,支持静态链接和动态链接,同时提供了一个可以快速生成界面的工具:FLUID
FLTK is provided under the terms of the GNU Library Public License, Version 2 with exceptions that allow for static linking.
FLTK基于GPL2协议,对于静态链接没有要求
-----------------------------------------------------------
以上就是FLTK的简单介绍,下面先谈谈个人对于跨平台界面库的一些想法.
先限定范围,跨平台库和跨平台界面库还是有区别的,这里只谈界面开发,不涉及功能性的开发,比如网络通讯,算法,数据结构之类都不在讨论范围
既然是跨平台,就一定要依赖于目标平台,现有的平台有很多,windows,linux(x11,wayland),macos,iphone,android,wince,symbian,blackberry,window phone,haiku,firefox os...这么多的平台,每个平台的API都有所不同,开发工具也有所不同,甚至语言的覆盖范围也各有不同,要尽量覆盖足够多的平台,目前有以下几种做法
1.虚拟机模式(JAVA),核心思路就是针对每个平台开发一个虚拟机,然后提供统一的接口给程序员,好处是解放了程序员,坏处是效率有所损失,同时无法提供某些平台特有的功能,所以java搞了jni做为补充,但是jni破坏了一次编译到处运行的目标
2.原生整合模式(wxwidgets),就是将所有平台的原生控件捏成一套统一的接口,好处是程序员只要有某个平台的开发经验就可以基本无缝切换到其他平台,坏处是捏合这么多的原生控件实在太困难,以至于接口的复杂度比较高,学习曲线比较陡峭
3.自绘整合模式(qt,gtk,fltk,juce),就是只整合各个平台的基本绘制和鼠标键盘触控等功能,控件完全由程序自己绘制和控制,前几年流行的directui就是这个概念,只是directui当初是为了在windows平台做出更好看的界面,并不是为了跨平台。这种模式的好处是移植相对容易,坏处是控件的外观全平台统一,有些场合未必适用,学习曲线也比较陡峭
4.浏览器模式(html5),这个模式很容易理解,就是网页的富客户端。以前就有这种库,但是当时浏览器基本上是IE一家独大,没什么跨平台可言,现在基于软硬件的进步,浏览器已经遍布各种平台,所以推动了网页富客户端的跨平台。优点是界面灵活,编写容易,缺点是效率低,无法处理和具体系统相关的功能
5.flash模式,鉴于flash已经快走入黄昏,就不黑它了
fltk属于上面所说的第三种模式。相对于QT和GTK,fltk的代码比较少,编译后的尺寸也比较小,fltk只关心界面,只用到了c++最基本的class功能,连模板都没有使用,所以移植fltk的难度要相对小很多,这也是我选择它作为主要开发平台的原因之一。只要搞懂了fltk的内部结构,编写自己的控件和平台移植都相对容易,但是由于fltk的缺省控件实在太丑,代码的整体结构也很少有人分析,所以使用人群似乎并不广。而且针对PC的跨平台界面库实在太多,fltk并没有什么特殊之处。但是当我将fltk移植到几个嵌入式平台之后才发现它的好处和优点
1.只使用最简单的c++语言特征,除了class和friends,fltk几乎没有使用其他的c++特征。这保证了编译后的尺寸够小,同时移植比较容易。这里要顺便吐槽一下c++,刚诞生的时候c++是一个很好的语言,抽象和封装是它最大的优点,但是自从模板、容器之类的玩意出现之后,c++就开始逐渐向怪兽型进化,由于不断添加新的语言特征,一直没办法让标准库确定下来,boost算是一个事实上的标准库,但是这个标准库和C的标准库相比,缺乏稳定性和跨平台性,一种语言没有稳定可靠的标准库,是很难变成工业级产品的
2.专注于界面,不做多余的事情,谨守kiss原则。QT和GTK最大的问题就是做的太多了,一套开发库好比是一个城市,城市太大就容易迷路。QT和GTK是超级大都市,里面提供一切,城市外面全是莽荒,没有研究的必要,但事实上软硬件提供的功能总是在不断增加的,所以一旦出现新东西,要么等待开发库提供,要么花更多的精力把新概念整合进来。但是体量越大,添加新功能就越难
3.结构简单。FLTK几乎是直线型的架构,乍看之下似乎流于简陋,但是做移植的时候才能发现这种模式的好处
说了这么多,其实重点就一条:FLTK是个好东西