FLTK,如同其名字所表達(dá)的:The Fast Light Tool
Kit,一個(gè)輕量級(jí)的GUI開發(fā)庫(kù)。但這輕量級(jí)并不代表功能的羸弱,相反,F(xiàn)LTK在具有基本的GUI功能之外,還擁有一些特殊的功能,比如跨平臺(tái)、內(nèi)置
OpenGL功能、速度更快、尺寸更小、協(xié)議寬松等。當(dāng)然,缺點(diǎn)也是有的,比如對(duì)于復(fù)雜的界面構(gòu)件支持不夠,資源支持的不足等。但一個(gè)工具如果使用的好,
取其長(zhǎng)而去其短,自然可以飛花摘葉皆可傷人;P
我選擇FLTK
的過程還是比較曲折的,當(dāng)初做ARM下的GUI開發(fā),選擇的GUI庫(kù)是MiniGUI,一個(gè)國(guó)內(nèi)開發(fā)的界面庫(kù)。當(dāng)時(shí)還支持類unix平臺(tái),對(duì)
Windows的支持尚在開發(fā)中。由于需要尋找一些問題的解答,所以經(jīng)常在其論壇上搜索,從而知道了還有microwindow、nano、
qtembedded等嵌入型GUI開發(fā)庫(kù),但當(dāng)時(shí)沒有太過注意。后來又開始轉(zhuǎn)向WINCE平臺(tái)的開發(fā),這一擱就是2年。再后來終于要做跨平臺(tái)的開發(fā),對(duì)
具有跨平臺(tái)的GUI開發(fā)庫(kù)開始注意起來。
一開始的選擇是wxWidgets,但是研究了一段時(shí)間后發(fā)現(xiàn)不好解決的問題越來越多,終于
放棄。最頭疼的就是C++類的事件傳遞,wxWidgets內(nèi)部使用的是一個(gè)類似MFC的方法,所有傳遞事件的類全部要從一個(gè)根類繼承,這樣就導(dǎo)致創(chuàng)建的
類和wxWidgets綁定過甚,復(fù)用性大大降低,同時(shí)由于wxWidgets的目標(biāo)不僅僅是GUI,造成其包含功能過多,其內(nèi)部結(jié)構(gòu)非常復(fù)雜,雖然是
OpenSource,但要若要修改其代碼還是很困難的。綜上所述,wxWidgets并不符合我的要求,從而被排除在外。
之后研究的QT,老牌的跨平臺(tái)GUI開發(fā)庫(kù),工具很多,開發(fā)也很人性化,qtdesign很像Delphi的界面開發(fā)方式,代碼帶有強(qiáng)烈的linux風(fēng)格,但是看看附帶的庫(kù)文件又實(shí)在讓人有些泄氣,尺寸大,發(fā)布麻煩。所以在試用了一段時(shí)間后還是放棄了。
在此期間,其實(shí)也看到過一些對(duì)FLTK的介紹,但大多數(shù)對(duì)其評(píng)價(jià)不高,也就沒有注意。直到有一次偶然心血來潮,上http:
//www.fltk.org看了一下,發(fā)現(xiàn)FLTK
似乎正對(duì)我的胃口,這才開始對(duì)其進(jìn)行了深入的研究。經(jīng)過一段時(shí)間的實(shí)際開發(fā),個(gè)人覺得,對(duì)于跨平臺(tái)和代碼簡(jiǎn)潔而言,F(xiàn)LTK是再適合不過了。
FLTK的底層只提供一套完整的畫點(diǎn)、畫線功能,另外附帶了字體的顯示功能,但FLTK對(duì)字體的支持還很粗糙,尤其對(duì)于非英文字符集而言,后面我會(huì)詳細(xì)
說明。在基本的點(diǎn)、線功能基礎(chǔ)上,F(xiàn)LTK完全自己實(shí)現(xiàn)了一套界面,比如Button、Label、Edit、Tab等,全部都是由基本的點(diǎn)線畫出。看到
這,可能你會(huì)覺得這實(shí)在是屬于自己造輪子,吃力不討好。誠(chéng)然,如果你只針對(duì)一種平臺(tái)開發(fā),這樣的做法不能帶來多少好處,還造成學(xué)習(xí)時(shí)間的拉長(zhǎng)。但若要針對(duì)
多個(gè)平臺(tái)開發(fā),這樣做的好處就很明顯了。首先是移植容易,只要針對(duì)目標(biāo)平臺(tái)實(shí)現(xiàn)基本的點(diǎn)線功能就可以實(shí)現(xiàn)代碼的移植,這可能是所有跨平臺(tái)GUI庫(kù)中最方便
最直接的方案,目前FTLK支持MacOS、Windows、Linux(x-window)等平臺(tái),針對(duì)WinCE(主要是unicode的問題)和
plam
的開發(fā)正在進(jìn)行中。其次是保持了界面的一致性,雖然QT、GTK等開發(fā)庫(kù)也具有這種功能,但是他們都需要一套基本庫(kù)的支持,無法做到系統(tǒng)尺寸的優(yōu)化,而對(duì)
于FLTK而言,這卻恰恰是他的優(yōu)點(diǎn)和長(zhǎng)項(xiàng)。最后是代碼層次清楚、結(jié)構(gòu)簡(jiǎn)單,由于大部分的工作就是基于底層的點(diǎn)線功能進(jìn)行自繪,所有很多代碼都是簡(jiǎn)潔明
了,很少費(fèi)話。
底層之上是一套以Fl_開頭的類,代表了各種GUI構(gòu)件,比如Fl_Window、Fl_Button、
Fl_Input等,使用起來很是容易。同時(shí)由于上面所說的,所有的界面構(gòu)件都是畫出來的,因此在熟悉了這種方式后,生成自己的構(gòu)件也是很容易的,反正是
畫界面嘛,既然別人能做到,你也能做到,實(shí)在不行可以查閱源代碼進(jìn)行學(xué)習(xí)。這些界面類的共同特點(diǎn)是輕量型、都擁有一個(gè)draw(),只要在draw()里
實(shí)現(xiàn)自己的繪畫動(dòng)作即可。
說到界面就不能不說其事件實(shí)現(xiàn)方式,對(duì)于FLTK而言,使用的是最直接的方法:while(1){}。這也
是很多人批評(píng)FLTK原始的一個(gè)原因。但仔細(xì)想想,其實(shí)這是最直接的辦法,不管是哪種平臺(tái),最終的事件方案不外乎是死循環(huán)和中斷,中斷的確具有很多好處,
但只要while(1)能完成這部分的功能,那又有什么關(guān)系呢。每個(gè)界面類都有一個(gè)handle(int
event),只要繼承這個(gè)成員函數(shù),就可以在其中處理自己的事務(wù)。是不是很簡(jiǎn)單?同時(shí)由于這樣的事件方式,造成FLTK的刷新速度很快,事件反應(yīng)迅速,
也算是個(gè)附帶優(yōu)點(diǎn)了。現(xiàn)在大多數(shù)的開發(fā)庫(kù)都是采用OO方式的事件處理方式,但FLTK卻采用了最原始的函數(shù)指針方式,也算是一個(gè)異類,這可能和FLTK的
unix背景有關(guān),無論如何,這種方式還是需要一定的適應(yīng)時(shí)間的,而且這種方式的優(yōu)缺點(diǎn)也是屬于各花入各眼了,不過我本人還是很喜歡這種方式的,誰(shuí)叫我比
較原始呢#-_-
FLTK產(chǎn)生于NeXT環(huán)境,發(fā)展于X-window環(huán)境,所以對(duì)圖形加速的支持必然是選擇OpenGL。FLTK
使用Fl_Gl_Window這個(gè)類將OpenGL的基本功能囊括其中,只要在Fl_Gl_Window的draw()里glbegin/glend即
可,基本的設(shè)置工作FLTK全都做好了,對(duì)于我現(xiàn)在的系統(tǒng)要求簡(jiǎn)直是最適合不過了。
FLTK基于LGPL,對(duì)使用者的要求非常寬松:
Contrary to popular belief, it can be used in commercial software -
even Bill Gates could use
it! 所以開發(fā)者不需要擔(dān)心其項(xiàng)目的隱形問題。但是如果對(duì)FLTK進(jìn)行了卓有成效的修正最好還是能回饋給開發(fā)組,所謂我為人人,人人為我嘛。
說了一堆的好話,現(xiàn)在開始談?wù)凢LTK的缺點(diǎn)。首先一條就是對(duì)非英文字體特別是中文的支持比較差,甚至是非常差。在Windows平臺(tái)下還好一點(diǎn),因?yàn)?
在
Windows平臺(tái)下使用的是TextOut函數(shù)輸出字符串,但是在X-Window環(huán)境下就完蛋了,無法正確顯示中文,也不能調(diào)用輸入法進(jìn)行輸入。從這
點(diǎn)來說,F(xiàn)LTK還是只適合一些封閉軟件的開發(fā),對(duì)于通用軟件而言FLTK并非是一個(gè)好的選擇。但只能在Windows平臺(tái)下開發(fā)中文軟件也不是個(gè)辦法,
要解決中文的顯示問題也不難,目前FTLK的穩(wěn)定版是1.1.7,開發(fā)版是2.0,有人針對(duì)1.xx版本修改了一個(gè)unicode版本,可以很平滑的支持
漢字的顯示,但很遺憾,我沒有編譯成功過,如果誰(shuí)編譯成功了可以給我來個(gè)信。2.0已經(jīng)對(duì)非英文的支持進(jìn)行了專門的開發(fā),但目前還沒有release,在
不久的將來應(yīng)該可以完整的解決這個(gè)問題。目前,要么等待,要么就像我這樣,用點(diǎn)陣字庫(kù)瞞天過海。具體方法因?yàn)檫€不夠成熟,就不公布了。
無論如何,F(xiàn)LTK的目標(biāo)還是針對(duì)嵌入式和封閉軟件的開發(fā),所以復(fù)雜的界面并非其長(zhǎng)項(xiàng),如果想做出花哨復(fù)雜的界面,還是用其他GUI庫(kù)比較好,F(xiàn)LTK并不適合。
綜上所述,F(xiàn)LTK的優(yōu)點(diǎn)和缺點(diǎn)都是非常的突出,如何取舍還是自己決定吧。
2006-04-16 22:02