• <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>

            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)筆寫例程,網(wǎng)絡(luò)上關(guān)于wx框架例程也不多。入門最好先讀《Cross-Platform GUI Programming with wxWidgets_CN》(中文版)和wx庫(kù)本身自帶的說(shuō)明文檔
            ??????? 關(guān)于組件的使用,官方源代碼中提供了很多例程wxWidgets-2.8.7\samples。

            ??????? 回想我作為初學(xué)者時(shí),或許走了一些彎路。剛開(kāi)始當(dāng)然是讀教程和官方說(shuō)明文檔,再到手工編寫UI組件(熟悉基本的幾個(gè),其他的在使用上是差不多的),最后是結(jié)合工具DialogBlocks編寫。wx庫(kù)本身還有很多值得挖掘的地方,比如其事件綁定方式、XRC界面配置文件、SIZER界面自動(dòng)配置、還有國(guó)際化等等。
            ??????? 這里我就按手工編寫和借助工具分別寫一份例程,例程的編寫過(guò)程,就是熟悉庫(kù)本身過(guò)程。
            ??????? 第一份手工編寫的例程,我還是想借助于經(jīng)典游戲《貪吃蛇》來(lái)實(shí)現(xiàn)。而第二份使用DialogBlocks來(lái)實(shí)現(xiàn)類似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類中定義應(yīng)用程序啟動(dòng)類,繼承于wxApp。
            ??????? SnakeFrame類定義主Frame,創(chuàng)建界面框架和其中的子窗口組件。

            一、類SnakeApp頭文件定義:

            ?1 class ?SnakeApp:? public ?wxApp
            ?2 {
            ?3 public :
            ?4 ???? // *?定義動(dòng)態(tài)創(chuàng)建類
            ?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是基于線程類有關(guān)的,一般應(yīng)用程序?qū)⒁粋€(gè)繼承wxApp的類作為入口類,再用IMPLEMENT_APP宏定義入口類(入口地址)。
            ??????? DECLARE_EVENT_TABLE宏靜態(tài)定義此類接收的事件處理,未編寫的事件按默認(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(),返回為本類的引用。此全局函數(shù)即為溝通其他各個(gè)部分(比如主Frame->窗口->組件)的中間橋梁。

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

            ?1 // *?入口函數(shù)定義
            ?2 IMPLEMENT_APP(?SnakeApp?)
            ?3
            ?4 // *?動(dòng)態(tài)創(chuàng)建類
            ?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 ???? // *?加載能處理圖片類型驅(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:掛接事件宏。類似MFC中消息部分的處理。
            ??????? DECLARE_CLASS宏表示此類可以被動(dòng)態(tài)創(chuàng)建,指可以在運(yùn)行時(shí)創(chuàng)建。實(shí)質(zhì)是使用wxClassInfo來(lái)標(biāo)記工程中唯一的類,運(yùn)行時(shí)可以使用wxClassInfo信息來(lái)創(chuàng)建該類。Wx庫(kù)中比較經(jīng)典的應(yīng)用是xrc文件中定義了一些窗口信息的文本標(biāo)簽,而程序運(yùn)行時(shí)根據(jù)這些信息創(chuàng)建出一系列的窗口。如果窗口類需要運(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 為父窗指針的類一般直接或間接繼承于wxTopLevelWindow,表示可以作為頂層窗口的類。
            ??????? SetTopWindow( mainWindow )設(shè)置頂層窗口。

            三、SnakeFrame類頭文件


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

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

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


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


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

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

            IMPLEMENT_CLASS(?SnakeFrame,?wxFrame?)

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

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

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

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


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

            posted on 2009-03-16 17:32 zyzx 閱讀(5369) 評(píng)論(5)  編輯 收藏 引用 所屬分類: 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)行寫入。
            1>請(qǐng)確保該文件未被其他進(jìn)程打開(kāi)并且未被寫保護(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)

            隨筆分類

            隨筆檔案

            常用鏈接

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久青青草原精品国产不卡| 狠狠精品干练久久久无码中文字幕| 国产69精品久久久久久人妻精品| 国产A级毛片久久久精品毛片| 久久99国产综合精品| 国内精品久久久久久中文字幕| 日本WV一本一道久久香蕉| 久久丫精品国产亚洲av| 久久久久久久综合日本| 99久久无色码中文字幕| 久久亚洲中文字幕精品一区| segui久久国产精品| 亚洲AV乱码久久精品蜜桃| 久久综合狠狠综合久久97色| 久久精品国产亚洲AV无码麻豆 | 性高湖久久久久久久久| 久久久久女教师免费一区| 久久99国内精品自在现线| 国产99久久久国产精品小说| 精品人妻伦九区久久AAA片69| 久久超乳爆乳中文字幕| 一本一本久久A久久综合精品| 欧美粉嫩小泬久久久久久久| 热99re久久国超精品首页| 久久久无码精品亚洲日韩蜜臀浪潮 | 亚洲狠狠婷婷综合久久久久| 午夜精品久久久内射近拍高清| www亚洲欲色成人久久精品| 久久久精品一区二区三区| 精品乱码久久久久久久| 精品久久久无码人妻中文字幕豆芽| 伊人久久国产免费观看视频| 久久中文字幕视频、最近更新| 国产精品久久久天天影视香蕉| 国产午夜久久影院| 国产精品久久久久AV福利动漫| 少妇高潮惨叫久久久久久| 少妇久久久久久久久久| 国产一级做a爰片久久毛片| 久久精品国产精品青草app| 亚洲国产精品婷婷久久|