天天看點

Windows用戶端開發簡介(二)

Windows用戶端開發簡介(二)

一個典型的Windows用戶端程式要有哪幾部分構成呢?下面我會以一個國内比較流行的網際網路用戶端程式的基本架構來跟大家逐漸展開分析,由于涉及到知識産權的問題,請大家不要問我是什麼産品,當然,如果你能猜到,那我就管不着了^_^。

某視訊影音網際網路PC用戶端産品基本架構

Windows用戶端開發簡介(二)

         如上隻是個粗略的分層架構圖,沒有更細緻的劃分,但是有幾個地方是需要特别關注的,比如最上層的那幾個部分,音視訊解碼引擎,UI引擎,WebKit浏覽器核心,核心通信子產品,日志系統。

         因為音視訊解碼引擎和核心通信子產品隻是對于視訊用戶端和P2P通信特有的,不具有通用性,是以我這裡不做特别介紹。

         首先我們要來重頭介紹一下UI引擎

         所謂的UI引擎就是通常所說的界面庫,對于用戶端産品來說,UI開發占了很大篇幅,UI的好壞會直接影響使用者的最直覺體驗,是以一個好的界面庫實在是重中之重。

         那麼什麼樣算是好的UI引擎呢?從功能角度說首先配置友善,能快速的修改界面,或者完成界面的重建;其次要有功能豐富的控件,能夠滿足各種各樣的UI需求。從技術角度說,界面庫的移植性要好,比如繪制層和展現層分離,這樣在跨平台的時候就隻需要修改繪制層的代碼,而上層的用戶端UI代碼不需要做太大修改。其次伸縮性,伸縮性好在界面庫本身控件不夠豐富的情況下可以快速的進行開發新控件,這裡面就跟面向對象技術有很大關系。再其次,UI界面庫應該有比較好的擴充性,比如在現有控件不足的情況下,可以直接與平台原生控件結合,這樣在界面控件元素缺少的情況下可以快速的利用本平台原生控件進行彌補。

現在的界面庫發展大緻經曆了四個階段

一、最早的用Windows API進行界面開發的階段

這時期的界面相對比較簡單,圖檔還用的比較少,軟體結構也不是特别複雜,因而這個階段上界面甚至還談不上獨立出來的引擎,基本和資料層和通信層是整合在一起的。

在這個階段上,如果你要建立一個視窗,需要調用一大堆的Windows API,需要手動建立消息循環,需要調用諸如CreateWindow這樣的API并進行相應的消息處理。

二、以MFC、WTL為代表的第二代界面庫

這個階段上由于面向對象技術的發展(主要是C++),Windows平台上出現了像MFC這樣的C++封裝界面庫。它的主要特點是利用了C++的多态,封裝等C++特性,比如把視窗進行封裝,把視窗視作一個對象,對視窗的處理視作施加在視窗類對象上的行為。雖然引入了面向對象的概念,但是本質上而言,這還是一種用代碼來拼湊界面的辦法,對UI開發人員還是有比較高的要求的。

在這個階段上,如果你要建立一個視窗,相對工作量要少一點,派生兩個類,消息循環已經封裝在裡面,覆寫它們的虛函數,在裡面做一些初始化操作就可以了。

三、以QT為代表的第三代界面庫

QT使用了一種用QML這種描述性腳本語言配置界面的辦法,這種開發界面的方法在效率上與前面兩代産品有很大的提高,學習成本也低了很多。

在這個階段上,如果你要建立一個視窗,隻需要在QML的編輯器中進行可視化的建立修改就可以了,QT會編譯相應的QML檔案到你的應用程式中,某種程度上說,你甚至不需要懂C++也可以完成界面的基本開發。

四、以XML配置為特征的第四代界面庫

在Windows平台上,有WPF,Silverlight這樣的技術,也有XUL(FireFox所采用的UI引擎)這樣的界面庫。現在很多的國産界面庫也算作是這種類型,比如最近比較流行的DUILIB。它們的主要特征是:界面開發與邏輯控制相分離,用XML來配置界面,XML的一個節點一般就是一種控件,節點上的各個屬性控制控件的各種特征,比如位置,圖檔等等。而用另外一種語言作為對界面元素處理的邏輯控制,比如XUL用腳本語言JavaScript,WPF,Silverlight用C#,DUILIB則直接用了C++。

這個階段上,如果你要配置一個視窗可能隻需要在XML(WPF和Silverlight是XAML)裡聲明一個元素,比如

<window x=”0” y=”0” width=”400” height=”300” background=”bg.png”></window>

類似于上面這樣的一句簡單描述,就完成了一個位于螢幕左上角(0,0)起始位置,寬度為400,高度為300,背景圖檔是bg.png的視窗的配置,注意這裡說的是配置,而不是建立,因為建立需要在UI引擎解析完XML以後才會完成。

其實界面庫的發展跟計算軟硬體技術的發展有着很大關系,随着軟體複用性的提高,UI元素的複用性也在不斷提高。随着硬體技術的發展,更快的CPU,更大的記憶體,使得我們在做一些以前看上去效率比較低的處理界面的方式也具有相對良好的性能,但是又同時擁有了更好的靈活性。

現在的網際網路用戶端一般都會有自己的界面庫,也有可能采用一些開源的界面庫自己修改。據我說知QQ用的是自己開發的界面庫,PPS用的是DUILIB,最近翻了一下新出的微信PC用戶端,裡面居然也有DUILIB的授權檔案,因為界面庫的開發算是用戶端開發裡相對比較有技術含量的東西,因而難度也相對大一點,能流行開的第四代C++界面庫其實并不多,如果大家有興趣可以自行研究。

第二篇就到這裡,再往後我要介紹一下Windows界面開發的基礎,就是GDI這個東西,還會簡單介紹一下GDI的常見函數和使用方法,以及常見的坑。

多謝觀賞!