客戶端GUI程式開發漫談

liulun發表於2015-09-19

這篇文章包含了這個領域的很多開源專案的介紹,還有我多年來的心血和汗水

 去年夏天的時候,我用QT做了一個小工具

後來還用QT做了流程設計器

我把程式分享給飛揚青雲之後,他甚至搞出來一套QT的皮膚

說實在的,QT確實挺強大的,

如果你有一個專案,需要跨平臺GUI開發,你又有一個C++團隊的話,

那麼做技術選型的時候,可以負責任的說,QT是不二之選

 

這時可能有人會提到GTK+

我想說的是GTK+對windows平臺的支撐力度實在是少的可憐

linux的版本已經到了3.16了,windows的版本才到3.6,整整差10個版本(我這裡說的是GTK3)

而且大部分常見的控制元件在windows上都沒有

來看看我在一個開源專案上踩的坑吧。

 

當然還有人可能提到wxWidgets,這玩意兒我沒有深入研究過

只知道它是在原生圖形API上再做的包裝,想想windows API搞出來的視窗有多古板,還是算了。

類似的還有iup,跟wxWidgets的原理是一樣的。

 

還有人直接用遊戲庫做GUI程式的,比如nimxnanovg

nimx是基於SDL2圖形引擎搞出來的GUI框架

我在nimx上踩到兩個坑,其中一個提交pull request給作者,作者也認了

第二個坑就直接把我坑死了。

nanovg是基於OpenGL圖形引擎搞出來的GUI框架。

這個專案還是in progress狀態。

總之,這兩個專案都不能用於生產。

 

說到這裡不得不說輪子兄搞的gacui

(我本想說,國內輪子兄...,但貌似他也已經肉身FQ了,再提國內也不對了)

這個專案我瞭解的不多,只在14年春天的時候,搭過環境,寫過hello world

前段時間學習nim語言,興致勃勃跑到github問作者要dll,打算用nim做個包裝

後來才知道,作者是不會提供了,好遺憾。

gacui的原理我不太清楚,只知道有GPU加速。

 

當然還有基於Direcut UI發展而來的duilib

這個庫也是國內一位朋友搞出來的

據說很多大廠的客戶端都在用這個開源庫

duilib應該是受這個專案的啟發才建成的

國內很著名的一個收費UI庫UI Power也是基於這個思路搞出來的

 

在國內開發GUI應用程式,更多的還是給windows平臺下的使用者用

如果你想最大自由度的定製你的介面,又不想讓你的程式的髮型版看起來太大

那麼duilib是個不錯的選擇,但duilib文件太少(作者自己也這麼說),你要做足這方面的準備

好在是開源的,你C++夠牛的話,也不用擔心

 

當然如果你希望有完善的文件來給你提供幫助的話,

那麼你可以選擇Qt,畢竟是國外大廠商,原始碼、IDE、文件、社群都很齊全

這裡不得不提一下國內的qtcn社群,挺不錯的,裡面有不少這個領域的專家,而且都挺熱情的

 

但是Qt的依賴庫庫實在太多,你開發好的程式怎麼著也得有個十幾兆,才能分發給別人。

而且我相信你肯定會用到process explorer或者dependencywalker之類的工具來查詢你的程式到底依賴了哪些dll

好吧,如果你足夠厲害、有一臺效能超讚的電腦、有一兩個小時的時間,你可以嘗試靜態編譯QT

 

如果你開發的GUI程式只給windows平臺下的使用者用

那麼最最基本的三個選擇:windows api、MFC、WTL

用windows api做GUI程式,比較辛苦,因為它就是一系列的API,所有的事情都得你自己來做

MFC是一套非常龐大的類庫,他裡面包含了一系列的C++的機制,用起來非常繁瑣

WTL比MFC簡單,比windows api易用,但資料很少

你如果要走WTL這條路,那麼你一定會看《深入解析ATL》這本書(友情提醒,這本書最新版翻譯的實在太爛了)

 

好,再來說用混合開發技術做GUI程式

這種技術方式的主要原理就是:

你寫程式碼包住瀏覽器核心,

介面程式碼用HTML/CSS/JS完成(這是最大的優勢,你可以用所有與之相關的庫)

所有與介面渲染相關的事情交給瀏覽器核心完成,

所有與系統相關的事情你自己完成

 

這項技術在移動端用的挺好的,

比如說國外的:phonegapcordova

還有國內的:muiappcan

如果你要做一個移動端的專案,又打算走混合開發這條路的話,

我強烈推薦dcloud的mui,真的很不錯,

appcan很早之前瞭解過一點,貌似是收費的

 

PC端的混合開發就不那麼火了,

但有很多大廠偷偷也在用這個技術,比如:鵝廠

如果你要做PC端的混合開發,

你有三條路可以走,

封裝IE瀏覽器的核心、

封裝谷歌瀏覽器的核心

封裝Webkit瀏覽器的核心

封裝firefox瀏覽器的核心

 

如果你要選用IE瀏覽器的核心,

那麼你就不可能考慮跨平臺的事情了,

而且,因為你的使用者可能使用了不同的windows作業系統

所以你要做好客戶端IE瀏覽器版本不一致的準備

IE6\7\8\9\10\11...

到IE9才可以稱得上現代化的瀏覽器,市面上很多前端庫,也只相容到IE9

用IE核心來做這個事情的好處是:

你不用把瀏覽器的一堆DLL,分發給你的客戶,這是其他三個方案所不能比的。

 

webkit和firefox真是挺尷尬的

效能表現沒有谷歌瀏覽器好

平臺支撐沒有IE瀏覽器好

我對firefox瀏覽器的Gecko核心幾乎沒有什麼研究

(之前做瀏覽器外掛的時候看過他的API,現在幾乎都忘記了)

Qt在去年之前還只有對webkit的封裝

我曾經在前年,把webkit和extjs整合起來,做了一個庫

大家可以研究一下,但請不要用於生產,我已經不再維護這個庫了

國外也有人用.net封裝過webkit,但作者在10年左右,就不再維護這個專案了

 

終於說到谷歌瀏覽器的核心:chromium

我實在是不建議直接研究它

你可以看看CEF這個專案

這個專案是用C++對chromium做的包裝

之前不支援中文輸入法的游標跟隨,現在也已經被fix掉了

如果你是C#開發人員,也想用CEF的話,

那麼你可以考慮使用cefgluecefsharpchromiumfx

這三個專案我都用過,目前的狀況來看,我推薦最後一個

我曾經寫過一系列的文章來介紹這個東西

你如果是一個JS開發人員的話,

有我nodejs的庇佑,你完全不用care   CEF這種東西

你可以直接選用nw.js或者electron

這個東西,我也用過,

除了nodejs帶來的那些缺點,

他幾乎是完美的,非常不錯,推薦使用

 

還想再多說一些,但忽然發現,篇幅已經太長了,借曹雪芹的一首詩止筆:

滿紙荒唐言!一把辛酸淚!一把辛酸淚!一把辛酸淚!.......


相關文章