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

zyzx的小窩

C/C++,GUI,個人移動存儲,zyzx_lsl@163.com

 

wxWidgets貪吃蛇系列例程之一

// * create by zyzx
// * 2009-3-16
// * 轉載請注明來源:http://www.shnenglu.com/zyzx

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

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

??????? 第一例程簡短的程序分四個文件:SnakeApp.h、SnakeApp.cpp、SnakeFrame.h、SnakeFrame.cpp。本系列例程會在此基礎之上完成。

??????? SnakeApp類中定義應用程序啟動類,繼承于wxApp。
??????? SnakeFrame類定義主Frame,創建界面框架和其中的子窗口組件。

一、類SnakeApp頭文件定義:

?1 class ?SnakeApp:? public ?wxApp
?2 {
?3 public :
?4 ???? // *?定義動態創建類
?5 ????DECLARE_CLASS(?SnakeApp?)
?6 ???? // *?定義事件處理宏
?7 ????DECLARE_EVENT_TABLE()
?8
?9 public :
10 ????SnakeApp();
11
12 ???? // *?類初始化
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是基于線程類有關的,一般應用程序將一個繼承wxApp的類作為入口類,再用IMPLEMENT_APP宏定義入口類(入口地址)。
??????? DECLARE_EVENT_TABLE宏靜態定義此類接收的事件處理,未編寫的事件按默認處理。
??????? OnInit中一般是程序運行之前的創建窗口、配置程序環境等操作。
??????? OnExit程序結束時,需要處理的操作。注意,wx庫正常窗口鏈,在默認的wxApp::OnExit()函數執行后,都會被自動析構掉,并不需要顯示的調用析構。如果正常的窗口鏈被破壞,需要做相應的特殊處理,比如混合使用MFC或WIN32的API,都有可能破壞正常的窗口鏈。
??????? DECLARE_APP宏定義本工程中可以使用到的全局函數wxGetApp(),返回為本類的引用。此全局函數即為溝通其他各個部分(比如主Frame->窗口->組件)的中間橋梁。

二、類SnakeApp實現文件:

?1 // *?入口函數定義
?2 IMPLEMENT_APP(?SnakeApp?)
?3
?4 // *?動態創建類
?5 IMPLEMENT_CLASS(?SnakeApp,?wxApp?)
?6
?7 // *?掛接事件響應宏
?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 ???? // *?加載能處理圖片類型驅動
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 ???? // ?*?創建主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宏回應頭文件中的宏定義DECLARE_CLASS。
??????? BEGIN_EVENT_TABLE、BEGIN_EVENT_TABLE:掛接事件宏。類似MFC中消息部分的處理。
??????? DECLARE_CLASS宏表示此類可以被動態創建,指可以在運行時創建。實質是使用wxClassInfo來標記工程中唯一的類,運行時可以使用wxClassInfo信息來創建該類。Wx庫中比較經典的應用是xrc文件中定義了一些窗口信息的文本標簽,而程序運行時根據這些信息創建出一系列的窗口。如果窗口類需要運行時創建,必須要使用DECLARE_CLASS宏。注意本工程只是定義了此宏,并沒有使用其動態創建特性。
??????? wxImage::AddHandler()函數給wxImage的全局靜態變量添加對應圖片處理格式的Handler。責任鏈模式在wx庫中有廣泛的使用,作為使用者只需要關注wxImage提供的方法,而圖片格式(*.jpg、*.png、*.gif等)由對應的Handler來處理。另一個使用比較經典的是窗口事件的分發。
??????? New SnakeFrame( NULL ) 以NULL 為父窗指針的類一般直接或間接繼承于wxTopLevelWindow,表示可以作為頂層窗口的類。
??????? SetTopWindow( mainWindow )設置頂層窗口。

三、SnakeFrame類頭文件


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

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

????
// *?初始化類
???? void ?Init();
????
// *?創建窗口框架組件
???? void ?CreateControls();
protected :


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


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

四、SnakeFrame類實現文件部分

IMPLEMENT_CLASS(?SnakeFrame,?wxFrame?)

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

SnakeFrame::SnakeFrame(wxWindow
* ?parent)
{
????
// *?初始化類,并使用基類wxFrame創建Frame,其參數詳細見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 ;

????
// *?創建窗口分割條
????
// *?wxID_ANY?=?-1,表示此窗口不能通過其ID來查詢
????wxSplitterWindow * ?splitterwnd? = ? new ?wxSplitterWindow(?frame?,?wxID_ANY,SNAKEFRAME_POSITION,?SNAKEFRAME_SIZE);

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

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

????m_SplitterWindow?
= ?splitterwnd;
}


??????? wxFrame::Create創建Frame窗口。Wx庫中界面窗口部分類都有兩種創建方式:一、直接使用構造函數直接創建;二、分兩步,第一步使用默認構造函數只初始化類,第二步才使用Create函數來創建窗口。
??????? wxSplitterWindow這里使用其將窗口分割成左右兩部分,并設定分割條大小為0,即防止用戶拖動分割條。這里暫時使用兩個標準窗口來代替,下一個章節將替換這里為我們自己的類。

五、編譯并執行
??????? 設置編譯環境并編譯得到如下界面。

??????? 如果有些部分沒有提到,那是前面章節有可能已經提到,請翻閱前面部分查詢。本系列從wx庫的編譯、配置、到demo的各個部分完成有比較強的依賴次序。


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

posted on 2009-03-16 17:32 zyzx 閱讀(5401) 評論(5)  編輯 收藏 引用 所屬分類: wxWidgets界面庫

評論

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

good, 期待,期待中。  回復  更多評論   

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

你好,向您請教個問題,關于wxWidget的,
我下載了wxWidget 2.8.9準備在wince下使用,但在wince下無法編譯
我打開了build\wince\下的wx.dcw進行編譯,但wxzli、wxpng、wxjpeg、wxepat都能通過,但mono和gl無法通過,問題如下:


6>------ 已啟動全部重新生成: 項目: gl, 配置: Debug Pocket PC 2003 (ARMV4) ------
6>正在刪除項目“gl”(配置“Debug|Pocket PC 2003 (ARMV4)”)的中間文件和輸出文件
6>Creating ..\..\lib\evc_armv4_lib\winced\wx\msw\rcdefs.h
4>pngpread.c
6>'clarm.exe' 不是內部或外部命令,也不是可運行的程序
6>或批處理文件。
6>Project : error PRJ0019: 某個工具從以下位置返回了錯誤代碼: "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 個錯誤,0 個警告

1>------ 已啟動全部重新生成: 項目: mono, 配置: Debug Pocket PC 2003 (ARMV4) ------
2>------ 已啟動全部重新生成: 項目: wxexpat, 配置: Debug Pocket PC 2003 (ARMV4) ------
1>正在刪除項目“mono”(配置“Debug|Pocket PC 2003 (ARMV4)”)的中間文件和輸出文件
2>正在刪除項目“wxexpat”(配置“Debug|Pocket PC 2003 (ARMV4)”)的中間文件和輸出文件
2>正在編譯...
2>xmlparse.c
1>mono : warning PRJ0009 : 未能打開生成日志進行寫入。
1>請確保該文件未被其他進程打開并且未被寫保護。
2>xmltok.c
1>Creating ..\..\lib\evc_armv4_lib\winced\wx\msw\rcdefs.h
1>'clarm.exe' 不是內部或外部命令,也不是可運行的程序
1>或批處理文件。
1>Project : error PRJ0019: 某個工具從以下位置返回了錯誤代碼: "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 個錯誤,1 個警告

我以為是生成順序的問題,但改變順序后依然沒有解決
我改變了關于預編譯的設置 依然沒有解決問題,
我是個新手,關于C語言編譯實在沒有經驗,希望能給予指教謝謝  回復  更多評論   

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

不錯,期待例程之二  回復  更多評論   

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

期待例程之二   回復  更多評論   

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

支持一下,
  回復  更多評論   

導航

統計

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

常用鏈接

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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视频精品在线| 国产一二三精品| 亚洲国产精品第一区二区三区| 欧美午夜大胆人体| 老司机aⅴ在线精品导航| 欧美另类久久久品| 老牛影视一区二区三区| 欧美日韩在线不卡一区| 老司机成人在线视频| 欧美日韩中国免费专区在线看| 久久久久久夜| 国产精品久久久久久久久动漫| 蜜桃伊人久久| 国产精品中文字幕在线观看| 亚洲激情在线激情| 激情欧美亚洲| 亚洲字幕一区二区| 一区二区三区久久网| 久久免费偷拍视频| 久久岛国电影| 国产精品美女久久久久aⅴ国产馆| 免费高清在线视频一区·| 国产精品色一区二区三区| 亚洲激情国产| 亚洲黄网站黄| 久久网站热最新地址| 欧美影院久久久| 欧美色图一区二区三区| 亚洲精品久久久久久下一站| 亚洲国产一区在线| 久久这里有精品视频| 久久久久久久久久久久久女国产乱| 欧美午夜a级限制福利片| 亚洲日本欧美天堂| 一区二区久久久久久| 欧美电影免费观看高清完整版| 美女亚洲精品| 国产一区二区三区不卡在线观看| 亚洲欧美中文日韩v在线观看| 性久久久久久久久久久久| 国产精品激情偷乱一区二区∴| 一区二区欧美在线| 亚洲欧美变态国产另类| 国产精品国产精品| 亚洲欧美综合精品久久成人| 久久国产66| 黄色在线一区| 麻豆av一区二区三区| 欧美第一黄网免费网站| 亚洲精品美女在线观看| 久久精品日韩欧美| 欧美性片在线观看| 亚洲一区日韩| 欧美在线观看网址综合| 国产乱子伦一区二区三区国色天香 | 欧美日韩一区二区三区| 一区二区三区久久网| 亚洲欧美激情一区| 国产欧美日韩麻豆91| 久久国产欧美日韩精品| 亚洲电影免费观看高清完整版| 一区二区免费看| 国产精品综合| 鲁大师成人一区二区三区| 亚洲国产日韩在线一区模特| 亚洲婷婷综合久久一本伊一区| 国产精品午夜春色av| 久久亚洲国产成人| 99国内精品| 快射av在线播放一区| 99ri日韩精品视频| 国产人妖伪娘一区91| 欧美成年人网| 欧美亚洲视频在线看网址| 免费亚洲电影在线| 亚洲视频高清| 亚洲高清一二三区| 国产精品久久久久久久久免费桃花| 小嫩嫩精品导航| 亚洲三级免费| 久久夜色撩人精品| 亚洲天堂av综合网| 一区二区亚洲| 国产精品日韩精品| 欧美不卡激情三级在线观看| 亚洲影院在线| 亚洲美女电影在线| 免费在线欧美黄色| 欧美专区日韩视频| 日韩视频一区二区三区在线播放 | 性视频1819p久久| 免费在线看一区| 久久爱91午夜羞羞| 99视频日韩| 亚洲国产精品一区在线观看不卡| 国产精品久久久久久久久久妞妞| 免费日韩精品中文字幕视频在线| 亚洲一区二区在线免费观看视频 | 亚洲一区二区免费| 91久久在线| 亚洲高清在线| 激情自拍一区| 国产色综合天天综合网| 国产精品啊啊啊| 欧美日韩国产黄| 欧美不卡在线视频| 麻豆freexxxx性91精品| 久久九九国产精品| 欧美在线亚洲综合一区| 午夜视频在线观看一区| 亚洲专区一区| 亚洲综合色视频| 一区二区三区高清视频在线观看| 亚洲三级视频| 日韩视频在线观看免费| 91久久在线视频| 亚洲经典三级| 亚洲人成亚洲人成在线观看图片 | 亚洲精品免费电影| 亚洲东热激情| 亚洲高清不卡一区| 亚洲国产一区二区三区在线播| 欧美国产亚洲视频| 亚洲国产日韩美| 亚洲激情一区二区三区| 亚洲精品乱码久久久久久蜜桃91| 亚洲人成啪啪网站| 99精品国产福利在线观看免费| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 午夜日韩av| 久久精品中文| 久久九九久久九九| 欧美1区3d| 欧美日韩国产页| 国产精品久久午夜夜伦鲁鲁| 国产欧美va欧美va香蕉在| 国产日韩综合| 亚洲激情一区二区三区| 99天天综合性| 欧美亚洲一区二区在线观看| 久久久一区二区| 欧美激情精品久久久久久免费印度| 最新国产の精品合集bt伙计| 亚洲少妇中出一区| 久久精品九九| 欧美日韩精品综合| 国产午夜精品麻豆| 亚洲激情在线播放| 亚洲综合清纯丝袜自拍| 久久久亚洲高清| 最新成人在线| 欧美有码视频| 欧美国产精品| 国产一区二区三区精品久久久| 亚洲毛片播放| 久久久噜噜噜久久人人看| 亚洲靠逼com| 久久久精品国产99久久精品芒果| 欧美日韩ab片| 亚洲第一黄网| 亚洲欧美日本国产专区一区| 免费久久精品视频| 亚洲欧美视频在线观看| 免费欧美日韩国产三级电影| 国产日产欧产精品推荐色| 亚洲美女在线看| 久久综合国产精品| 亚洲欧美成人一区二区三区| 欧美成人精品不卡视频在线观看 | 久久se精品一区精品二区| 欧美精品网站| 亚洲电影免费观看高清| 欧美在线观看www| 一本色道久久精品| 美女精品网站| 狠狠色伊人亚洲综合成人| 亚洲亚洲精品在线观看| 亚洲国产精品成人综合| 久久电影一区| 国产色婷婷国产综合在线理论片a| 这里只有精品视频|