3 wxWidgets應用程序初體驗
本文中所有的體驗,在Code::Blocks中進行。
為了在Code::Blocks中編譯運行C++寫的wxWidgets程序,需要再做些設置。
首先,需要在環境變量里添加一個wxWidgets根目錄環境變量。設置方法類似於2.3中設置PATH變量的方法。在Win7中,右擊桌面上的“計算機”圖標,選菜單中的“屬性”,在“系統屬性”對話框中,完成如下圖從1到5的一系列操作。新增的變量命名為wxwin,值為X:\wxWidgets-3.0.0。
接下來的設置要在Code::Blocks中進行。
打開Code::Blocks,選擇菜單Settings->Global Variables…,在設置default下新建立一個wx變量,在Build-in fields:下,base中填入“${wxwin}”(wxwin是剛才設置好的一個變量),include中填入“${wxwin}\include”,lib中填入“${wxwin}\lib”,這些都是開發中需要用到的“環境”中的一部分。
3.1 由“空項目”建立和運行GUI應用程序
下面將“白手起家”,由建立“空項目”開始,做一個簡單的應用。程序改編自在線教程《wxWidgets tutorial》(http://zetcode.com/gui/wxwidgets/)的“First programs in wxWidgets”部分的第一個程序。這個教程,將作為建議學習方案中的主教程之一。
3.1.1 建立項目
建立項目的過程是:
(1)通過菜單“File”->“New”->“Project…”,選擇“Empty project”建一個空項目
(2)點擊“go”按鈕后,有一個歡迎界面,點擊“next”,出現下圖,填入項目名。我建立的項目名稱為wxTest。
(3)點擊“next”后,要求選擇編譯器及生成的目標文件類型,照下圖選擇
(4)點擊“Finish”后,將生成一個空項目,如圖
(5)點擊菜單File->New->File...為項目新建一個源程序文件。在連續出現的幾個對話框中,選擇要增加的文件類型是“C/C++ source”(即源文件),再一個對話框中選擇語言是“C++”。接着,在下圖所示的對話框中,給出帶完整路徑的源文件名(本例中用main.cpp),注意將Debug復選框選中。
(6)點擊“Finish”后,將下面的源程序輸入(或粘貼)到文件main.cpp中。
- #include <wx/wx.h>
- class Simple : public wxFrame
- {
- public:
- Simple(const wxString& title);
- };
- Simple::Simple(const wxString& title)
- : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150))
- {
- Centre();
- }
- class MyApp : public wxApp
- {
- public:
- virtual bool OnInit();
- };
- IMPLEMENT_APP(MyApp)
- bool MyApp::OnInit()
- {
- Simple *simple = new Simple(wxT("Simple"));
- simple->Show(true);
- return true;
- }
加入了源代碼之后的項目如下圖所示:
可以暫時不考慮程序中的語句是什么意思。能完成運行程序的完整過程,是我們當前的任務。能運行程序了,后面再看“門道”。
下面將對這個項目進行編譯,進而看到運行結果。
3.1.2 編譯和運行項目
選擇菜單“Build”中的“Build”選項(或者工具欄中的相應按鈕)對項目進行編譯、連接。程序第一行即出現錯誤。錯誤提示是:
- fatal error: wx/wx.h: No such file or directory
也就是說,找不到要包含的頭文件wx\wx.h。
這需要設置“搜索路徑”解決。選菜單Project->Build options...,在選項卡Search directories中,設置Compiler。通過“Add”增加目錄X:\wxWidgets-3.0.0\lib\gcc_dll\mswud和X:\wxWidgets-3.0.0\include,結果如下圖所示:
接着Build,將不再有語法錯誤。
出現的一大堆錯誤提示,來自於連接環節,問題是找不到庫文件。
選菜單Project->Build options...,在選項卡Linker settings中,需要加入要連接的“目標文件”。如圖所示,通過Add按鈕加入X:\wxWidgets-3.0.0\lib\gcc_dll文件夾中的所有.a文件(實際上,選擇其中幾個需要的就可以了。因為不知道究竟需要哪幾個,全選是最省事的辦法):
然后再編譯,0 errors, 0 warnings。成功!
但是運行程序時,會出現錯誤,如下圖:
按提示來,在X:\wxWidgets-3.0.0\lib\gcc_dll中找到wxmsw30ud_gcc_custom.dll文件,將其拷貝到項目所在文件夾,再運行,就看到了期盼的窗口,如圖所示。
出現上面的運行錯誤,原因是我在Linker settings加入的是lib\gcc_dll文件夾中的.a文件,這些屬於“動態鏈接庫”(這個術語自己百度去吧)。這種方式的好處在於編譯速度快,目標代碼小,但是在編譯好的程序運行時,必須要能找到需要的.dll文件。最簡單的辦法,就是拷貝.dll文件。
這個程序很短,結果也只是一個空空的窗口,但是作為掌握編譯、運行窗口程序的案例,卻也是足夠的了。
以上的設置和文件復制,“有經驗”之后可以提前完成。上面的描述方法,是考慮到希望讀者對各個環節的問題,能多些感覺。
3.2 利用Code::Blocks的向導建立應用
另一種在Code::Blocks中建立wxWidgets Project的方法,是通過“向導”開發應用。這種方法用得不是很多,可以作為了解。
本節下面的材料,非作者原創,整理自http://www.cnzui.com/archives/962。
利用向導開發的具體步驟是:
(1)通過菜單“File”->“New”->“Project…”,選擇最后面的wxWidgets project。
(2)點擊“Go”進入工程配置向導,首先會出來一個歡迎窗口,直接next后,選擇安裝好wxWidgets版本。
注:Code::Blocks 13.12中,已經有了對wxWidgets 3.0.x的支持。需要選對版本,否則能夠繼續生成應用程序,但是不能正確連接和運行。
(3)按“Next”,然后輸入項目名“wxtest”,選擇保存項目的文件夾。
(4)繼續“Next”,輸入作者和及一些版權說明信息。
(5)繼續“Next”,選擇GUI設計工具和程序類型,用wxSmith和Dialog based。
(6)按“Next”,接下來的就是wxWidgets環境的一些設置了,這里我們輸入剛才設置的wxWidgets根目錄,直接填入“$(#wx)”就可以了。
(7)按“Next”,這里我們看到默認就是選擇了MinGW編譯器了,下面的我們只做Debug版本,所以只選上“Create “Debug” configuration”。
(9)繼續“Next”,接下來要選擇怎么使用wxWidgets庫,這里根據你編譯的wxWidgets庫是什么樣的來。
后注:在wxWidgets Library Setting部分,三個勾都打上。這樣,只要在編譯時SHARED=1,滿足了Use wxWidgets DLL,使用動態鏈接接庫的要求;用MONOLITHIC=1,滿足了wxWidgets is built as a monolithic library,構建單一庫;而UNICODE=1,滿足支持寬字符串Enable unicode。也就是說,當初編譯wxWidgets時用:mingw32-make -f makefile.gcc MONOLITHIC=1 SHARED=1 UNICODE=1 BUILD=debug和mingw32-make -f makefile.gcc MONOLITHIC=1 SHARED=1 UNICODE=1 BUILD=release,就可以滿足生支供調試和發布的代碼兩項要求。
(10)按“Next”,因為選擇了“Configure Advanced Options”,所以要對使用wxWidgets庫做更多的設置,這里我們選上我們使用lib方式調用(要求編譯wxWidgets時用SHARED=0參數,生成了靜態庫文件)。
(11)按“Next”進到最后一步,我們選擇需要用到的庫,不知道的話全部選上。
(12)點擊“Finish”,工程隨即建立成功。
這時可以查看項目中自動生成的文件,其中有.cpp的源文件,也有.h的頭文件。再細讀,和3.1中輸入的程序長得差不多。
其實,向導的作用,就是通過一系列的選擇,由向導程序自動生成應用程序。
如上步驟創建的應用程序的運行的結果是:
在編譯和運行時,都有可能出現一些錯誤。這一般不是程序本身的問題,而是Code::Blocks的編譯環境和運行的支持文件不全而造成的。
請參閱3.1.2小節,可能會幫助你排除問題,讓程序正確運行。
http://blog.csdn.net/sxhelijian/article/details/26164181