wxWidgets GUI 編程介紹
導論
wxWidgets 是C++的跨平臺開發框架。它由 Julian Smart 于1992年在愛丁堡大學人工智能應用研究院發起的,自那之后,該框架分發到了眾多平臺之上。
本文旨在引導初學者安裝所需資源并以Code::Blocks作為IDE使用wxWidgets開發一個單應用程序。
什么是wxWidgets
wxWidgets 是一系列C++庫,它遵循多平臺GUI開發框架的設計規則。它有類似于MFC易于使用的API。把它和特定的庫鏈接并編譯,可是你的應用程序與目標平臺的界面相似。wxWidgets 是一個非常完整的框架,它幾乎為你任何需求提供解決方案,并簡化使用習慣。
為什么是wxWidgets
對于跨平臺GUI開發有很多可選的選項。可能最流行的是Java,但是對于許多應用程序而言這不是一個有效率的選擇。在C++中有QT,一個非常不錯的框架,但是它也有許多不足之處,第一點,它是仿平臺外觀的,而wxWidgets使用平臺庫創建圖形接口;第二點,在你寫的代碼與最終被編譯的C++代碼之間,QT采用了一種與眾不同的方式去使用一個專屬的層。這里不提及微軟的可視化框架,它只能工作在windows上,與它類似還有mono.net,它是搭建在層上的層。
與之相反的例子wxWidgets是C++的,它是高效的,并且不用在你的代碼上添加額外的層。它是一個類庫的集合,因此你可以使用C++編譯器去編譯它,不是說每一種C++編譯器都可以,但是大多數通用的都可以。
其他的優勢和特點:
-
它一直在被開發,還有很多支持,更是協作的開放源代碼社區。
</li> -
它完全免費,無論是私人用途還是商業用途。
</li> -
有大量的在線文檔。
</li> -
容易學習,它就是C++。
</li> -
有很多現成的類和庫,參看這里。
</li> </ul>開始
讓我們開始工作吧. 首先我們需要框架本身和IDE讓我們可以開始開發。然后我們可以做些魔術,把“hello,world“打到我們的屏幕上。
安裝
我會展示windows環境的安裝步驟,其他操作系統也類似。我使用Code::Blocks作為IDE因為它和wxWidgets結合的很好,并且它對windows和linux都有免費的穩定版本。
1. 下載和安裝Code::Blocks
你可以從它自己的官網網址【http://www.codeblocks.org/downloads/26】去下載二進制版本,我建議你下載最新的mingw的穩定版本呢,現在最穩定版本是codeblocks-13.12mingw-setup,它會自帶mingw編譯器。下載并且安裝,就像其他經典的windows安裝程序一樣。或許你需要把 mingw/bin寫到環境變量PATH中,如果有人不知道怎么做,我可以增加更詳細的步驟。
2. 下載,安裝和編譯wxWidgets
你可以從wxWidgets的存儲庫中下載wxWidgets資源。下載wxMSW安裝器或者ZIP,因為安裝程序就是一個壓縮文件夾。下載穩定的realease 2.8.12版本,因為它是最兼容Code::Block的分支。
如果你已經下載安裝器或者ZIP文件,就把它安裝或者解壓到C:\目錄下。然后在標準的windows控制臺上打開命令行shell(cmd),更改wxWidgets的生成目錄。
關鍵是去編譯wxWidgets的時候,使用一樣的編譯器,你會在稍后開發的時候使用到。如果你已經安裝了Code::Block IDE和mingw,并且添加路徑(mingw/bin)到環境變量中,這樣你就不會有任何問題。
cd <wxwidgets>\build\msw
<wxwidgets>是你提取資源的路徑(典型的是 C:\wxWidgets-2.8.12)。
你必須執行生成命令,gcc編譯器可以像這樣輸入:
mingw32-make -f makefile.gcc BUILD=release SHARED=1 MONOLITHIC=1 UNICODE=1 CXXFLAGS=-fno-keep-inline-dllexport
花點時間去看看編譯的變量,這樣你就可以選擇更適合你的需要變量選項:
BUILD:wxWidget的生成類型。在大多數情況下你會使用‘release’選項,因為你不會去調試wxWidgets本身。你可以調試你自己的程序鏈接到一個release版本的wxWidgets。
SHARED: 這個變量定義了鏈接類型: 動態鏈接 (SHARED=1)下你必須把所需要的DLL和你的程序一同發布,而在靜態鏈接(SHARED=0)下你只需要發布你的程序本身。動態鏈接下生成的程序體積更小,但你需要相應的DLL才能運行它。
MONOLITHIC: 控制編譯生成一個DLL(MONOLITHIC=1)還是多個DLL(MONOLITHIC=0)。當monolithic開關打開時,開發更加簡單,你只需要在發布你的程序時攜帶一個DLL;然而monolithic開關關閉時,鏈接過程會更有效率,因為這樣避免了鏈接整個wxWidget代碼庫。
UNICODE: 定義wxWidget和你的程序是使用寬字符字符串(UNICODE=1)還是ANSI(UNICODE=0)。強烈建議使用wxWidget的 _("string") 和 _T("string") 宏來確保你的硬編碼字符串格式正確。
現在,wxWidgets已經編譯完畢,那么就讓我們開始寫幾個以它為框架的程序吧。
新建工程
1.首先啟動Code::Blocks,點擊“創建新工程”
2.在項目選擇窗口中選擇wxWidget
3.現在你需要選擇wxWidgets版本。請確保選擇你當前安裝的版本。本教程中,請選擇2.8.x
4. 然后會出現一個項目命名窗口。在這里,你可以為命名項目并且選擇存儲位置。我這里取名為HelloWorld
5. 現在,你需要選擇GUI Builder,這是一個幫助你在圖形化界面下創建圖形化界面的工具。我們這里選擇xwSmith。在應用類型中,選擇Frame Based
6. 下一步,請選擇你電腦本地wxWidgets的位置。最好的選擇是保持全局環境變量不變。點擊下一步時,將會彈出全局變量菜單,所以你必須在base欄中填入wxWidgets的路徑。如果你改變了wxWidgets的位置,你需要在Code::Blocks配置中編輯全局變量。
7. 選擇編譯器。默認GCC編譯器就可以了。
8. 現在,你有許多配置選項。在第一個選項中,你需要保證這個選項和你構建wxWidgets時使用同樣的選項。
“Use wxWidgets DLL”, 如果你構建時SHARED=1,請選擇該項。
“wxWidgets is built as a monolithic library”, 如果你構建時MONOLITHIC=1,請選擇該項。
“Enable unicode”, 構建時UNICODE=1,請選擇該項。
舉例來說,在上述截圖中我并沒有選擇Use wxWidgets DLL是因為我在構建wxWidgets時使用了SHARED=0.
在Configure Advance Options前打勾。
9. 最后一個窗口,確保Use __WXDEBUG__ and Debug wxWidgets lib 選項不被選中
有可能在你按下Finish的時候。屏幕上出現了一個對話框,告訴你沒有調試版,點擊Accept 。你可以沒有任何問題的使用發布版wxWidget來調試。
10. 現在,我們面對著開發的窗口,事情應該像下圖一樣。
給我們的窗口加點東西
如果你按下了Build and Run按鈕(有齒輪和三角形[播放圖標]的那個),就會顯示一個有一個菜單欄和兩個選項(Menu和Help)的小窗口,上面還有一個空的Status Bar。但是檢查一下一切是否工作正常總是好的。
現在我將敘述如何給我們的窗口加上文本標簽和按鈕。我并不會對你能使用的許多選項和窗口部件深入論述,因為這篇教程的目的僅僅是一個對于該框架的簡介。但是,我還是會說一些關于開發環境的內容。
在屏幕中央我們能看到“設計”窗口。在該窗口中我們可以編輯圖形界面或是代碼,具體是什么取決于我們正在編輯的文件。在其之上有兩個按鈕,一個打開菜單按鈕編輯器,另一個打開狀態欄編輯器。但是最重要的是在設計窗口下面的部分,在那里我們可以看到很多代表部件的按鈕,它們以目錄形式被整理起來,可以用于開發。
在左邊,我們看到了兩個不同的部分,資源/文件瀏覽器在上方,屬性編輯器在下方。
資源/文件瀏覽器讓我們容易找到我們想要去編輯的文件或者資源。在頂部有一些tab里,我們可以改變他們的視圖。最重要的是工程tab和資源tab。
在工程樹中,我們可以發現所有隱含在程序中的文件。在資源樹中,我們可以發現圖片資源。
在屬性編輯器中的文件/資源導航器下方,我們將可以直接修改一些資源屬性。
我將會在稍后回來,(介紹)在窗口上工作。
在右邊有能影響一些資源的按鈕欄。從上往下前四個決定了新的資源會在哪里被添加(是在指針處、在實有元件內、實有元件后,還是在實有元件前)。之后我們有一個畫著叉的按鈕,它是用于刪除當前元件的。在它下面的是顯示預覽按鈕。最下面的能打開一個包含有位置、大小選項的屬性面板。
添加一些東西
一開始的三個步驟,我要說的是它們是用于一個新工程的最基本步驟。
1. 從設計窗口下面的widget菜單選擇Layout選項卡。在這里我們能找到sizers。Sizes能幫助我們調整元件在窗口中的位置和大小。一旦有人改變了窗口大小,sizers就會相應地改變元件大小和內部元件的空間。
從布局元素中選擇基本的wxBoxSizer。這個調節器可以以一條水平或者垂直方向組織元素。在wxBoxSizer的虛線內點擊設計窗口的面板,點擊所需的元素,添加它們到窗口。
2. 現在我們可以開始把一些元素放入這里面,但是,在這之前,我們還要添加一些額外的東西。首先,在wxPanel上選擇標準的widget目錄tab,之后點擊內部的小方塊去添加一個panel到這個地方。確定選擇了boxSizer,在左側資源樹中你可以立即看到sizer被添加到樹中,并且在圖形界面上,你選了它,在資源樹中也會被選擇,反之亦然。wxPanel不僅會添加一個不錯的背景,還會添加一些特性到窗口中。
3. 現在我們來在Panel內添加另一個wxBoxSizer。選中wxPanel后,在Layout選項卡內單擊wxBoxSizer,再在框內點擊一次。現在窗口應該看起來像下面這樣:
這些步驟構成了絕大多數程序的一個好的開始。現在,讓我們加入一些交互性元素。
4. 一個Hello World程序必須要顯示Hello World文本,那么就讓我們加上它。在Standard選項卡選中wxStaticText然后在框內單擊。這個步驟給窗口增加了一個文本標簽。
如果你看一看左邊的資源屬性編輯器,你就能看到一份具有一些變量名和其對應值的表格。
第一行是這個元素的標簽,在所有元素中它都會顯示出一段文字,默認是"Label"。點擊右邊一欄(值列),你就能編輯這些值。那么現在就讓我們動手,點擊Label右邊的一列,編輯文本,把它改成一些新穎獨特的詞語,比如"Hello World"(你知道的,如果以其它文本開始會帶來壞運氣)。
5. 現在添加一些互動。我們將添加一個按鈕退出窗口。在標準tab上點擊wxButton按鈕。你將會看到我們設計的窗口變成了藍色,現在當你將鼠標指針移出Label時,我們在最后一步添加的那一側變成了淡藍色,這說明它的這一側有新資源被添加,因為wxStaticText內部不能有任何元素,所以它會自動將其它元素添加到另一側。點擊右側添加按鈕。
進入屬性編輯區去編輯按鈕的標簽(label),類似于Static Text label,寫上引用文本。因為點擊按鈕將會關閉窗口,所以我在按鈕上標注“Quit”。
6.你現在可以通過點擊 Build & Run按鈕,組建并運行程序。然后會出現一個小窗口,上面有Hello World文本和一些無效的按鈕。那么,就給按鈕加些功能吧。你可點擊菜單欄上的關閉按鈕或通過文件->退出來關閉窗口。
在設計器中雙擊我們添加的按鈕,進入HelloWorldMain.cpp文件中(或你自己命名的主文件)。
你可能要滑動滾輪來找到這樣的一個函數
void HelloWorldFrame::OnButton1Click(wxCommandEvent& event) { }
該函數處理按鈕點擊事件,并在你點擊按鈕的時候調用。當然,該函數現在還沒這個功能,我們來寫寫這個函數,賦予它這些功能。在函數體下加上以下內容
void HelloWorldFrame::OnButton1Click(wxCommandEvent& event) { Close(); }
當你重新編譯時,Close()函數關閉窗口,你可使用我們的按鈕關閉窗口。
以下是最終結果最后的一些注意事項
如果你選擇任何設計資源,它的屬性你都可以在屬性編輯框中看到它的尺寸(寬和高)和位置(X和Y)變量。你還可以設一個值給他們或者調整檢查默認的尺寸和默認的位置,這樣層管理器會選擇合適的位置和尺寸給任何的元素和窗口自身。對于我們將要開始做的項目來說,這是一個好選擇。
這是一個非常基本的教程。我的想法是做更多的教程去解釋另外一些特性。但是你還是要通過你自己去實驗,這里有許多資源可以使用。
任何建議,糾正,疑問或者評論都歡迎。感謝您的閱讀。