UI介面框架調研報告 ——Wxwidgets
背景:我們在OSGEARTH上的專案已經快要完成,但苦於還沒有找到一個合適的介面框架去和互動。在介面框架方面,qt已經做的成熟了,但我們考慮到一些問題,不打算用qt來做這個介面,於是便對一些現有的介面框架做了一些調研分析,首先便是Wxwidgets。
關鍵詞:介面框架;Wxwidgets
一、 什麼是Wxwidgets
wxWidgets是一個開源的跨平臺的C++構架庫(framework),它可以提供GUI(圖形使用者介面)和其它工具。wxWidgets除了可以用於開發“有介面”的程式,還提供對圖形、多媒體、網路等常見領域應用的支援。
wxWidgets是開源的,無論對於個人還是對於商業應用都是免費的。wxWidgets可以支援現今幾乎所有作業系統,包括對掌上電腦的支援。wxWidgets社群快速穩健成長,其周邊工具也越來越多。wxWidgets支援各種主流的編譯器,通過“重新編譯”的方式支援軟體的移植。wxWidgets儘可能的使用目標系統“原生的”的GUI樣式,介面與環境異常和諧。
二、 Wxwidgets的下載和安裝
1.wxWidgets的官網在http://www.wxwidgets.orgs/,下載頁面是http://www.wxwidgets.org/downloads/。作為Windows使用者,從下載頁面下載如下畫圈的兩個檔案。Windows.ZIP是wxWidgets的原始碼,Manual(HTML).zip則是在學習過程中最重要的參考。
2.下載後,將檔案Windows.ZIP解壓縮到X:/wxWidgets-3.0.0中,X代表你選擇的碟符。
3.進入X:\wxWidgets-3.0.0\build\msw中用VS2010開啟wx.dsw,等待工程從VC6到VS2010的轉換完成。
4.右擊解決方案,點選批生成,勾選所有Debug和Release(可根據需要選擇),點選生成進行編譯。
5.編譯成功後,wxWidgets-3.0.0\lib\vc_lib目錄如下所示,已生成所需庫檔案,其中u表示Release版本,ud表示Debug版本。
三、 vs下的配置
1. 新建Win32控制檯應用程式,應用程式型別勾選Windows應用程式或控制檯應用程式。新建原始檔test.cc,貼上以下程式碼。
// wxWidgets "Hello world" Program // For compilers that support precompilation, includes "wx/wx.h". #include <wx/wxprec.h> #ifndef WX_PRECOMP #include <wx/wx.h> #endif class MyApp : public wxApp { public: virtual bool OnInit(); }; class MyFrame : public wxFrame { public: MyFrame(const wxString&title, const wxPoint& pos, const wxSize& size); private: voidOnHello(wxCommandEvent& event); voidOnExit(wxCommandEvent& event); void OnAbout(wxCommandEvent&event); wxDECLARE_EVENT_TABLE(); }; enum { ID_Hello = 1 }; wxBEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(ID_Hello, MyFrame::OnHello) EVT_MENU(wxID_EXIT, MyFrame::OnExit) EVT_MENU(wxID_ABOUT, MyFrame::OnAbout) wxEND_EVENT_TABLE() wxIMPLEMENT_APP(MyApp); bool MyApp::OnInit() { //MyFrame *frame = newMyFrame("Hello World", wxPoint(50, 50), wxSize(450, 340)); MyFrame *frame = newMyFrame("Hello World", wxDefaultPosition, wxDefaultSize); frame->Show(true); return true; } MyFrame::MyFrame(const wxString& title, const wxPoint& pos, constwxSize& size) : wxFrame(NULL, wxID_ANY, title, pos, size) { wxMenu *menuFile = newwxMenu; menuFile->Append(ID_Hello,"&Hello...\tCtrl-H", "Help stringshown in status bar for this menu item"); menuFile->AppendSeparator(); menuFile->Append(wxID_EXIT); wxMenu *menuHelp = newwxMenu; menuHelp->Append(wxID_ABOUT); wxMenuBar *menuBar = newwxMenuBar; menuBar->Append(menuFile,"&File"); menuBar->Append(menuHelp,"&Help"); SetMenuBar(menuBar); CreateStatusBar(); SetStatusText("Welcometo wxWidgets!"); } void MyFrame::OnExit(wxCommandEvent& event) { Close(true); } void MyFrame::OnAbout(wxCommandEvent& event) { wxMessageBox("This is awxWidgets' Hello world sample", "About HelloWorld", wxOK | wxICON_INFORMATION); } void MyFrame::OnHello(wxCommandEvent& event) { wxLogMessage("Helloworld from wxWidgets!"); }
2.包含目錄:右擊專案,開啟專案屬性頁,配置一項選擇所有配置配置屬性->C/C++->常規->附加包含目錄 中新增:
C:\wxWidgets-3.0.0\include
C:\wxWidgets-3.0.0\lib\vc_lib\mswu
3.新增庫目錄:配置屬性->連結器->常規->附加庫目錄 中新增:
C:\wxWidgets-3.0.0\lib\vc_lib
4.MFC的使用:配置屬性->MFC的使用:使用標準Windows庫
5. 新增依賴項:配置屬性->連結器->輸入->附加依賴項按照如下規則新增:
A、配置一項改為Release
wxbase30u.lib
wxbase30u_net.lib
wxbase30u_xml.lib
wxexpat.lib
wxjpeg.lib
wxmsw30u_adv.lib
wxmsw30u_aui.lib
wxmsw30u_core.lib
wxmsw30u_gl.lib
wxmsw30u_html.lib
wxmsw30u_media.lib
wxmsw30u_propgrid.lib
wxmsw30u_qa.lib
wxmsw30u_ribbon.lib
wxmsw30u_richtext.lib
wxmsw30u_stc.lib
wxmsw30u_xrc.lib
wxpng.lib
wxregexu.lib
wxscintilla.lib
wxtiff.lib
wxzlib.lib
comctl32.lib
rpcrt4.lib
B、 配置一項改為Debug
wxbase30ud_net.lib
wxmsw30ud_html.lib
wxbase30ud_xml.lib
wxmsw30ud_adv.lib
wxmsw30ud_aui.lib
wxmsw30ud_gl.lib
wxmsw30ud_media.lib
wxmsw30ud_propgrid.lib
wxmsw30ud_qa.lib
wxmsw30ud_ribbon.lib
wxmsw30ud_richtext.lib
wxmsw30ud_stc.lib
wxmsw30ud_xrc.lib
wxscintillad.lib
wxmsw30ud_core.lib
wxbase30ud.lib
wxtiffd.lib
wxjpegd.lib
wxpngd.lib
wxzlibd.lib
wxexpatd.lib
winmm.lib
comctl32.lib
rpcrt4.lib
wsock32.lib
odbc32.lib
6.前處理器定義:
配置一項改為Debug
配置屬性->C/C++->前處理器->前處理器定義 中新增:
__WXMSW__
__WXDEBUG__
7.儲存執行,執行結果如下:
四、 Wxwidgets的優勢和不足
優勢:
1、Wxwidgets無論對於個人還是對於商業應用都是免費的!
2、 他是跨平臺的gui庫,支援的作業系統很全面,甚至支援pda(最新版本【3.0.1】支援iOS,可以在下載的原始碼包中找到wxWidgets-3.0.1.tar.bz2\wxWidgets-3.0.1\build\osx\wxiphone.xcodeproj)。
3、 wxwidgets提供的gui是大量使用巨集的,這就意味著它是在儘可能的使用目標系統native的gui樣式。
4、 它支援的編譯器也很多,而且borland也曾宣告將在c++builderx2裡邊提供對wxidgets的支援——預覽版都出來了。
不足:
首先官方文件不全(至少我覺得個官方的help遠遠不夠我的菜鳥需求,大部分都是網路上零散的教程),對STL的支援不夠,特別是沒有原始碼的開發速度快;沒有強大全面的rad工具;還沒有形成很濃的產業氣候,等等。
五、 前景與可行性
相比MFC,wxWidgets有著跨平臺和開源免費的優勢;相比Qt,wxWidgets的語法是完全C++的,不像Qt的Q_OBJECT巨集需要用moc單獨編譯出一個cpp檔案再編譯。使用wxWidgets開發的程式有很多,比較著名的有跨平臺3D遊戲0.A.D, 整合程式設計工具Code::Blocks和CodeLite,檔案傳輸工具filezilla。類似於Qt的QtDesigner介面編譯器,wxWidgets也有相應的介面開發工具,如wxSmith和wxFormBuilder,有著非常友好人機互動介面,實現介面視覺化開發。但是,Wxwidgets的介面框架是跟隨系統特徵的,太過單一,如果要實現與系統不一致的框架,需要非常複雜的實現機制。