wxWidgets GUI 編程介紹

jopen 10年前發布 | 58K 次閱讀 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,點擊“創建新工程”

    wxWidgets GUI 編程介紹

    2.在項目選擇窗口中選擇wxWidget

    wxWidgets GUI 編程介紹

    3.現在你需要選擇wxWidgets版本。請確保選擇你當前安裝的版本。本教程中,請選擇2.8.x

    wxWidgets GUI 編程介紹

    4. 然后會出現一個項目命名窗口。在這里,你可以為命名項目并且選擇存儲位置。我這里取名為HelloWorld

    wxWidgets GUI 編程介紹

    5. 現在,你需要選擇GUI Builder,這是一個幫助你在圖形化界面下創建圖形化界面的工具。我們這里選擇xwSmith。在應用類型中,選擇Frame Based

    wxWidgets GUI 編程介紹

    6. 下一步,請選擇你電腦本地wxWidgets的位置。最好的選擇是保持全局環境變量不變。點擊下一步時,將會彈出全局變量菜單,所以你必須在base欄中填入wxWidgets的路徑。如果你改變了wxWidgets的位置,你需要在Code::Blocks配置中編輯全局變量。

    wxWidgets GUI 編程介紹

    7. 選擇編譯器。默認GCC編譯器就可以了。

    wxWidgets GUI 編程介紹

    8. 現在,你有許多配置選項。在第一個選項中,你需要保證這個選項和你構建wxWidgets時使用同樣的選項。

    wxWidgets GUI 編程介紹

    “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 選項不被選中

    wxWidgets GUI 編程介紹

    有可能在你按下Finish的時候。屏幕上出現了一個對話框,告訴你沒有調試版,點擊Accept 。你可以沒有任何問題的使用發布版wxWidget來調試。

    10. 現在,我們面對著開發的窗口,事情應該像下圖一樣。

    wxWidgets GUI 編程介紹

    給我們的窗口加點東西

    如果你按下了Build and Run按鈕(有齒輪和三角形[播放圖標]的那個),就會顯示一個有一個菜單欄和兩個選項(Menu和Help)的小窗口,上面還有一個空的Status Bar。但是檢查一下一切是否工作正常總是好的。

    現在我將敘述如何給我們的窗口加上文本標簽和按鈕。我并不會對你能使用的許多選項和窗口部件深入論述,因為這篇教程的目的僅僅是一個對于該框架的簡介。但是,我還是會說一些關于開發環境的內容。

    在屏幕中央我們能看到“設計”窗口。在該窗口中我們可以編輯圖形界面或是代碼,具體是什么取決于我們正在編輯的文件。在其之上有兩個按鈕,一個打開菜單按鈕編輯器,另一個打開狀態欄編輯器。但是最重要的是在設計窗口下面的部分,在那里我們可以看到很多代表部件的按鈕,它們以目錄形式被整理起來,可以用于開發。

    在左邊,我們看到了兩個不同的部分,資源/文件瀏覽器在上方,屬性編輯器在下方。

    資源/文件瀏覽器讓我們容易找到我們想要去編輯的文件或者資源。在頂部有一些tab里,我們可以改變他們的視圖。最重要的是工程tab和資源tab。

    wxWidgets GUI 編程介紹 wxWidgets GUI 編程介紹

    在工程樹中,我們可以發現所有隱含在程序中的文件。在資源樹中,我們可以發現圖片資源。

    在屬性編輯器中的文件/資源導航器下方,我們將可以直接修改一些資源屬性。

    wxWidgets GUI 編程介紹

    我將會在稍后回來,(介紹)在窗口上工作。

    在右邊有能影響一些資源的按鈕欄。從上往下前四個決定了新的資源會在哪里被添加(是在指針處、在實有元件內、實有元件后,還是在實有元件前)。之后我們有一個畫著叉的按鈕,它是用于刪除當前元件的。在它下面的是顯示預覽按鈕。最下面的能打開一個包含有位置、大小選項的屬性面板。

    wxWidgets GUI 編程介紹

     

    添加一些東西

    一開始的三個步驟,我要說的是它們是用于一個新工程的最基本步驟。

    1. 從設計窗口下面的widget菜單選擇Layout選項卡。在這里我們能找到sizers。Sizes能幫助我們調整元件在窗口中的位置和大小。一旦有人改變了窗口大小,sizers就會相應地改變元件大小和內部元件的空間。

    從布局元素中選擇基本的wxBoxSizer。這個調節器可以以一條水平或者垂直方向組織元素。在wxBoxSizer的虛線內點擊設計窗口的面板,點擊所需的元素,添加它們到窗口。

    wxWidgets GUI 編程介紹

    2. 現在我們可以開始把一些元素放入這里面,但是,在這之前,我們還要添加一些額外的東西。首先,在wxPanel上選擇標準的widget目錄tab,之后點擊內部的小方塊去添加一個panel到這個地方。確定選擇了boxSizer,在左側資源樹中你可以立即看到sizer被添加到樹中,并且在圖形界面上,你選了它,在資源樹中也會被選擇,反之亦然。wxPanel不僅會添加一個不錯的背景,還會添加一些特性到窗口中。

    wxWidgets GUI 編程介紹

    3. 現在我們來在Panel內添加另一個wxBoxSizer。選中wxPanel后,在Layout選項卡內單擊wxBoxSizer,再在框內點擊一次。現在窗口應該看起來像下面這樣:

    wxWidgets GUI 編程介紹

    這些步驟構成了絕大多數程序的一個好的開始。現在,讓我們加入一些交互性元素。

    4. 一個Hello World程序必須要顯示Hello World文本,那么就讓我們加上它。在Standard選項卡選中wxStaticText然后在框內單擊。這個步驟給窗口增加了一個文本標簽。

    wxWidgets GUI 編程介紹

    如果你看一看左邊的資源屬性編輯器,你就能看到一份具有一些變量名和其對應值的表格。

    wxWidgets GUI 編程介紹

    第一行是這個元素的標簽,在所有元素中它都會顯示出一段文字,默認是"Label"。點擊右邊一欄(值列),你就能編輯這些值。那么現在就讓我們動手,點擊Label右邊的一列,編輯文本,把它改成一些新穎獨特的詞語,比如"Hello World"(你知道的,如果以其它文本開始會帶來壞運氣)。

    5. 現在添加一些互動。我們將添加一個按鈕退出窗口。在標準tab上點擊wxButton按鈕。你將會看到我們設計的窗口變成了藍色,現在當你將鼠標指針移出Label時,我們在最后一步添加的那一側變成了淡藍色,這說明它的這一側有新資源被添加,因為wxStaticText內部不能有任何元素,所以它會自動將其它元素添加到另一側。點擊右側添加按鈕。

     wxWidgets GUI 編程介紹

    進入屬性編輯區去編輯按鈕的標簽(label),類似于Static Text label,寫上引用文本。因為點擊按鈕將會關閉窗口,所以我在按鈕上標注“Quit”。

    6.你現在可以通過點擊 Build & Run按鈕,組建并運行程序。然后會出現一個小窗口,上面有Hello World文本和一些無效的按鈕。那么,就給按鈕加些功能吧。你可點擊菜單欄上的關閉按鈕或通過文件->退出來關閉窗口。

    在設計器中雙擊我們添加的按鈕,進入HelloWorldMain.cpp文件中(或你自己命名的主文件)。

    wxWidgets GUI 編程介紹

    你可能要滑動滾輪來找到這樣的一個函數

    void HelloWorldFrame::OnButton1Click(wxCommandEvent& event)
    {
    }

    該函數處理按鈕點擊事件,并在你點擊按鈕的時候調用。當然,該函數現在還沒這個功能,我們來寫寫這個函數,賦予它這些功能。在函數體下加上以下內容

    void HelloWorldFrame::OnButton1Click(wxCommandEvent& event)
    {
        Close();
    }

    當你重新編譯時,Close()函數關閉窗口,你可使用我們的按鈕關閉窗口。
    以下是最終結果

    wxWidgets GUI 編程介紹

    最后的一些注意事項

    如果你選擇任何設計資源,它的屬性你都可以在屬性編輯框中看到它的尺寸(寬和高)和位置(X和Y)變量。你還可以設一個值給他們或者調整檢查默認的尺寸和默認的位置,這樣層管理器會選擇合適的位置和尺寸給任何的元素和窗口自身。對于我們將要開始做的項目來說,這是一個好選擇。

    這是一個非常基本的教程。我的想法是做更多的教程去解釋另外一些特性。但是你還是要通過你自己去實驗,這里有許多資源可以使用。

    任何建議,糾正,疑問或者評論都歡迎。感謝您的閱讀。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!