• <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,個人移動存儲,zyzx_lsl@163.com

             

            wxWidgets貪吃蛇系列例程之一

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

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

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

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

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

            一、類SnakeApp頭文件定義:

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

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

            ?1 // *?入口函數(shù)定義
            ?2 IMPLEMENT_APP(?SnakeApp?)
            ?3
            ?4 // *?動態(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ū)動
            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宏表示此類可以被動態(tài)創(chuàng)建,指可以在運行時創(chuàng)建。實質(zhì)是使用wxClassInfo來標(biāo)記工程中唯一的類,運行時可以使用wxClassInfo信息來創(chuàng)建該類。Wx庫中比較經(jīng)典的應(yīng)用是xrc文件中定義了一些窗口信息的文本標(biāo)簽,而程序運行時根據(jù)這些信息創(chuàng)建出一系列的窗口。如果窗口類需要運行時創(chuàng)建,必須要使用DECLARE_CLASS宏。注意本工程只是定義了此宏,并沒有使用其動態(tài)創(chuàng)建特性。
            ??????? wxImage::AddHandler()函數(shù)給wxImage的全局靜態(tài)變量添加對應(yīng)圖片處理格式的Handler。責(zé)任鏈模式在wx庫中有廣泛的使用,作為使用者只需要關(guān)注wxImage提供的方法,而圖片格式(*.jpg、*.png、*.gif等)由對應(yīng)的Handler來處理。另一個使用比較經(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類實現(xiàn)文件部分

            IMPLEMENT_CLASS(?SnakeFrame,?wxFrame?)

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

            SnakeFrame::SnakeFrame(wxWindow
            * ?parent)
            {
            ????
            // *?初始化類,并使用基類wxFrame創(chuàng)建Frame,其參數(shù)詳細見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,表示此窗口不能通過其ID來查詢
            ????wxSplitterWindow * ?splitterwnd? = ? new ?wxSplitterWindow(?frame?,?wxID_ANY,SNAKEFRAME_POSITION,?SNAKEFRAME_SIZE);

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

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

            ????m_SplitterWindow?
            = ?splitterwnd;
            }


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

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

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


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

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

            評論

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

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

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

            你好,向您請教個問題,關(guān)于wxWidget的,
            我下載了wxWidget 2.8.9準(zhǔn)備在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' 不是內(nèi)部或外部命令,也不是可運行的程序
            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' 不是內(nèi)部或外部命令,也不是可運行的程序
            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 個警告

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

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

            不錯,期待例程之二  回復(fù)  更多評論   

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

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

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

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

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            常用鏈接

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久久久亚洲AV无码专区桃色| 奇米综合四色77777久久| 97精品国产97久久久久久免费| 精品乱码久久久久久夜夜嗨| 亚洲成色999久久网站| 久久免费视频网站| 品成人欧美大片久久国产欧美| 久久精品国产91久久麻豆自制| 久久久久久狠狠丁香| 99久久国产免费福利| 久久国产V一级毛多内射| 精品久久久无码中文字幕| 久久精品成人免费观看97| 亚洲国产香蕉人人爽成AV片久久 | 久久久久国产精品三级网| 久久久精品人妻无码专区不卡| 久久久久亚洲精品中文字幕| 午夜精品久久久久久| 国产成人精品三上悠亚久久| 久久久精品国产sm调教网站| 久久久久久免费一区二区三区| 国产一区二区精品久久岳| 一级A毛片免费观看久久精品| 久久人人爽爽爽人久久久| 99久久www免费人成精品| 日韩欧美亚洲综合久久| 精品久久久久香蕉网| 久久夜色精品国产| 久久久久亚洲av无码专区导航 | 久久精品aⅴ无码中文字字幕重口 久久精品a亚洲国产v高清不卡 | 久久AAAA片一区二区| 久久久久精品国产亚洲AV无码| 久久精品国产99久久无毒不卡 | 欧美粉嫩小泬久久久久久久 | 久久精品桃花综合| 国产精品99久久99久久久| 久久伊人色| 久久亚洲高清观看| 日日噜噜夜夜狠狠久久丁香五月| 久久综合久久综合久久综合| 久久精品视频一|