1. 程式人生 > >UI介面框架調研報告 ——Wxwidgets

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,等待工程從VC6VS2010的轉換完成。

 

4.右擊解決方案,點選批生成,勾選所有DebugRelease(可根據需要選擇),點選生成進行編譯。


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的優勢和不足

優勢:

1Wxwidgets無論對於個人還是對於商業應用都是免費的!

2、 他是跨平臺的gui庫,支援的作業系統很全面,甚至支援pda(最新版本3.0.1支援iOS,可以在下載的原始碼包中找到wxWidgets-3.0.1.tar.bz2\wxWidgets-3.0.1\build\osx\wxiphone.xcodeproj)。

3wxwidgets提供的gui是大量使用巨集的,這就意味著它是在儘可能的使用目標系統nativegui樣式。

4、 它支援的編譯器也很多,而且borland也曾宣告將在c++builderx2裡邊提供對wxidgets的支援——預覽版都出來了。

不足:

首先官方文件不全(至少我覺得個官方的help遠遠不夠我的菜鳥需求,大部分都是網路上零散的教程),對STL的支援不夠,特別是沒有原始碼的開發速度快;沒有強大全面的rad工具;還沒有形成很濃的產業氣候,等等。

五、 前景與可行性

相比MFCwxWidgets有著跨平臺和開源免費的優勢;相比QtwxWidgets的語法是完全C++的,不像Qt的Q_OBJECT巨集需要用moc單獨編譯出一cpp檔案再編譯。使用wxWidgets開發的程式有很多,比較著名的有跨平臺3D遊戲0.A.D, 整合程式設計工具Code::Blocks和CodeLite,檔案傳輸工具filezilla。類似於Qt的QtDesigner介面編譯器,wxWidgets也有相應的介面開發工具,如wxSmithwxFormBuilder,有著非常友好人機互動介面,實現介面視覺化開發。但是,Wxwidgets的介面框架是跟隨系統特徵的,太過單一,如果要實現與系統不一致的框架,需要非常複雜的實現機制。