青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

zyzx的小窩

C/C++,GUI,個(gè)人移動(dòng)存儲(chǔ),zyzx_lsl@163.com

 

wxWidgets貪吃蛇系列例程之一

// * create by zyzx
// * 2009-3-16
// * 轉(zhuǎn)載請(qǐng)注明來(lái)源:http://m.shnenglu.com/zyzx

??????? 想了幾天,不知道如何動(dòng)筆寫(xiě)例程,網(wǎng)絡(luò)上關(guān)于wx框架例程也不多。入門(mén)最好先讀《Cross-Platform GUI Programming with wxWidgets_CN》(中文版)和wx庫(kù)本身自帶的說(shuō)明文檔
??????? 關(guān)于組件的使用,官方源代碼中提供了很多例程wxWidgets-2.8.7\samples。

??????? 回想我作為初學(xué)者時(shí),或許走了一些彎路。剛開(kāi)始當(dāng)然是讀教程和官方說(shuō)明文檔,再到手工編寫(xiě)UI組件(熟悉基本的幾個(gè),其他的在使用上是差不多的),最后是結(jié)合工具DialogBlocks編寫(xiě)。wx庫(kù)本身還有很多值得挖掘的地方,比如其事件綁定方式、XRC界面配置文件、SIZER界面自動(dòng)配置、還有國(guó)際化等等。
??????? 這里我就按手工編寫(xiě)和借助工具分別寫(xiě)一份例程,例程的編寫(xiě)過(guò)程,就是熟悉庫(kù)本身過(guò)程。
??????? 第一份手工編寫(xiě)的例程,我還是想借助于經(jīng)典游戲《貪吃蛇》來(lái)實(shí)現(xiàn)。而第二份使用DialogBlocks來(lái)實(shí)現(xiàn)類(lèi)似VS界面。
??????? 以前學(xué)習(xí)OpenGL時(shí)候,有經(jīng)典的書(shū)在手,但總是沒(méi)有程序?qū)嵺`感觀,因而覺(jué)得很空洞。但自從慢慢的研讀hehe關(guān)于OpenGL的系列的實(shí)例教程,再結(jié)合書(shū)籍才慢慢了解3D編程。況且,本人也對(duì)wx庫(kù)了解不是很全面,也只能從其局部應(yīng)用出發(fā)。因此,本系列例程程序側(cè)重于代碼實(shí)現(xiàn),在很多方面還有局限性。關(guān)于wx庫(kù)完整的結(jié)構(gòu)還得參考其自帶的說(shuō)明文檔。

??????? 第一例程簡(jiǎn)短的程序分四個(gè)文件:SnakeApp.h、SnakeApp.cpp、SnakeFrame.h、SnakeFrame.cpp。本系列例程會(huì)在此基礎(chǔ)之上完成。

??????? SnakeApp類(lèi)中定義應(yīng)用程序啟動(dòng)類(lèi),繼承于wxApp。
??????? SnakeFrame類(lèi)定義主Frame,創(chuàng)建界面框架和其中的子窗口組件。

一、類(lèi)SnakeApp頭文件定義:

?1 class ?SnakeApp:? public ?wxApp
?2 {
?3 public :
?4 ???? // *?定義動(dòng)態(tài)創(chuàng)建類(lèi)
?5 ????DECLARE_CLASS(?SnakeApp?)
?6 ???? // *?定義事件處理宏
?7 ????DECLARE_EVENT_TABLE()
?8
?9 public :
10 ????SnakeApp();
11
12 ???? // *?類(lèi)初始化
13 ???? void ?Init();
14 ???? // *?窗口初始化
15 ???? virtual ? bool ?OnInit();
16 ???? // *?退出
17 ???? virtual ? int ?OnExit();
18
19 public :
20 ???? // *?獲取主Frame
21 ????SnakeFrame * ?GetMainFrame() {? return ?m_MainFrame;?}
22
23 protected :
24 ????SnakeFrame * ?m_MainFrame;
25 }
;
26
27 // *?定義全局wxGetApp(),返回&SnakeApp
28 // *?可以在工程的任意地方使用。
29 DECLARE_APP(SnakeApp)


??????? wxApp是基于線(xiàn)程類(lèi)有關(guān)的,一般應(yīng)用程序?qū)⒁粋€(gè)繼承wxApp的類(lèi)作為入口類(lèi),再用IMPLEMENT_APP宏定義入口類(lèi)(入口地址)。
??????? DECLARE_EVENT_TABLE宏靜態(tài)定義此類(lèi)接收的事件處理,未編寫(xiě)的事件按默認(rèn)處理。
??????? OnInit中一般是程序運(yùn)行之前的創(chuàng)建窗口、配置程序環(huán)境等操作。
??????? OnExit程序結(jié)束時(shí),需要處理的操作。注意,wx庫(kù)正常窗口鏈,在默認(rèn)的wxApp::OnExit()函數(shù)執(zhí)行后,都會(huì)被自動(dòng)析構(gòu)掉,并不需要顯示的調(diào)用析構(gòu)。如果正常的窗口鏈被破壞,需要做相應(yīng)的特殊處理,比如混合使用MFC或WIN32的API,都有可能破壞正常的窗口鏈。
??????? DECLARE_APP宏定義本工程中可以使用到的全局函數(shù)wxGetApp(),返回為本類(lèi)的引用。此全局函數(shù)即為溝通其他各個(gè)部分(比如主Frame->窗口->組件)的中間橋梁。

二、類(lèi)SnakeApp實(shí)現(xiàn)文件:

?1 // *?入口函數(shù)定義
?2 IMPLEMENT_APP(?SnakeApp?)
?3
?4 // *?動(dòng)態(tài)創(chuàng)建類(lèi)
?5 IMPLEMENT_CLASS(?SnakeApp,?wxApp?)
?6
?7 // *?掛接事件響應(yīng)宏
?8 BEGIN_EVENT_TABLE(?SnakeApp,?wxApp?)
?9 END_EVENT_TABLE()
10
11 SnakeApp::SnakeApp()
12 {
13 ????Init();
14 }

15
16 void ?SnakeApp::Init()
17 {
18 ????m_MainFrame? = ?NULL;
19 }

20
21 bool ?SnakeApp::OnInit()
22 {
23 ???? // *?加載能處理圖片類(lèi)型驅(qū)動(dòng)
24 #if ?wxUSE_XPM
25 ????wxImage::AddHandler( new ?wxXPMHandler);
26 #endif
27 #if ?wxUSE_LIBPNG
28 ????wxImage::AddHandler( new ?wxPNGHandler);
29 #endif
30 #if ?wxUSE_LIBJPEG
31 ????wxImage::AddHandler( new ?wxJPEGHandler);
32 #endif
33 #if ?wxUSE_GIF
34 ????wxImage::AddHandler( new ?wxGIFHandler);
35 #endif
36
37 ???? // ?*?創(chuàng)建主Frame
38 ????SnakeFrame * ?mainWindow? = ? new ?SnakeFrame(?NULL?);
39 ????SetTopWindow(?mainWindow?);
40 ????mainWindow -> Show( true );
41
42 ????m_MainFrame? = ?mainWindow;
43 ???? return ? true ;
44 }

45
46 int ?SnakeApp::OnExit()
47 {
48 ???? return ?wxApp::OnExit();
49 }


??????? IMPLEMENT_CLASS宏回應(yīng)頭文件中的宏定義DECLARE_CLASS。
??????? BEGIN_EVENT_TABLE、BEGIN_EVENT_TABLE:掛接事件宏。類(lèi)似MFC中消息部分的處理。
??????? DECLARE_CLASS宏表示此類(lèi)可以被動(dòng)態(tài)創(chuàng)建,指可以在運(yùn)行時(shí)創(chuàng)建。實(shí)質(zhì)是使用wxClassInfo來(lái)標(biāo)記工程中唯一的類(lèi),運(yùn)行時(shí)可以使用wxClassInfo信息來(lái)創(chuàng)建該類(lèi)。Wx庫(kù)中比較經(jīng)典的應(yīng)用是xrc文件中定義了一些窗口信息的文本標(biāo)簽,而程序運(yùn)行時(shí)根據(jù)這些信息創(chuàng)建出一系列的窗口。如果窗口類(lèi)需要運(yùn)行時(shí)創(chuàng)建,必須要使用DECLARE_CLASS宏。注意本工程只是定義了此宏,并沒(méi)有使用其動(dòng)態(tài)創(chuàng)建特性。
??????? wxImage::AddHandler()函數(shù)給wxImage的全局靜態(tài)變量添加對(duì)應(yīng)圖片處理格式的Handler。責(zé)任鏈模式在wx庫(kù)中有廣泛的使用,作為使用者只需要關(guān)注wxImage提供的方法,而圖片格式(*.jpg、*.png、*.gif等)由對(duì)應(yīng)的Handler來(lái)處理。另一個(gè)使用比較經(jīng)典的是窗口事件的分發(fā)。
??????? New SnakeFrame( NULL ) 以NULL 為父窗指針的類(lèi)一般直接或間接繼承于wxTopLevelWindow,表示可以作為頂層窗口的類(lèi)。
??????? SetTopWindow( mainWindow )設(shè)置頂層窗口。

三、SnakeFrame類(lèi)頭文件


class ?SnakeFrame:? public ?wxFrame
{
public :
????DECLARE_CLASS(?SnakeFrame?)
????DECLARE_EVENT_TABLE()

public :
????SnakeFrame(wxWindow
* ?parent);
????
virtual ? ~ SnakeFrame();

????
// *?初始化類(lèi)
???? void ?Init();
????
// *?創(chuàng)建窗口框架組件
???? void ?CreateControls();
protected :


protected :
????
// *?窗口分割條
????wxSplitterWindow * ?m_SplitterWindow;
}
;


??????? 如上部分UI View 部分即我們Demo需要完成的界面樣子。
??????? CreateControls()函數(shù)中中創(chuàng)建主Frame中的子窗口。
??????? m_SplitterWindow本界面使用窗口分割條的方式將窗口分割成游戲區(qū)域和控制提示區(qū)域。

四、SnakeFrame類(lèi)實(shí)現(xiàn)文件部分

IMPLEMENT_CLASS(?SnakeFrame,?wxFrame?)

BEGIN_EVENT_TABLE(?SnakeFrame,?wxFrame?)
END_EVENT_TABLE()

SnakeFrame::SnakeFrame(wxWindow
* ?parent)
{
????
// *?初始化類(lèi),并使用基類(lèi)wxFrame創(chuàng)建Frame,其參數(shù)詳細(xì)見(jiàn)wx文檔
????Init();
????wxFrame::Create(?parent,?SNAKEFRAME_ID,?SNAKEFRAME_TITLE,?SNAKEFRAME_POSITION,?SNAKEFRAME_SIZE,?SNAKEFRAME_STYLE?);
????CreateControls();
????Centre();
}


SnakeFrame::
~ SnakeFrame()
{
}


void ?SnakeFrame::Init()
{
????m_SplitterWindow?
= ?NULL;
}


void ?SnakeFrame::CreateControls()
{
????SnakeFrame
* ?frame? = ? this ;

????
// *?創(chuàng)建窗口分割條
????
// *?wxID_ANY?=?-1,表示此窗口不能通過(guò)其ID來(lái)查詢(xún)
????wxSplitterWindow * ?splitterwnd? = ? new ?wxSplitterWindow(?frame?,?wxID_ANY,SNAKEFRAME_POSITION,?SNAKEFRAME_SIZE);

????
// *?創(chuàng)建一個(gè)普通窗口
????wxWindow * ?wnd1? = ? new ?wxWindow(?splitterwnd?,?wxID_ANY);
????
// *?創(chuàng)建一個(gè)文本編輯窗口
????wxWindow * ?wnd2? = ? new ?wxTextCtrl(?splitterwnd?,?wxID_ANY);

????
// *?使用垂直分割方式,分成左右窗口
????splitterwnd -> SplitVertically(?wnd1,?wnd2,?SNAKEFRAME_SPL?);
????
// *?設(shè)置分隔條SashSize為0,可以阻止拖動(dòng)分割條改變窗口大小
????splitterwnd -> SetSashSize(? 0 ?);

????m_SplitterWindow?
= ?splitterwnd;
}


??????? wxFrame::Create創(chuàng)建Frame窗口。Wx庫(kù)中界面窗口部分類(lèi)都有兩種創(chuàng)建方式:一、直接使用構(gòu)造函數(shù)直接創(chuàng)建;二、分兩步,第一步使用默認(rèn)構(gòu)造函數(shù)只初始化類(lèi),第二步才使用Create函數(shù)來(lái)創(chuàng)建窗口。
??????? wxSplitterWindow這里使用其將窗口分割成左右兩部分,并設(shè)定分割條大小為0,即防止用戶(hù)拖動(dòng)分割條。這里暫時(shí)使用兩個(gè)標(biāo)準(zhǔn)窗口來(lái)代替,下一個(gè)章節(jié)將替換這里為我們自己的類(lèi)。

五、編譯并執(zhí)行
??????? 設(shè)置編譯環(huán)境并編譯得到如下界面。

??????? 如果有些部分沒(méi)有提到,那是前面章節(jié)有可能已經(jīng)提到,請(qǐng)翻閱前面部分查詢(xún)。本系列從wx庫(kù)的編譯、配置、到demo的各個(gè)部分完成有比較強(qiáng)的依賴(lài)次序。


?????? 工程文件下載

posted on 2009-03-16 17:32 zyzx 閱讀(5397) 評(píng)論(5)  編輯 收藏 引用 所屬分類(lèi): wxWidgets界面庫(kù)

評(píng)論

# re: wxWidgets貪吃蛇系列例程之一 2009-03-17 10:06 answer

good, 期待,期待中。  回復(fù)  更多評(píng)論   

# re: wxWidgets貪吃蛇系列例程之一 2009-03-17 10:38 一燈

你好,向您請(qǐng)教個(gè)問(wèn)題,關(guān)于wxWidget的,
我下載了wxWidget 2.8.9準(zhǔn)備在wince下使用,但在wince下無(wú)法編譯
我打開(kāi)了build\wince\下的wx.dcw進(jìn)行編譯,但wxzli、wxpng、wxjpeg、wxepat都能通過(guò),但mono和gl無(wú)法通過(guò),問(wèn)題如下:


6>------ 已啟動(dòng)全部重新生成: 項(xiàng)目: gl, 配置: Debug Pocket PC 2003 (ARMV4) ------
6>正在刪除項(xiàng)目“gl”(配置“Debug|Pocket PC 2003 (ARMV4)”)的中間文件和輸出文件
6>Creating ..\..\lib\evc_armv4_lib\winced\wx\msw\rcdefs.h
4>pngpread.c
6>'clarm.exe' 不是內(nèi)部或外部命令,也不是可運(yùn)行的程序
6>或批處理文件。
6>Project : error PRJ0019: 某個(gè)工具從以下位置返回了錯(cuò)誤代碼: "Creating ..\..\lib\evc_armv4_lib\winced\wx\msw\rcdefs.h"
6>生成日志保存在“file://D:\wxWidgets-2.8.9\build\wince\Pocket PC 2003 (ARMV4)\Debug\BuildLog.htm”
6>gl - 1 個(gè)錯(cuò)誤,0 個(gè)警告

1>------ 已啟動(dòng)全部重新生成: 項(xiàng)目: mono, 配置: Debug Pocket PC 2003 (ARMV4) ------
2>------ 已啟動(dòng)全部重新生成: 項(xiàng)目: wxexpat, 配置: Debug Pocket PC 2003 (ARMV4) ------
1>正在刪除項(xiàng)目“mono”(配置“Debug|Pocket PC 2003 (ARMV4)”)的中間文件和輸出文件
2>正在刪除項(xiàng)目“wxexpat”(配置“Debug|Pocket PC 2003 (ARMV4)”)的中間文件和輸出文件
2>正在編譯...
2>xmlparse.c
1>mono : warning PRJ0009 : 未能打開(kāi)生成日志進(jìn)行寫(xiě)入。
1>請(qǐng)確保該文件未被其他進(jìn)程打開(kāi)并且未被寫(xiě)保護(hù)。
2>xmltok.c
1>Creating ..\..\lib\evc_armv4_lib\winced\wx\msw\rcdefs.h
1>'clarm.exe' 不是內(nèi)部或外部命令,也不是可運(yùn)行的程序
1>或批處理文件。
1>Project : error PRJ0019: 某個(gè)工具從以下位置返回了錯(cuò)誤代碼: "Creating ..\..\lib\evc_armv4_lib\winced\wx\msw\rcdefs.h"
1>生成日志保存在“file://D:\wxWidgets-2.8.9\build\wince\Pocket PC 2003 (ARMV4)\Debug\BuildLog.htm”
1>mono - 1 個(gè)錯(cuò)誤,1 個(gè)警告

我以為是生成順序的問(wèn)題,但改變順序后依然沒(méi)有解決
我改變了關(guān)于預(yù)編譯的設(shè)置 依然沒(méi)有解決問(wèn)題,
我是個(gè)新手,關(guān)于C語(yǔ)言編譯實(shí)在沒(méi)有經(jīng)驗(yàn),希望能給予指教謝謝  回復(fù)  更多評(píng)論   

# re: wxWidgets貪吃蛇系列例程之一 2009-03-17 11:25 之名

不錯(cuò),期待例程之二  回復(fù)  更多評(píng)論   

# re: wxWidgets貪吃蛇系列例程之一 2009-03-17 13:04 mycode

期待例程之二   回復(fù)  更多評(píng)論   

# re: wxWidgets貪吃蛇系列例程之一 2009-03-17 13:52 J.A.M

支持一下,
  回復(fù)  更多評(píng)論   

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

留言簿(1)

隨筆分類(lèi)

隨筆檔案

常用鏈接

搜索

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一区二区日韩伦理片| 午夜精品久久久久久久99黑人| 亚洲国产天堂久久国产91| 国产精品中文在线| 欧美一区视频在线| 久久国产精品色婷婷| 亚洲精品久久久久久下一站 | 国产视频精品va久久久久久| 欧美a级一区二区| 欧美激情一区二区三区在线| 欧美激情区在线播放| 国产精品自拍一区| 最新中文字幕一区二区三区| 亚洲精品欧美日韩专区| 久久九九国产精品| 久久丁香综合五月国产三级网站| 欧美国产精品va在线观看| 红桃视频亚洲| 欧美激情网友自拍| 午夜性色一区二区三区免费视频| 亚洲精品四区| 亚洲免费视频网站| 六月天综合网| 亚洲国产综合91精品麻豆| 欧美在线free| 久久精品亚洲国产奇米99| 久久资源在线| 夜夜嗨av一区二区三区网页| 欧美亚洲视频一区二区| 欧美韩日一区二区三区| 国产欧美日韩综合一区在线观看| 最新国产成人在线观看| 午夜免费在线观看精品视频| 欧美激情aⅴ一区二区三区| 亚洲欧美日韩另类| 欧美成人午夜视频| 国产精品久久久久久久久久久久久 | 久久这里只有| 99re6热只有精品免费观看| 久久成人国产| 欧美视频在线免费| 亚洲欧洲精品一区二区精品久久久| 先锋影音久久久| 亚洲精品一区二区三区av| 久久久久国内| 国产视频亚洲| 欧美亚洲综合久久| 在线视频日韩精品| 欧美日韩中文字幕在线视频| 亚洲久久一区| 亚洲大片免费看| 久久久久久久综合| 国内成人精品视频| 久久精品视频免费播放| 亚洲小说欧美另类婷婷| 欧美日韩一区二区免费视频| 一级日韩一区在线观看| 亚洲国产欧美国产综合一区| 美女网站久久| 亚洲国产一区二区精品专区| 久久综合九色综合欧美狠狠| 久久精品国产欧美激情| 极品尤物av久久免费看| 免费看的黄色欧美网站| 久久久精品欧美丰满| 国外视频精品毛片| 媚黑女一区二区| 久久在线视频| 亚洲片在线资源| 亚洲激情欧美| 欧美日韩一区二区三区| 亚洲在线视频网站| 亚洲欧美国产va在线影院| 国产农村妇女精品一区二区| 久久国产精品黑丝| 久久精品国内一区二区三区| 亚洲第一主播视频| 亚洲欧洲另类| 国产精品福利久久久| 久久精品亚洲精品| 久久美女性网| 一本一本久久| 亚洲欧美日韩电影| 亚洲电影在线观看| 日韩视频二区| 国产亚洲综合在线| 欧美激情中文字幕乱码免费| 欧美日韩免费观看一区| 久久成人人人人精品欧| 麻豆精品一区二区av白丝在线| 日韩视频一区| 欧美在线观看视频在线 | 国产日韩一区二区三区在线播放 | 国产一区久久| 亚洲大片av| 国产精品美女久久久久久2018| 欧美一级理论片| 老司机午夜精品| 亚洲一区在线看| 欧美在线网站| 亚洲无限av看| 久久精品综合一区| 亚洲网站在线观看| 看片网站欧美日韩| 午夜一区二区三区不卡视频| 久久在线免费观看| 小处雏高清一区二区三区| 美国十次了思思久久精品导航| 午夜精品久久久久影视| 女人天堂亚洲aⅴ在线观看| 欧美有码在线观看视频| 欧美精品九九99久久| 久久三级视频| 国产精品久久久久久久久婷婷| 欧美激情免费观看| 韩国一区二区三区美女美女秀| 一本色道久久88综合日韩精品| 亚洲韩国青草视频| 欧美在线日韩| 性视频1819p久久| 欧美日韩在线三级| 亚洲激情成人在线| 亚洲国产日韩在线一区模特| 亚洲欧美一区二区三区在线| 亚洲在线第一页| 欧美日韩亚洲不卡| 亚洲狠狠婷婷| 亚洲欧洲日产国产综合网| 久久九九全国免费精品观看| 久久大综合网| 国产精品伦一区| 一区二区免费在线播放| 中文在线不卡视频| 欧美日韩一区三区四区| 亚洲人成免费| 一区二区不卡在线视频 午夜欧美不卡在 | 国产精品看片资源| 亚洲最新视频在线播放| 一区二区激情小说| 欧美日韩精品综合| 亚洲精品欧美专区| 亚洲图片欧美午夜| 国产精品久久久久久亚洲毛片| 久久精品免费电影| 亚洲永久在线观看| 午夜精品电影| 国产日韩欧美在线看| 亚洲欧美视频在线观看视频| 性欧美大战久久久久久久免费观看| 国产精品视频网站| 欧美一区二区成人| 久久久久亚洲综合| 在线精品高清中文字幕| 麻豆成人小视频| 亚洲精品乱码久久久久久黑人 | 一色屋精品视频免费看| 老司机免费视频久久| 亚洲欧洲精品一区二区三区| 在线一区日本视频| 国产精品自拍三区| 久久综合九色九九| 亚洲激情在线| 香蕉av777xxx色综合一区| 国产一区二区三区久久精品| 久久一区二区三区超碰国产精品| 亚洲大胆美女视频| 亚洲图片在线| 国产一级揄自揄精品视频| 久久综合激情| 亚洲色图制服丝袜| 男同欧美伦乱| 亚洲欧美日韩专区| 亚洲国产成人精品视频| 国产精品久久福利| 久久免费偷拍视频| 在线性视频日韩欧美| 免费视频最近日韩| 亚洲一区二区久久| 在线观看一区二区精品视频| 欧美午夜不卡影院在线观看完整版免费| 亚洲欧美日韩一区在线观看| 亚洲第一区在线观看| 欧美一区二区三区日韩| 日韩视频在线你懂得| 国产综合亚洲精品一区二| 欧美日韩 国产精品| 久久久www成人免费精品| 一区二区三区国产在线观看| 欧美激情小视频| 欧美一区视频在线| 一区二区三区四区蜜桃| 亚洲第一伊人| 激情久久久久久久| 国产精品入口日韩视频大尺度| 欧美激情视频一区二区三区免费| 欧美一站二站| 亚洲欧美乱综合| 一区二区三区四区精品| 亚洲人精品午夜| 亚洲国产91精品在线观看|