1 體系結(jié)構(gòu)
wxWidgets的體系結(jié)構(gòu)下圖所示。wxWidgets的體系結(jié)構(gòu)可以分為4層:wxWidgets公共API層,各個平臺Port,用于各個平臺的API以及操作系統(tǒng)。
2Libraries 列表
從版本 2.5.0以后,wxWidgets既可以編譯成單一的一個大的ibrary(monolithicbuild),也可以編譯成幾個小的 libraries(multilib build)。WxWidgets默認(rèn)的是編譯成multilib build。
下圖列出了wxWidgetslibraries以及他們之間的依賴關(guān)系。
1)wxAui
包含著高級用戶界面 docking library。
2) wxBase
所有wxWidgets程序都必須鏈接本 library。包含了許多數(shù)據(jù)結(jié)構(gòu)類以及其他公共基類(如wxString,wxWindowbase等)。抽象了平臺間的不同。wxBase 可以用來開發(fā)控制臺程序,不需要任何GUI libraries。
3) wxNet
網(wǎng)絡(luò)開發(fā)有關(guān)類:
wxSocket 類(wxSocketClient, wxSocketServer以及其他相關(guān)類)
wxSocketOutputStream 和 wxSocketInputStream
sockets-basedIPC 類 (wxTCPServer, wxTCPClientand wxTCPConnection)
wxURL
wxInternetFSHandler(a wxFileSystem handler)。
4) wxRichText
通用 rich text 控件。
5) WxXML
包含解析XML文檔的類。不建議使用。將來的版本將包含新的XML處理類,包含類似DOM的API。
6) wxCore
基本GUI類,如 GDI類或控件。所有wxWidgets GUI 應(yīng)用程序必須引用本庫。
7) wxAdvanced
高級或是不常用的GUI類。
wxBufferedDC
wxCalendarCtrl
wxGridclasses
wxJoystick
wxLayoutAlgorithm
wxSplashScreen
wxTaskBarIcon
wxSound
wxWizard
wxSashLayoutWindow
wxSashWindow
8) wxMedia
多媒體類。目前僅包括wxMediaCtrl,將來將加入更多的類。
9) wxGL
包含wxGLCanvas 集成OpenGL library。與其他類不同的是,本library不是 monolithiclibrary的一部分,而是總是編譯成一個獨(dú)立的library。
10) wxHTML
HTML renderer及其相關(guān)類。
11 )wxODBC
數(shù)據(jù)庫類。
12 )wxQA
質(zhì)量保證類庫。目前僅有 wxDebugReport以及相關(guān)類。
13 )wxDbGrid
wxDbGridTableBase 類組合了wxGrid and wxDbTable。
14 )wxXRC
包含wxXmlResource類,讀取XRC 格式的XML資源文件。
3內(nèi)部代碼組織結(jié)構(gòu)
如圖,是wxWidgets源代碼組織結(jié)構(gòu),大體可以分為六層:
1 )通用代碼部分(位于common目錄內(nèi))。被所有的版本使用,包括數(shù)據(jù)結(jié)構(gòu),運(yùn)行期類型信息,一些被其他類繼承的基類,如wxWindowBase等。
2) 一般代碼部分(位于generic目錄內(nèi))。實(shí)現(xiàn)與平臺無關(guān)的高級 widgets。如 wxWizard 和wxCalendarCtrl等。
3) wxUniversal部分(位于univ目錄內(nèi))?;敬翱诳丶?,可以用于不提供本地窗口控件的平臺如X11和MGL使用。
4 )平臺相關(guān)代碼(位于gtk、msw等目錄內(nèi))。使用本地API實(shí)現(xiàn)類。
5)外來代碼部分,放在一個單獨(dú)的目錄結(jié)構(gòu)中(contrib目錄,本圖沒有列出,位于上一級目錄)。
6)第三方代碼(位于jpeg,png,regex,zlib等目錄中),這些都是獨(dú)立于wxWidgets的項(xiàng)目,但是wxWidgets使用來實(shí)現(xiàn)許多重要的功能。
wxWidgets libraries和內(nèi)部代碼組織具有交叉關(guān)系。如wxNet庫里既包含通用代碼又包括平臺相關(guān)代碼部分,其他的庫又可能包括一般代碼部分。
4 類繼承關(guān)系
如圖,列舉了wxBase和wxCore中部分類的繼承關(guān)系。
其中wxObject是其他絕大部分類的基礎(chǔ),是萬類之首。凡派生于wxObject的類,得以繼承數(shù)個面向?qū)ο蟮闹匾匦?,包括RTTI(執(zhí)行期類型識別),Dynamic Creation(動態(tài)生成)等。
其中wxWindowGTK和wxTopLevelWindowGTK是于平臺有關(guān)的類,源碼位于gtk目錄下。Window下對應(yīng)的類是wxWindowMSW和wxTopLevelWindowMSW,位于msw目錄下。當(dāng)編譯代碼時,wxWidgets怎么知道編譯哪一個類呢?主要是wxWidgets通過不同的宏定義來實(shí)現(xiàn)的:
在app.h中,你可以發(fā)現(xiàn)以下代碼:
- #if defined(__WXPALMOS__)
- #include "wx/palmos/app.h"
- #elif defined(__WXMSW__)
- #include "wx/msw/app.h"
- #elif defined(__WXMOTIF__)
- #include "wx/motif/app.h"
- #elif defined(__WXMGL__)
- #include "wx/mgl/app.h"
- #elif defined(__WXDFB__)
- #include "wx/dfb/app.h"
- #elif defined(__WXGTK20__)
- #include "wx/gtk/app.h"
- #elif defined(__WXGTK__)
- #include "wx/gtk1/app.h"
- #elif defined(__WXX11__)
- #include "wx/x11/app.h"
- #elif defined(__WXMAC__)
- #include "wx/mac/app.h"
- #elif defined(__WXCOCOA__)

- #include "wx/cocoa/app.h"
- #elif defined(__WXPM__)
- #include "wx/os2/app.h"
類似的在window.h中,你可以發(fā)現(xiàn):
- #if defined(__WXMSW__)
- #define wxWindowNative wxWindowMSW
- #elif defined(__WXGTK__)
- #define wxWindowNative wxWindowGTK
- #elif defined(__WXMGL__)
- #define wxWindowNative wxWindowMGL
- #elif defined(__WXX11__)
- #define wxWindowNative wxWindowX11
- #elif defined(__WXMAC__)
- #define wxWindowNative wxWindowMac
- #endif
- class WXDLLEXPORT wxWindow :public wxWindowNative
- {
- ......
- }
通過指定不同的編譯開關(guān),可以編譯出平臺相關(guān)的類庫。
參考文獻(xiàn)
《Cross-Platform GUI Programming withwxWidgets》,Julian Smart and KevinHock with Stefan Csomor.
《wxWidgets 2.8.9: A portable C++ andPython GUI toolkit》,Julian Smart,Robert Roebling, Vadim Zeitlin, Robin Dunn, et al
轉(zhuǎn)載自:http://hi.baidu.com/zshua_404/blog/item/a10155393d4c3623b8998feb.html
愛華網(wǎng)



