在vs2010的開發環境下進行wxWidgets開發入門

wxWidgets是一個歷史悠久、基礎雄厚的,可跨多種平臺的基於C++的、開源的多功能圖形用戶界面庫。支持Windows、OSX、Linux和Unix的32位和64位結構,同時還支持一些移動平臺。如果對C++不熟,wxWidgets庫同時還支持Python、Perl、Ruby和其他的語言的封裝。WxWidgets生成的程序,會讓程序外觀和本地平臺一樣,這和QT只是自己繪製界面風格不太一樣。最初它曾被命名wxWindows,它受着Windows的MFC的深遠影響,很多概念都和MFC很類似,最初命名的基本含義也就是MFC的移植庫,後面爲了不讓使用者引起“只能在Windows下使用”的歧義,才正式改名爲wxWidgets。

 

1、下載wxWidgets 3.1.0和vs2010

·        下載wxWidgets源碼包(官網),我用的是3.1.0版;

·        安裝Visual Studio。我用的是VS 2010;

下載地址:http://sourceforge.net/projects/wxwindows/files/?source=navbar

我下載的地址是https://github.com/wxWidgets/wxWidgets

下載完以後安裝到任意目錄下。(其實就相當於解壓縮一下,下載的是源代碼)

2、編譯源碼

a、解壓wxWidgets的源碼包,會得到一大堆文件。進入build\msw文件夾,這個文件夾內是專門爲Visual Studio提供的工程文件。在裏面能找到從VC7到V12的工程文件。我用的是VS 2010所以選擇的是VC10。


b、開始編譯。因爲我們下載的是源文件,而要將其轉化爲庫文件(如果對庫的概念不是很瞭解可以上網查查)就需要編譯整個解決方案,對於編譯時間大家不用擔心,非常的快!!!編譯24個項目大概花3-4分鐘的樣子。

3、通過一個helloWorld初識wxWidgets

(1)、建立測試項目配置項目屬性:

首先建立一個Win32空項目或者直接空項目都可以(注意:如果建控制檯項目後面會報錯)。

將下面的測試源代碼加入到一個cpp文件中。

1.    #include "wx/wx.h" 

2.    class MyApp: public wxApp[DD1]  

3.    { 

4.        virtual bool OnInit(); 

5.    };

6.    DECLARE_APP(MyApp)[DD2] 

7.    class MyFrame: public wxFrame[DD3]  

8.    { 

9.    public: 

10.      MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size); 

11.      void OnQuit(wxCommandEvent& event); 

12.      void OnAbout(wxCommandEvent& event); 

13.      DECLARE_EVENT_TABLE() [DD4] 

14.  }; 

15.  enum[DD5]  

16.  { 

17.      ID_Quit = 1, 

18.      ID_About, 

19.  }; 

20.  BEGIN_EVENT_TABLE(MyFrame, wxFrame) 

21.      EVT_MENU(ID_Quit,  MyFrame::OnQuit) 

22.      EVT_MENU(ID_About, MyFrame::OnAbout) 

23.  END_EVENT_TABLE()  [DD6] 

24.  bool MyApp::OnInit()[DD7]  

25.  { 

26.      MyFrame *frame = new MyFrame(wxT[DD8] ("Hello World"), wxPoint(50, 50), wxSize(450, 340) ); 

27.      frame->Show(true); 

28.      SetTopWindow(frame); 

29.      return true; 

30.  } 

31.  MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) 

32.         : wxFrame(NULL, -1, title, pos, size) 

33.  { 

34.      wxMenu *menuItem = new wxMenu; 

35.      menuItem ->Append( ID_About, wxT("&About...") ); 

36.      menuItem ->AppendSeparator(); 

37.      menuItem ->Append( ID_Quit, wxT("E&xit") ); 

38.      wxMenuBar *menuBar = new wxMenuBar; 

39.      menuBar->Append(menuItem, wxT("&File") ); 

40.      SetMenuBar( menuBar ); 

41.      CreateStatusBar(); 

42.      SetStatusText(wxT("Welcome to wxWidgets!") ); 

43.  } 

44.  void MyFrame::OnQuit[DD9] (wxCommandEvent& WXUNUSED(event)) 

45.  { 

46.      Close[DD10] (true); 

47.  } 

48.  void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) 

49.  { 

50.      wxMessageBox(wxT("This is a wxWidgets Hello world sample"), 

51.                    wxT("About Hello World"),  

52.                    wxOK | wxICON_INFORMATION, this ); 

53.  } 

54.  IMPLEMENT_APP(MyApp) [DD11] 

 

現在編譯這個文件顯然是通不過的,下面要對編譯選項進行配置

(2)、包含目錄:

在項目——屬性——VC++目錄——附加包含目錄下加入wxWidgets庫的頭文件(此頭文件是安裝文件夾裏的include文件夾)


這樣系統就能知道你引用的頭文件來自哪裏了

(3)、包含庫目錄(讓系統知道你即將使用的庫文件來自哪裏。)

項目——屬性——VC++目錄——庫目錄在庫目錄里加入wxWidgets安裝文件夾下的lib/vc_lib文件夾



