wxWidgets初學者導引(4)——wxWidgets學習資料及利用方法指導

迂者-賀利堅發表於2014-05-18

4 wxWidgets學習資料及利用方法指導

  初學者常苦於找不到參考資料。實際上,是找不到,不是沒有。真正有用的資料,常常也就在手邊,只是不知道。有能力熟練地使用一切能用得著的資料,這是水平提高的指標之一。這種能力,同樣,也是在實踐中獲得,而不是有誰為你講一堂課就能得到。

  本章的學習資料,從最一般的——書籍開始談起。


4.1 關於C++ wxWidgets的書籍


4.1.1 《使用wxWidgets進行跨平臺程式開發》

  關於wxWidgets的書籍還真少見,從亞馬遜上只查到一本《使用wxWidgets進行跨平臺程式開發》(http://www.amazon.cn/gp/product/B00A1WDQ30),部分電子版(含書中例程的原始碼,從http://download.csdn.net/detail/cjylg/2997827下載)。看得好,請支援紙質出版。

  這本書的英文版叫《Cross Platform GUI Programming With wxWidget》(見http://www.wxwidgets.org/docs/book/),我瀏覽過其中的一部分,讀起來不難。


4.1.2 wxwidgetsWiki主頁

  我推薦閱讀的是wxwidgetsWiki主頁(http://wiki.wxwidgets.org/Main_Page)中的Guides & Tutorials部分(http://wiki.wxwidgets.org/Guides_%26_Tutorials)連結的一個教程《wxWidgets tutorial》(http://zetcode.com/gui/wxwidgets/)。寫作時再次看wxwidgetsWiki主頁,發現其中的寶,太多了。開源社群的貢獻者不僅提供軟體的共享,而且將這種共享精神延續到指導書籍,必須贊。


4.1.3 wxWidgets tutorial

  《wxWidgets tutorial》是我極力推薦的一個線上教程。其中的敘述很少,一直在用小例子,啟發讀者獲得對wxWidgets的認知。我一邊讀程式碼,一邊練習,完成了一次愉快的學習之旅。《wxWidgets tutorial》最後一章開發了一個俄羅斯方塊遊戲,當看完並同步練習完之時,也就是掌握了用wxWidgets開發應用程式的基本路數之時。

  為方便讀者,我將這個教程中整理到一個Word文件中,作為本教程的一個附件,一起打包供下載使用。在Word文件中,加入了部分批註,是我在學習中查閱得到的線索。

  唯一引發本文讀者不爽的是,《wxWidgets tutorial》是英文版的。這其實是個好事,在這個時代,靠著翻譯來的二手中文書還想學到新技術,不拍腦袋也知道這只是天方夜譚的事。不斷學習英語,是IT學生的學習形態。我一直鼓勵同學們“在用英語中學英語”(見http://blog.csdn.net/sxhelijian/article/details/12177147),這就是一個大好的時機。是否能看下去,不決定於你英語水平的高低,而是決定於你的心態。再進一步,這本書中的描述性文字很少,即使高考英語時是在考場抓鬮決定ABCD的,也能看下去,只要去看。


4.2 用好wxWidgets的線上文件

  在網際網路時代,另一類資料必須引起學習者的注意,那就是線上的文件和教程。

  到wxWidgets的主頁http://www.wxwidgets.org/中看看,其中Documentation部分的每一個連結,各自都連線著一座寶庫,如下圖:

   


4.2.1 成熟平臺常有線上文件

  用微軟平臺開發程式時,最好的參考是MSDNhttp://msdn.microsoft.com/library/),而用Java開發時,有Java SE 6 Documentationhttp://docs.oracle.com/javase/6/docs/index.html),也有部分內容被翻譯成中文(http://www.javaweb.cc/JavaAPI1.6/)。在軟體開發過程中,需要的類、函式、巨集是記不住的。有線上文件查詢,專業人員不記這些。大多數成熟的平臺,既提供真正線上的文件,這些文件也可以下載到本地,通過瀏覽器閱讀。


4.2.2 wxWidgets的線上文件

  wxWidgets也有線上文件(http://docs.wxwidgets.org/3.0/),在2.1,要求讀者下載了Manual(HTML).zip

  現在請選擇一個自己用著習慣的資料夾,將Manual(HTML).zip解壓縮。我解壓縮到了F:\wxWidgets-3.0.0-docs-html。找到其中的index.html檔案,雙擊開啟,如下圖所示,這就是將有大用的最佳參考。

   

  建議用滑鼠右擊index.html檔案,在選單中選擇“傳送到->桌面快捷方式”。在桌面上建立開啟線上文件的快捷方式,將方便以後的使用。


4.2.3 查詢線上文件

  線上文件通過超連結組織起相關材料之間的聯絡。作為實踐,將各個連結點一點,你會有感覺。

  舉一個例子。在《wxWidgets tutorial》中,Menus and Toolbars部分第一節Simple menu example中的例程,有一段如下程式碼:

SimpleMenu::SimpleMenu(const wxString& title)
   : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(280, 180))  //下面的例子,要通過線上文件查一查建構函式的引數
{
  menubar = new wxMenuBar;
  file = new wxMenu;
  file->Append(wxID_EXIT, wxT("&Quit"));//練習:想知道Append函式的情況
  menubar->Append(file, wxT("&File"));
  SetMenuBar(menubar);
 
  Connect(wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED,
      wxCommandEventHandler(SimpleMenu::OnQuit));
  Centre();
}

  現在想知道wxFrame類的建構函式中的各引數含義,要點的連結是:Class->Class Index ->FwxWidgets中類的命名均以wx開頭,取wxFrame中的F),如下圖:

   

  接著,在“wxFrame Class Reference”頁面,可以看到wxFrame類同其他類的繼承關係以及其他資訊,如下圖:

   

  我們關心wxFrame類的建構函式,繼續往下看,可以在“Constructor & Destructor Documentation”部分看到建構函式的定義及說明:

wxFrame::wxFrame

(

wxWindow * 

parent,

 

 

wxWindowID 

id,

 

 

const wxString & 

title,

 

 

const wxPoint & 

pos = wxDefaultPosition,

 

 

const wxSize & 

size = wxDefaultSize,

 

 

long 

style = wxDEFAULT_FRAME_STYLE,

 

 

const wxString & 

name = wxFrameNameStr 

 

)

 

 

Constructor, creating the window.

Parameters

parent

The window parent. This may be NULL. If it is non-NULL, the frame will always be displayed on top of the parent window on Windows.

id

The window identifier. It may take a value of -1 to indicate a default value.

title

The caption to be displayed on the frame's title bar.

pos

The window position. The value wxDefaultPosition indicates a default position, chosen by either the windowing system or wxWidgets, depending on platform.

size

The window size. The value wxDefaultSize indicates a default size, chosen by either the windowing system or wxWidgets, depending on platform.

style

The window style. See wxFrame class description.

name

The name of the window. This parameter is used to associate a name with the item, allowing the application user to set Motif resource values for individual windows.

  這裡,建構函式的引數、返回值一目瞭然,各個引數的含義、用法、預設值也可以看到。這是最佳的第一手的開發參考資料。

   

  下面請做一個練習。在讀下面的程式時,想知道Append函式的情況。如何利用線上文件找到說明?請找到後,再找一遍真正學會。

  關於上面的程式碼中還有哪些疑問,試著通過線上文件給出解答。


4.2.4 檢視線上文件的裝置支援

  如果有條件,佈置如下圖所示的工作條件。用雙屏,一個看文件,一個寫程式。

   

  當前的學習,有很多時候用電子版的參考資料。開發中查閱線上文件,是件相當頻繁的事情,雙螢幕的配置成為需要。

  當然,作為在校學生,當場地受限時,也不必太糾結這樣的條件了。畢竟,這不是必須。


4.3 在程式設計環境中找幫助

  本文使用的程式設計環境是Code::BlocksC++編碼規範中,將類宣告、常變數宣告、巨集定義等儲存在標頭檔案(.h)中,而將類、函式的實現用原始檔(.cpp)儲存。標頭檔案實際上就是一個非常好的幫助文件。符合規範要求的開發者,通過恰當的命名,總能夠讓程式的閱讀者“見文知義”,從標頭檔案中得到足夠的資訊。

  在Code::Blocks中,為找到這些資訊提供了足夠的支援。其實,其他IDE,也能做到這一點。

  例如,對於4.2.3中的那一段程式碼:

SimpleMenu::SimpleMenu(const wxString& title)
   : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(280, 180))
{
  menubar = new wxMenuBar;
  file = new wxMenu;
  file->Append(wxID_EXIT, wxT("&Quit"));  //例
  menubar->Append(file, wxT("&File"));    //練習
  SetMenuBar(menubar);
 
  Connect(wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED,
      wxCommandEventHandler(SimpleMenu::OnQuit));
  Centre();
}

  現在,想知道file->Append(wxID_EXIT, wxT("&Quit"));一句中Append函式各引數的含義。由上一句可以看出,file是wxMenu類的例項,只要看wxMenu類的宣告即可。於是,在Code::Blocks中,單擊滑鼠右鍵,單擊在在選單中出現的“Find declaration of: wxMenu”選項,如圖:

   

  在Code::Blocks中,將開啟新的頁籤,顯示wxMenu類的宣告。但是wxMenu類並沒有Append這樣的成員函式,發現wxMenu類是wxMenuBase類的派生類,推斷Append應該是繼承自wxMenuBase類的成員函式。用相同的操作,在wxMenuBase類名上單擊滑鼠右鍵並選擇對應的選項,在新出現的頁籤中,找到了Append成員函式的4種過載形式的的宣告,如下圖所示。

   

 

  現在做一個練習。找出menubar->Append(file, wxT("&File"));中Append函式的宣告,從中看出其呼叫的方法。


4.4 深入學習路線建議


4.4.1 看書的策略

  在完成本文前3章的工作之後,建議同時看《使用wxWidgets進行跨平臺程式開發》和《wxWidgets tutorial》這兩本書,同步地實踐書中的程式。

  同步看,意味著交叉、重複再看。可以先執行例程,有感性認識之後再閱讀程式碼。一次看不明白不要緊,繼續往後看,或者看另外一本書的相關部分,當再次看時,問題或許能夠自然化解。

  我在學習中,看完了《使用wxWidgets進行跨平臺程式開發》的前兩章,然後將《wxWidgets tutorial》從頭看到完,再看《使用wxWidgets進行跨平臺程式開發》中的後面部分時,常能聯絡起《wxWidgets tutorial》中執行過的例子。這種安排的體驗,感覺不錯。

  在Code::Block中頻繁新建專案很麻煩,況且每建一個專案還得設定Build options...。我的做法是,建立了一個只包含一個原始檔的專案。所有的練習,都是將程式碼貼上到這個檔案中完成,這節約了不少時間。

  《wxWidgets tutorial》中的例子寫得非常規範,嚴格執行了.h標頭檔案中寫宣告,.cpp原始檔中寫實現的要求。我在實踐時,偷了個懶,將本應放在多個檔案中的內容,貼上到前述的一個檔案中。當然,諸如

#include <wx/wx.h>
#include <wx/menu.h>

之類的包含標頭檔案要保留,而

#include "menu.h"

  之類的自定義標頭檔案的包含命令,需要刪除。因為合併到了同一個檔案中,這些標頭檔案根本不存在。


4.4.2 更多的案例

  安裝好的wxWidgets中還提供了很多演示和示例的專案。X:\wxWidgets-3.0.0\demos中是所有的演示案例,示例的專案在X:\wxWidgets-3.0.0\samples中,學習到一定時候,執行這些程式,讀一讀原始碼,是一種很好的學習方式。

  例如,wxWidgetsDemo中的一個專案forty,是一個紙牌遊戲,執行結果如下圖:

   

  這個專案中的原始檔如下圖所示:

   

  在Code::Block中新建一個專案,將Demo\forty中所有.cpp.h檔案複製到專案所在資料夾中,並通過滑鼠右擊專案名,在彈出選單上選Add file...的方式將檔案加入專案,成為專案的原始檔和標頭檔案。Demo為適應多種平臺,提供了很多的檔案,一般只需要.cpp.h檔案即可,如上圖中加了方框的部分。

  如果專案中有.xpm檔案(並不是每個專案都有),也請將這種檔案複製過去,這是一種圖形格式檔案,程式中一般會用到。專案forty中就有3個這樣的檔案。

  在更極少數情況下,還可能有其他檔案需要複製過去。這可以通過讀程式碼,看源程式中是否寫了這個檔名。偷懶的辦法,執行程式,若由於找不到檔案出錯了,會提示還需要哪個檔案。比如專案forty中的about.htm檔案。

  後兩類檔案複製過去即可,是為支援程式執行的,不必通過Add file...將其加入專案。

  執行其他專案,方法類似。




================= 迂者 賀利堅 CSDN部落格專欄=================
|== IT學子成長指導專欄 專欄文章的分類目錄(不定期更新) ==|
|== C++ 課堂線上專欄  賀利堅課程教學連結(分課程年級) ==|
|== 我寫的書——《逆襲大學——傳給IT學子的正能量》    ==|
===== 為IT菜鳥起飛鋪跑道,和學生一起享受快樂和激情的大學 =====



相關文章