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