GUI 經(jīng)典名庫(kù)wxWidgets對(duì)于按鍵事件的處理,和同類產(chǎn)品相比,有個(gè)小的、但很折磨人的不同之處:如果焦點(diǎn)位于某個(gè)控件(子窗體)之上,那么當(dāng)時(shí)發(fā)生的 wxKeyEvent事件只發(fā)給那個(gè)子窗體,而主窗體攔截不到,也無(wú)法處理,這在一些時(shí)候帶來(lái)了很大麻煩。我堅(jiān)信這個(gè)功能決不是因?yàn)闆]有必要而被 wxWidgets刻意取消的,這不是“你應(yīng)該修改程序邏輯”的問(wèn)題,因?yàn)閺那坝眠^(guò)的VB和Delphi都提供了這種功能,就是主窗體有一個(gè) KeyPreview屬性,設(shè)置為真之后,主窗體本身就可以先一步得到任何控件上的按鍵事件,進(jìn)行處理。
如果安裝wxPack就能用,那該是更好的事。他們首先要體驗(yàn)的,是用wxWidgets做出程序來(lái),而不是在編譯wxWidgets中遇上一堆問(wèn)題,然后就沒有然后了。
用最新的wxPack,安裝了wxWidgets2.8.12,觀察庫(kù)文件,確實(shí)該有的都有了。用Code::Blocks12.11中wxWidgets2.8.x向?qū)ё龀鰞蓚(gè)測(cè)試的程序,卻都在運(yùn)行時(shí)發(fā)生了內(nèi)存溢出的問(wèn)題。分析原因,應(yīng)該是GCC版本問(wèn)題。wxPack安裝的wxWidgets2.8.12是用GCC4.4.1編譯的,而我的CodeBlocks12.11中用GCC4.7.1,溢出不意外。這一點(diǎn),有網(wǎng)友給出評(píng)論,“不用wxpack是對(duì)的,wxPack is no longer recommended for use, as it is built with a much older version of GCC.”
下載、編譯wxWidgets3.0.0,已經(jīng)不是什么問(wèn)題(見前文),只編譯了用于生成Debug目標(biāo)文件版本庫(kù)文件。
但是用Code::Blocks在編出程序時(shí),卻出了問(wèn)題。
先在Code::Blocks中建立wxWidgets Project,用向?qū)д鰝(gè)程序來(lái)玩,這是剛開始能做的事。但是,Code::Blocks12.11中,最高版本只能建立wxWidgets2.8.x版的應(yīng)用,編譯時(shí),總找不到libwxmsw28ud.a等文件。難怪,這里只有l(wèi)ibwxmsw30ud.a。該在Code::Blocks中能夠修改設(shè)置,不想找了。
建立,wxWidgets3.0.0中的應(yīng)用,成了需要做的事情。實(shí)際上,要運(yùn)行書中和網(wǎng)絡(luò)中找到的案例,不能靠向?qū)А?/p>
Wxpack環(huán)境搭建:
各種步驟弄完之后。我開始測(cè)試第一個(gè)程序。
5.問(wèn)題:
就是這個(gè)。新建wx程序就會(huì)出現(xiàn)的。我沒改任何東西。
當(dāng)我編譯的時(shí)候,可以進(jìn)行編譯了,但是編譯出現(xiàn)50個(gè)錯(cuò)誤。
如下:
Wxpack編程實(shí)例:
求大神們一定要指點(diǎn)下,不然第一個(gè)小程序都無(wú)法實(shí)現(xiàn),就無(wú)法再學(xué)習(xí)了。
建一個(gè)空項(xiàng)目,如圖1:
圖1
我建的項(xiàng)目,名稱為minimal。將項(xiàng)目上的源文件minimal.cpp拷貝到項(xiàng)目所在文件夾中,在codeBlocks中項(xiàng)目名上點(diǎn)右鍵,選Add file...將這個(gè)文件加入項(xiàng)目。文件mondrian.xpm是圖標(biāo)文件,也一并拷貝過(guò)去(不做,后面也需要補(bǔ)上)。另外,在文件minimal.cpp上點(diǎn)右鍵,選properties...,在對(duì)話框中將文件的只讀屬性去掉。加入源文件后的界面如圖2所示:
圖2
如果這時(shí)編譯,會(huì)有一堆錯(cuò)誤,首先面對(duì)的問(wèn)題,編譯時(shí)找不到需要的頭文件。
選菜單setting->Global variables...,保證配置類似圖3(根據(jù)你安裝wxWidgets的目錄):
圖3
選菜單Project->Build options...,在選項(xiàng)卡Search directories中,設(shè)置Compiler,如圖4所示:
圖4
這時(shí)再編譯,將不再有語(yǔ)法錯(cuò)誤,但一大堆問(wèn)題,來(lái)自于連接環(huán)節(jié),問(wèn)題是找不到庫(kù)文件。
選菜單Project->Build options...,在選項(xiàng)卡Linker settings中,加入X:\wxWidgets-3.0.0\lib\gcc_dll文件夾中的所有.a文件,如圖5所示:
圖5
然后再編譯,成功!
但是運(yùn)行程序時(shí),會(huì)出現(xiàn)錯(cuò)誤,如圖6:
圖6
按提示來(lái),在X:\wxWidgets-3.0.0\lib\gcc_dll中找到那wxmsw30ud_gcc_custom.dll文件,將其拷貝到項(xiàng)目所在文件夾,看到了期盼的窗口,如圖7所示。
圖7
出現(xiàn)圖6的錯(cuò)誤,原因是我在Linker settings加入的是lib\gcc_dll文件夾中的.a文件,這些屬于“動(dòng)態(tài)鏈接庫(kù)”(這個(gè)術(shù)語(yǔ)自己百度去吧)。這種方式的好處在于編譯速度快,目標(biāo)代碼小,但是在編譯好的程序運(yùn)行時(shí),必須要能找到需要的.dll文件。最簡(jiǎn)單的辦法,就是拷貝.dll文件。