(4)、使用庫。

把項目要用到的lib附加到項目屬性中

項目--屬性--鏈接器--輸入--附加依賴庫項,編輯這裏要非常注意!!!

加入庫名稱:

1.    wxmsw31ud_core.lib 

2.    wxbase31ud.lib 

3.    wxtiffd.lib 

4.    wxjpegd.lib 

5.    wxpngd.lib 

6.    wxzlibd.lib 

7.    wxregexud.lib 

8.    wxmsw31ud_adv.lib 

9.    wxmsw31ud_html.lib 

10.  wxmsw31ud_xrc.lib 

11.  wxbase31ud_net.lib 

12.  wxbase31ud_xml.lib 

13.  wxexpatd.lib 

14.  winmm.lib 

15.  comctl32.lib 

16.  rpcrt4.lib 

17.  wsock32.lib 

 

(5)編譯、運行,就出現瞭如下界面了:

 

4、通過分析上述helloWorld例程,深入wxWidgets編程框架

 


 [DD1]wxApp:應用程序類

繼承自該類的子類至少需要定義一個OnInit函數。

 [DD2]DECLARE_APP(MyApp)聲明應用程序實例,便於用戶調用wxGetApp()函數獲得應用程序實例的引用。

聲明應用程序實例,便於用戶調用wxGetApp()函數獲得應用程序實例的引用。

 [DD3]wxFrame:框架窗口類

一個Frame窗口是一個可以容納別的窗口的頂級窗口,通常擁有一個標題欄和一個菜單欄。

 [DD4]DECLARE_EVENT_TABLE()聲明事件表,告訴wxWidgets這個類想要自己處理某些事件。

 [DD5]用枚舉自定義標識符。通常,可以通過枚舉、常量或者宏定義的方式來自定義識符。

 [DD6]

BEGIN_EVENT_TABLE(MyFrame, wxFrame)  
 
END_EVENT_TABLE() 

實現事件表,告訴wxWidgets來自用戶或者其他地方的事件應該怎樣和類的成員函數對應起來。

 [DD7]bool MyApp::OnInit()函數通常應該創建一個窗口,對傳入的命令行參數進行解析,爲應用程序進行數據設置和其他的一些初始化操作。如果該函數返回爲true,wxWidgets將開始事件循環用來接收用戶輸入,並在必要時處理這些輸入;如果該函數返回爲false,wxWidgets將會釋放它內部已經分配的資源,然後結束整個程序的運行。

 [DD8]wxT宏

作用是,讓代碼兼容Unicode模式,與另外一個_T宏的作用是完全一樣的。使用這個宏不會帶來運行期的性能損失。(此外,還有”_()”標記,是用來告訴wxWidgets將其中的字符串翻譯成指定語言的版本。)

 [DD9]

void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) 

事件處理函數的實現。

 [DD10]事實上,Close(true);函數並不直接關閉frame窗口,而是產生一個wxEVT_CLOSE_WINDOW事件,這個事件的默認處理函數會調用wxWindow::Destroy函數釋放frame窗口。

 [DD11]MPLEMENT_APP(MyApp) 創I建MyAPP實例。


5、wxWidgets程序一般執行過程

1. 依照系統平臺的不同,不同的main函數或者winmain函數或者其它類似的函數被調用(這個函數是由wxWidgets內部提供的,而不是由應用程序提供的)。wxWidgets 初始化它自己的數據結構並且創建一個MyApp的實例。

2. wxWidgets調用MyApp::OnInit函數,這個函數會創建一個MyFrame的實例。

3. MyFrame的構造函數通過它的基類wxFrame的構造函數創建一個窗口,然後給這個窗口增加圖標,菜單欄和狀態欄。

4. MyApp::OnInit函數顯示主窗口並且返回真。

5. wxWidgets開始事件循環,等待事件發生並且將事件分發給相應的處理過程。

應用程序會在以下情況下退出:主窗口被關閉,用戶選擇退出菜單或者系統按鈕和系統菜單中的關閉選項(這些系統菜單和系統按鈕在不同的系統中就往往千差萬別了)。

 

5、學習材料清單

wxWidgets 的官網:http://www.wxwidgets.org/downloads/

 

wxWidgets的在線文檔:http://docs.wxwidgets.org/3.1/

 

wxWidgets 的下載頁面:http://www.wxwidgets.org/downloads/

 

在線教程《wxWidgetstutorial》:網址在http://zetcode.com/gui/wxwidgets/

 

wxwidgets 的Wiki 主頁:http://wiki.wxwidgets.org/Main_Page

 

Wxwidgets Wiki 的Guides & Tutorials:http://wiki.wxwidgets.org/Guides_%26_Tutorials

 

深入wxSmith的教程:http://wiki.codeblocks.org/index.php?title=WxSmith_tutorials

 

6、深入學習路線

看書策略:

建議同時看《使用wxWidgets 進行跨平臺程序開發》和《wxWidgets tutorial》這兩本書,同步地實踐書中的程序。

案例練習:

源碼包解壓後,其中.\samples目錄提供了很多演示和示例的項目。

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章