




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、摘摘 要要 俄羅斯方塊是非常傳統(tǒng)的游戲,操作簡單,難度卻不低,廣受娛樂界歡迎。給人們 的生活帶來了健康愉快的補(bǔ)充,唯美的藝術(shù)享受。 本文在基于 visual c+實(shí)現(xiàn)的單機(jī)版俄羅斯方塊游戲的基礎(chǔ)上,深入的研究 mfc 框 架中的各個類的關(guān)系和它們內(nèi)部之間的聯(lián)系。 主要工作和結(jié)論: 1. 分析了俄羅斯游戲規(guī)則。 2.系統(tǒng)的介紹了實(shí)現(xiàn)俄羅斯方塊游戲的算法設(shè)計過程。 3. 將研究的思路運(yùn)用于實(shí)際,在 vc+6.0 平臺下實(shí)現(xiàn)了俄羅斯方塊游戲。 關(guān)鍵詞關(guān)鍵詞 :俄羅斯方塊游戲;vc+;mfc 框架 abstract russia is a very traditional box of the gam
2、e, simple operation, the difficulty is not low, widely welcomed by the entertainment industry. to the peoples life a happy and healthy complement to the flavor of the enjoyment of the arts. in this paper, based on the visual c + + to achieve the single version of the russian box on the basis of the
3、game, mfc-depth study in the framework of various types and their internal relations between the links. and the main conclusions : 1. analysis of the russian rules of the game. 2. the system introduces a game of russian box algorithm design process. 3. will examine the practical application of ideas
4、, in vc + +6.0 platform under the russian box game. key words : russian box game; vc + +; mfc framework 目目 錄錄 摘摘 要要.i abstract.i 1 引言引言 .3 1.1 選題及研究意義選題及研究意義 .3 1.2 論文研究的主要內(nèi)容論文研究的主要內(nèi)容 .3 2.1 appapp 應(yīng)用程序類物件應(yīng)用程序類物件 .4 2.2 文檔文檔視圖機(jī)制視圖機(jī)制 .5 2.3 documentdocument 文擋操作文擋操作 .6 2.4 文檔文檔- -視圖的關(guān)聯(lián)視圖的關(guān)聯(lián) .6 3 俄羅斯游
5、戲分析和總體設(shè)計俄羅斯游戲分析和總體設(shè)計 .7 3.1 俄羅斯方塊俄羅斯方塊游戲游戲功能描述功能描述 .8 3.2 游戲游戲規(guī)則規(guī)則分析分析 .8 4 俄羅斯方塊游戲的實(shí)現(xiàn)俄羅斯方塊游戲的實(shí)現(xiàn) .9 4.1 游戲游戲核心數(shù)據(jù)的抽象與設(shè)計核心數(shù)據(jù)的抽象與設(shè)計 .10 4.2 操作方法的抽象與設(shè)計操作方法的抽象與設(shè)計 .13 4.3 流程的設(shè)計流程的設(shè)計與實(shí)現(xiàn)與實(shí)現(xiàn) .15 4.3.1 正常流程的設(shè)計正常流程的設(shè)計 .15 4.3.2 正常流程的實(shí)現(xiàn)正常流程的實(shí)現(xiàn)( (定時處理定時處理) ) .16 4.3.3 中斷操作流程的設(shè)計中斷操作流程的設(shè)計 .19 4.3.3 中斷操作流程的實(shí)現(xiàn)中斷操作流
6、程的實(shí)現(xiàn) .20 4.4 游戲區(qū)域繪圖的實(shí)現(xiàn)游戲區(qū)域繪圖的實(shí)現(xiàn) .21 4.4.1 位圖資源的準(zhǔn)備位圖資源的準(zhǔn)備 .21 4.4.2 繪圖機(jī)制設(shè)計繪圖機(jī)制設(shè)計 .22 4.4.3 繪圖環(huán)境資源的初始化和釋放繪圖環(huán)境資源的初始化和釋放 .22 4.4.4 游戲區(qū)域的繪制游戲區(qū)域的繪制 .24 5. .功能的完善功能的完善 .27 5.1 游戲背景音樂的實(shí)現(xiàn)游戲背景音樂的實(shí)現(xiàn) .29 5.2 工具欄快捷鍵的實(shí)現(xiàn)工具欄快捷鍵的實(shí)現(xiàn) .30 結(jié)束語結(jié)束語 .33 參考文獻(xiàn)參考文獻(xiàn) .33 致致 謝謝 .34 俄羅斯方塊游戲的實(shí)現(xiàn) 1 引言 我們國家正處于全球文化產(chǎn)業(yè)日新月異大格局中,電子游戲、網(wǎng)絡(luò)游戲
7、的發(fā)展速度 之快,更是令人眼花繚亂,目不暇接。未來的電子和游戲發(fā)展趨勢必將是更智能化、更 藝術(shù)性、更人性味。在高性能的硬件設(shè)備的支持下,游戲的驅(qū)動引擎更具威力,控制功 能更加完備,在一個錯綜復(fù)雜的極度擴(kuò)張的游戲大世界中,帶著超乎常人智慧的人工智 能的應(yīng)對力,使得所有要素包括藝術(shù)的風(fēng)格、情感的互動、故事的鋪展、視覺的表現(xiàn)、 用戶的界面,融合為有機(jī)的一體,給人們帶來更豐富的娛樂和體驗(yàn)。好的游戲給人們的 生活帶來了健康愉快的補(bǔ)充,唯美的藝術(shù)享受,潛默的教育功效。 本系統(tǒng)采用vc+為主要開發(fā)工具設(shè)計實(shí)現(xiàn)了一個單機(jī)板的俄羅斯方塊游戲。與其他 程序相比,筆者的作品有三個特色:一是精心設(shè)計的人機(jī)界面,不僅友
8、好而且易于操作。 二是筆者的游戲采用的是單機(jī)板。三是采用mfc應(yīng)用程序開發(fā)模型進(jìn)行編制,使開發(fā)人 員減輕創(chuàng)建windows應(yīng)用程序的負(fù)擔(dān)。網(wǎng)絡(luò)版的俄羅斯方塊游戲是兩個玩家通過網(wǎng)絡(luò)進(jìn)行 較量,但在游戲過程中數(shù)據(jù)要通過服務(wù)器進(jìn)行傳送,網(wǎng)絡(luò)版游戲經(jīng)常會出現(xiàn)斷線、超時 等情況這些都是因?yàn)榫W(wǎng)絡(luò)的速度比較慢造成的。而筆者設(shè)計的俄羅斯游戲雖然是單機(jī)版 的,但速度快,提高了效率。 1.1 選題及研究意義選題及研究意義 俄羅斯方塊游戲是一個比較經(jīng)典的游戲,根據(jù)軟件工程有關(guān)的規(guī)范,以合理的開發(fā) 原則,設(shè)計出單機(jī)的俄羅斯方塊游戲,并給人們的生活帶來唯美的藝術(shù)享受和健康愉快 的補(bǔ)充。 游戲軟件是一種與文化背景密切聯(lián)系
9、的產(chǎn)品,具有很強(qiáng)的民族性和豐富的文化內(nèi)涵。 伴隨著游戲軟件在市場上的銷售,與其相關(guān)的文化也隨之傳播。因此發(fā)展我國自主的益 智、健康的游戲軟件已是當(dāng)務(wù)之急。游戲是一種基于計算機(jī)的應(yīng)用軟件,是新型的休閑 娛樂方式。當(dāng)前開發(fā)的游戲軟件應(yīng)該做到知識性、娛樂性、趣味性、教育性相統(tǒng)一。 1.2 論文研究的主要內(nèi)容論文研究的主要內(nèi)容 在論文完成過程中,認(rèn)真學(xué)習(xí)了游戲開發(fā)的基本技術(shù),ood 方法軟件設(shè)計的基礎(chǔ)知識, vc+程序設(shè)計語言等。結(jié)合游戲開發(fā)的過程、算法的設(shè)計與分析(如下墜物的生成、下 墜物隨機(jī)選擇、游戲區(qū)畫板實(shí)現(xiàn)的方法等)、軟件工程等角度重點(diǎn)研究了實(shí)現(xiàn)游戲的算 法和采用 vc+平臺設(shè)計游戲的優(yōu)點(diǎn)和現(xiàn)
10、存結(jié)構(gòu)的不足之處。 以下是論文的組織結(jié)構(gòu): 第 1 部分是引言,主要介紹論文選題的意義、選題背景等相關(guān)情況。 第 2 部分概述 mfc 應(yīng)用程序框架。 第 3 部分是游戲規(guī)則的分析。 第 4 部分是游戲算法的實(shí)現(xiàn)、游戲功能模塊、操作界面以及系統(tǒng)分析及設(shè)計。 第 5 部分是對整個論文的結(jié)束語。對論文的主要工作作了歸納總結(jié),分析了進(jìn)一步 需要做的工作。 2 mfcmfc 應(yīng)用程序架構(gòu)應(yīng)用程序架構(gòu) 傳統(tǒng)的 windows 應(yīng)用程序的開發(fā)使用 api(application programming interface)函 數(shù)。api 函數(shù)的功能主要是為 windows 應(yīng)用程序開發(fā)提供統(tǒng)一的編程接口。
11、在使用 api 編 程的過程中,窗口的創(chuàng)建和消息的處理都需要手工編碼。一個簡單的 windows 應(yīng)用程序 的代碼需要上百行,這使 windows 應(yīng)用程序開發(fā)變成了一件繁重的工作?,F(xiàn)在編程,都 是在 visual c+ 環(huán)境下采用基本 mfc(microsoft foundation class)的 windows 編程方 法。 microsoft 基本類庫 mfc 是一個 windows 應(yīng)用程序框架,它是 c+類結(jié)構(gòu)的擴(kuò)展。利 用 mfc 提供的面向?qū)ο蟪绦蛐猩珯C(jī)的框架,可大大減輕程序開發(fā)人員創(chuàng)建 windows 應(yīng)用 程序的負(fù)擔(dān)。mfc 提供了管理窗口、菜單、對話誆的代碼,可實(shí)現(xiàn)基本的
12、輸入輸出和數(shù) 據(jù)的存儲。 此外,mfc 還提供一個應(yīng)用程序來發(fā)模型,此模型被稱為文檔視圖模型。文檔視圖 模型視將應(yīng)用程序數(shù)據(jù)與用戶界面元素分離的一種應(yīng)用編程方法,它允許這兩部分程序 獨(dú)立存在。這樣,程序員在更改其中部分代碼的時候,不會大幅度地更改另一部分。 該游戲的實(shí)現(xiàn)采用 mfc 框架。在構(gòu)架類視圖中有 mfc 基本架構(gòu)組合 : app(應(yīng)用程 序)類、document(文檔)類、view(視圖)類、frame(框架)類和用于提示關(guān)于作者的對話 框 caboutdlg 類。下面對這幾個類做一個簡單的列表,如表 2.1 所示。 表 2.1 mfc 應(yīng)用程序架構(gòu)表 類別基類 描述 applica
13、tioncwinapp代表應(yīng)用程序的核心 documentcdocument包含應(yīng)用程序的數(shù)據(jù)集 windows cwind主要用于圖形用戶界面(gui)的對象,可以處理常見的 windows 消息 framecframewnd用于應(yīng)用程序的主要 windows 框架 viewvciew用于顯示數(shù)據(jù)并與文檔 document 對象交互 2.1 appapp 應(yīng)用程序類物件應(yīng)用程序類物件 每種語言都有一個程序入口(主函數(shù)),如 c/c+語言的 main()函數(shù)??偟貋碚f, main()函數(shù)的調(diào)用與終止代表著程序執(zhí)行的開始與結(jié)束,在程序運(yùn)行的過程中,無非是對 一些業(yè)務(wù)性的功能流程進(jìn)行不斷的處理,當(dāng)
14、完成后才退出程序。其實(shí),所有的程序也是采 用同樣的方法去實(shí)現(xiàn), mfc 機(jī)制巧妙地利用了 application 類去封裝實(shí)現(xiàn)了這樣的效果 功能,每個 cwinapp 類對象實(shí)體都代表應(yīng)用程序本身,它是基本的 application class(應(yīng) 用程序類),其封裝了 windows-based 應(yīng)用程序的初始化、運(yùn)行、 message 映射和終止 等功能。假如創(chuàng)建了這樣的一個對象實(shí)體,在運(yùn)行期間處理初始化、消息映射、或者其他 動作時就可以通過屬性操作的調(diào)用去實(shí)現(xiàn),而不像擁有結(jié)構(gòu)化設(shè)計思想的 maino 函數(shù)那 樣的順序去實(shí)現(xiàn)。那么,現(xiàn)在就來看看這個 cwinapp 類對象的性質(zhì)。 在 mf
15、c 框架中,應(yīng)用程序必須有且僅有一個從 cwinapp 派生的 class object(類物 件),這個 object 在 windows 創(chuàng)建之前就會被創(chuàng)建,也就是說這個 object 會和其他 c+ 全局 object 同時創(chuàng)建。當(dāng) windows 調(diào)用 winmaino 時(在 mfc 應(yīng)用程序中,不必親自調(diào) 用 winmaino,因?yàn)闄C(jī)制已經(jīng)對它封裝好,當(dāng)應(yīng)用程序啟動時會由框架自動調(diào)用),這個 object 已經(jīng)可用了,并且該 object 是全局的。 當(dāng)用 appwizard 創(chuàng)建 documentniew 模式應(yīng)用程序時,appwizard 會聲明一個從 cwinapp 派生的
16、application class, 因此,由 appwizard 所產(chǎn)生的.cpp 文件中還包括 message 映射、空的構(gòu)造函數(shù)、一個應(yīng)用程序 object(即一個變量)和 initinstanceo 函 數(shù)。appwizard 提供的源代碼和 message 映射可以滿足一些基本的任務(wù),但在通常情況下,還是需要手工 修改那些源程序,特別是要修改 initinstance()函數(shù)。 在 cwinapp 中,有以下幾個關(guān)鍵的可重寫的成員數(shù)。 initinstance(): 此函數(shù)對文檔模板(document template)進(jìn)行創(chuàng)建和初始化,即在 這過程中伴隨著 document、vie
17、w 和 frame 的創(chuàng)建。 run(): 初始化后,winmain 就會調(diào)用這個成員函數(shù)去處理 message 循環(huán)。 exitinstance(): 每當(dāng)一個應(yīng)用程序的 copy (拷貝)終止時,就會調(diào)用這個函數(shù), 即發(fā)生在應(yīng)用程序退出時。 onidle(): 當(dāng)沒有 windows message 處理時,就會由 framework 調(diào)用這個函數(shù),并 重寫這個函數(shù)去執(zhí)行后臺任務(wù)。 當(dāng)用戶從 cwinapp 派生一個 application class 時,必須重寫成員函數(shù) initinstance() 去創(chuàng)建應(yīng)用程序的 main window objecto windows 允許同時運(yùn)行
18、同一個 應(yīng)用程序的多個“copy”, 而且該應(yīng)用程序的每個 instance(包括第一個的)都會被初始 化,而初始化時都會用到被 override 了的 initinstance() 函數(shù)所提供的信息。 通常情況下,每個 windows-based 應(yīng)用程序都有一個 main window 。因此,在初始化 完成后, framework 就會檢查是否存在一個指向有效 main windows( cwinapp:m_pmain wnd) 的指針,如果不存在的話,應(yīng)用程序就會終止。 當(dāng)利用 appwizard 創(chuàng)建應(yīng)用工程項(xiàng)目時,appwizard 會重寫缺省的 initinstance() 來創(chuàng)
19、建 main window object,還會使 cwinapp 的數(shù)據(jù)成員 m_pmainwnd 指向那個 window 。 2.2 文檔文檔視圖機(jī)制視圖機(jī)制 文檔對視圖的管理。若用非文檔,視圖機(jī)制的時候,交互界面顯示的只有一種視圖,在 這種情況下,可以將內(nèi)部數(shù)據(jù)以一種對應(yīng)規(guī)則用圖像顯示出來。將一份數(shù)據(jù)用不同的方式 去展示,并且將它們放在不同的窗口視圖中,mfc 機(jī)制給出了這樣的實(shí)現(xiàn)方法:先用一個 cdocument 這樣的物件去處理數(shù)據(jù)的管理,然后用一個 cview 這樣的物件去管理視圖的顯 示,這樣一來,所有不同的顯示圖像若要以某種方式反映出數(shù)據(jù)的特性,必須在數(shù)據(jù)源和眾 多不同方式的圖像
20、顯示之間有一定的關(guān)聯(lián)。對于它們的關(guān)聯(lián),mfc 機(jī)制用了一個很好的方 法,就是將所有與這個數(shù)據(jù)源相關(guān)的圖像顯示都獨(dú)立用 cview 物件去表示,而當(dāng)數(shù)據(jù)源就 抽象成 cdocument 物件, 而在 document 中有這樣的一個指針列表 cptrlist 類型的日 員變量 m_viewlist, 將所有這些與之關(guān)聯(lián)的視圖用鏈表串起來。而這些用于顯示不同性 質(zhì)的圖像視圖類也可以通過 getdocument()來獲取其所對應(yīng)的 document 文檔數(shù)據(jù)。 2.3 documentdocument 文擋操作文擋操作 由于 mfc 機(jī)制設(shè)計出文檔類對象專門負(fù)責(zé)數(shù)據(jù)的 i/o 存取和數(shù)據(jù)的運(yùn)算和操作
21、等。 一般來說,數(shù)據(jù)運(yùn)算是通過 document 類里面的擴(kuò)展功能來實(shí)現(xiàn)的,這樣做可以形成一種 密集數(shù)據(jù)處理,達(dá)到方便易用和管理的好處。 對于一個文件而言,如果文件內(nèi)對象的排列順序是固定的,那么對于文件讀和寫從形 式上只有使用的運(yùn)算符的不同。在 mfc 的文檔-視圖-框架結(jié)構(gòu)中,一個文檔的內(nèi)部對象 的構(gòu)成往往是固定的,在這種情況下,寫到文件中的對象在文件中的布局也是固定的。因 此 cdocument 是利用其基類 cobject 提供的 serilize()虛函數(shù)實(shí)現(xiàn)自動文檔的讀寫操 作的。 當(dāng)用戶在界面上選擇文件菜單或打開文件 (id_file_open)時,cwinapp 派生類的 onf
22、ileopeno 函數(shù)將被自動調(diào)用,它通過文檔模板創(chuàng)建或重用框架、文檔和視圖對象,并最 終調(diào)用 cdocument: :onopendocument()來讀文件。 當(dāng)用戶選擇菜單文件或文件保存(id_file_save) ,選擇文件或另存(id_file_saveas) 時,是通過呼叫函數(shù) cwinapp: :onfilesave() 和 cwinapp: :onfilesaveas()并最終調(diào)用 cdocument: :onsavedocument() 實(shí)現(xiàn)的。 2.4 文檔文檔- -視圖的關(guān)聯(lián)視圖的關(guān)聯(lián) 視圖與文檔和窗口的關(guān)聯(lián)和協(xié)調(diào)工作可以從視圖類對象的 ondraw() 函數(shù)開始,找出
23、關(guān)聯(lián)的物件與關(guān)系。在 mfc 機(jī)制中,關(guān)于 documentniew 架構(gòu)的項(xiàng)目工程和 ondrawo 函 數(shù)的驅(qū)動繪圖觸發(fā)的流程 : cdocument:updateaiiviews()-cview:onupdate()- cwnd: :invalidate()- onpaint()-ondraw() 從流程可知當(dāng)用于裝載重要數(shù)據(jù)的 document 類對象中的數(shù)據(jù)發(fā)生變化時,為了能讓 與其關(guān)聯(lián)的各個視圖實(shí)時表現(xiàn)出數(shù)據(jù)的特征性質(zhì),需要通知所有這些關(guān)聯(lián)的視圖進(jìn)行更新 重繪 , 而 document 類對象就擁有通知所有視圖重繪的這樣的一個功能函數(shù)。對于 updateaiiviews() 函數(shù)實(shí)
24、現(xiàn)對各個視圖類對象對數(shù)據(jù)顯示的更新是通過文檔類內(nèi)部 cptrlist 類型的成員變量 m_viewlist 來維護(hù)和管理所有相關(guān)聯(lián)的視圖對象 , 如圖 1.1 所示。 document 圖 1.1 變量 m_viewlist 視圖對象 而對于該文檔關(guān)聯(lián)視圖的增添,與將 documenttemplte 文檔模板添加到模板類表一 樣, 也是有相應(yīng)的處理函數(shù),對于文檔模板在模板管理列表的添加是在 app 類的 initlnstance()里面使用 adddoctemplate() 函數(shù)去實(shí)現(xiàn),而對于視圖在視圖列表的添加, 可以使用 document 類對象的成員函數(shù) addview() 去實(shí)現(xiàn)。 當(dāng)
25、與文檔類關(guān)聯(lián)的視圖類收到文檔類通過 updateaiiviews() 函數(shù)發(fā)出的更新重繪通知 后 , 會觸發(fā)視圖類的 onupdate() 函數(shù)的實(shí)現(xiàn)。 m_viewlist pview_1 pview_2 pview_3 pview_4view_4 view_3 view_2 view_1 3 俄羅斯游戲分析和總體設(shè)計俄羅斯游戲分析和總體設(shè)計 3.1 俄羅斯方塊俄羅斯方塊游戲游戲功能描述功能描述 對于俄羅斯方塊游戲,其功能描述如下: 游戲開始,游戲區(qū)域上方不斷地出現(xiàn)預(yù)定義形狀的下墜物件。 下墜物件可以通過旋轉(zhuǎn)改變其顯示形態(tài),并且不斷地往下墜, 直到它接觸到游戲區(qū) 域底部或其他之前已經(jīng)累疊起的
26、下墜物件。當(dāng)一個下墜物件到達(dá)底部后,其位置則確定下 來并占有該空間的位置區(qū)域。 當(dāng)游戲區(qū)域的某一行被下墜物件完全填充,則消除該行的所有下墜物,壘在其上的 物件將掉下代替該行空間。 游戲的結(jié)束是以下墜物件的頂部到達(dá)游戲區(qū)域頂部作為判斷依據(jù),表示裝滿溢出。 并且在某一瞬間,下一個下墜物件的形態(tài)在游戲區(qū)域的右上方有預(yù)先提示,同時每抵消一 行空間積分自增 100。 3.2 游戲游戲規(guī)則規(guī)則分析分析 首先,在游戲開始后檢查當(dāng)前的下墜物是否已經(jīng)到了底部,如果不是的話就將下墜物 到了該定時器間隔的時間后整體往下移動一個單位,否則,進(jìn)行到達(dá)底部后的操作。對于到 達(dá)底部后的操作,可以分成以下幾個步驟來處理。 (
27、1)先對進(jìn)行到底部后的所有可以抵消的行進(jìn)行銷行處理。 (2)生成一個新的“下一個下墜物”,這個下墜物的形態(tài)需要隨機(jī)地生成。 (3)在將舊的“下一個下墜物”置換成新的下一個下墜物,并在屏幕右上方顯示。 (4)將當(dāng)前的“下墜物”換成以前產(chǎn)生的舊的“下一個下墜物”,并且馬上使用。由于 在這個過程中已經(jīng)重新使用了一個新的下墜物件,在剛使用時并且還沒有下降前,應(yīng)該判斷 它是否已經(jīng)不可以下降到底部(也就是說,在方塊己經(jīng)堆砌到接近游戲區(qū)域頂部的時候,下 墜物件一旦被使用,就已經(jīng)到達(dá)了底部),如果是剛好到達(dá)底部則實(shí)行銷行檢測和操作, 并 且判斷頂部(第一行)的某些區(qū)域是否已經(jīng)被占用了,是則表示游戲已經(jīng)觸發(fā)結(jié)束
28、的標(biāo)志時 間,應(yīng)該進(jìn)入游戲結(jié)束狀態(tài)。 (5)在前面判斷為到達(dá)底部后,進(jìn)行銷行檢測與操作。 (6)在下墜物到達(dá)底部的同時,判斷是否已經(jīng)到達(dá)了游戲的頂部,是則表示游戲結(jié)束,進(jìn) 行游戲結(jié)束的資源釋放與數(shù)據(jù)環(huán)境清理工作 整個流程如圖 1.2 所示。 開始 到達(dá)低部 1.銷行操作 2.生成新的“下一個下墜物” 3.將新生的下墜物代替舊的 “下一個下墜物” 4.將舊的“下一個下墜物” 用作當(dāng)前下墜物 5.銷行操作 6.游戲結(jié)束處理 到達(dá)頂部, 游戲結(jié)束 結(jié)束 到達(dá)低部 7.下降一個單位 圖 1.2 流程圖 4 俄羅斯方塊游戲的實(shí)現(xiàn)俄羅斯方塊游戲的實(shí)現(xiàn) 俄羅斯方塊游戲設(shè)計的實(shí)現(xiàn),主要包括游戲核心數(shù)據(jù)的抽象與
29、設(shè)計、操作方法的抽象 與設(shè)計、及流程的設(shè)計與實(shí)現(xiàn)等。下面將對這幾個部分作具體的設(shè)計。 4.1 游戲游戲核心數(shù)據(jù)的抽象與設(shè)計核心數(shù)據(jù)的抽象與設(shè)計 在抽象出方法和屬性前,先來分析一下整個游戲的具體實(shí)現(xiàn)。首先 , 游戲有開始、 暫停、結(jié)束等操作接口,而在游戲過程中,隨著用戶的按鍵交互,會出現(xiàn)方塊的形態(tài)變化、 方塊快速下墜、安放該下墜物件、銷毀填滿的行、產(chǎn)生下一將要出現(xiàn)的方塊等功能。這 里,先分析游戲的特點(diǎn),把整個游戲的核心數(shù)據(jù)結(jié)構(gòu)提取出來,再根據(jù)數(shù)據(jù)結(jié)構(gòu)的特點(diǎn)提取 出核心功能模塊的關(guān)聯(lián),然后對這些功能一一進(jìn)行細(xì)化,從而完成整個游戲的設(shè)計。 下面就來分析整個游戲的整體狀況,如圖 1.3 所示。 圖 1
30、.3 游戲內(nèi)部方塊 從如圖 1.3 所示可以看到,游戲區(qū)域可以看作是由許多個等面積的小方塊構(gòu)成的大 面積區(qū)域。而這些區(qū)域的狀態(tài)只有 2 種,被下墜物占據(jù)和空閑(沒有被下墜物占據(jù)),因此, 對于整個游戲區(qū)域的數(shù)據(jù),用一塊空間來標(biāo)識即可。其狀態(tài)只有兩種:被占據(jù) 1 和空閑 0。 這塊空間的分配,可以采用動態(tài)分配的方式或者靜態(tài)分配的方式去實(shí)現(xiàn),至于數(shù)據(jù)結(jié)構(gòu)的 選擇,可以是鏈表、隊(duì)列或者數(shù)組等,我這里選擇靜態(tài)分配并劃分一個足夠大的二維數(shù)組 的方式來實(shí)現(xiàn),如下所示。 /in file:skyblue_rectview.h #define max_row 100 /地圖的最大行數(shù) #define max_
31、col 100 /地圖的最大列數(shù) /in file:skyblue_rectview.h class:cskyblue_rectview /內(nèi)部存取數(shù)據(jù)結(jié)構(gòu) int m_statemapmax_rowmax_col 從上述代碼可以看到,在視圖類對象里面分配了一個存儲游戲區(qū)域地圖狀態(tài)的二維數(shù) 組 id_statemap 成員變量,并定義其最大行數(shù)和列數(shù)都為 100(當(dāng)然,實(shí)際可能并不需要那 么大,只是先分配好足夠的地圖空間以供使用而已)。同時,還應(yīng)該預(yù)先定義該區(qū)域的兩種 狀態(tài)值: #define map_state_empty 0 /空(未被占據(jù)) #define map_state_not_e
32、mpty 1 /被占據(jù) 整個游戲區(qū)域的地圖設(shè)計好后,再來看看具體的下墜物,通過分析它們的特性,還可以 抽象出一些物件來。在每個下墜物在下墜的過程中,總是占有地圖中的某一塊區(qū)域,那么 怎樣表達(dá)這些下墜物的形態(tài)和它們占有的位置關(guān)系呢?在此,先來看看它們的基本類型,然 后進(jìn)行歸納分析,其基本類型如圖 1.4 所示。 圖 1.4 方塊基本類型 從圖 1.4 可以看到,這些下墜物的形狀一共有 7 種,對于這些形態(tài)各異的下墜物間存 在一個最基本的共性,就是它們占有的位置空間是一樣的,都是 4 個小方塊區(qū)域。對于它 們在某一瞬間的位置標(biāo)識,我們可以采用一個 4x2 的小數(shù)組標(biāo)識出來,如圖 1.5 所示。 圖
33、 1.5 方塊位置標(biāo)識 也就是說,用 4 個存儲單位空間存儲當(dāng)前下墜物的每一子塊的位置來對整 個下墜物 件的位置進(jìn)行標(biāo)識,而每個存儲空間的大小就是一個點(diǎn)的坐標(biāo)值(x,y),于是就有如下定義。 /in file : skyblue_rectciew.h /用于保存當(dāng)前方塊的動態(tài)位置,4 個小方塊分別在大數(shù)組中的存放位置為先左后右, /每一列又遵循先上后下的原則 int activestatus42; /存入下一個要出現(xiàn)的方塊形狀的數(shù)組 int nextstatus42; 在上述代碼中,分配了一個整型的二維數(shù)組 acticestatus來存儲每個下墜物的 4 個子方塊的坐標(biāo)位置,其實(shí)在游戲過程中,
34、變動的下墜物件除了當(dāng)前用戶正在操控的下墜 物件外,項(xiàng)目程序的右上方還需要顯示出下一個下墜物件的形狀。也就是說,在游戲過程 中的某一瞬間,除了需要記錄當(dāng)前用戶正在控制的下墜物狀態(tài)外,還需要記錄預(yù)先隨機(jī)生 產(chǎn)出來的下墜物件狀態(tài),于是代碼中多了一個 nextstatus數(shù)組成員變量,用以存儲下 墜物的形態(tài)。還有一個問題沒有解決,這些形狀各異的下墜物件,雖然都是由 4 個小方塊 構(gòu)成,但是對于它們的編號還沒有一定的規(guī)律,因此需要人為地定下一些規(guī)則,而 這個規(guī)則就是:編號從下墜物的左邊起往右編排,而在同一列的方塊中,則從上 往下的順序開始編號它們的對應(yīng)關(guān)系如圖 1.6 所示。 圖 1.6 方塊類型對應(yīng)位
35、置標(biāo)識 如圖 1.6 所示的兩個不同的下墜物,每個方塊按照從左到右的方式進(jìn)行編號,并且在 編號過程中對于同一列的方塊實(shí)行從上到下進(jìn)行編號,而該方塊所在游戲區(qū)域的位置坐標(biāo) 則 存儲在下標(biāo)與編號所對應(yīng)的 acticestatus二維數(shù)組的每個單位里面,如: acticestatus00 和 acticestatus01則是第 0 號方塊的橫坐標(biāo) x 和縱坐標(biāo) y。 acticestatus20 和 acticestatus21則是第 2 號方塊的橫坐標(biāo) x 和縱坐標(biāo) y。 至此,可以實(shí)現(xiàn)下墜物件的位置標(biāo)識了,那么對于某一下墜物的形態(tài)特性又怎么標(biāo)識 呢?可以使用這樣的方法:用一個宏去標(biāo)識 ,第 1
36、位的數(shù)值變化范圍為 17,用于標(biāo)識下 墜物的種類(7 種),第 2 位標(biāo)識該種類下墜物的不同形態(tài),不同的下墜物,如“田”字形的 下墜物只有 1 種形態(tài),所以沒有第 2 位,其他的不同形態(tài)則從 14(最多有 4 種形態(tài))按順 序標(biāo)識即可,如第 2 種下墜物的第 3 種形態(tài),其宏標(biāo)識為 23,如圖 1.7 所示。 01 2 3 2 03 1 下墜物編號:4 狀態(tài)編號: 1 2 3 4 形狀宏標(biāo)識 41 42 43 44 圖 1.7 方塊變形表示 4.2 操作方法的抽象與設(shè)計操作方法的抽象與設(shè)計 當(dāng)完成整個游戲的基本核心數(shù)據(jù)的表達(dá)并進(jìn)行抽象與設(shè)計后,接下來,就可以根據(jù)游 戲的特性對核心的基本操作方法
37、進(jìn)行抽象,進(jìn)而實(shí)現(xiàn)這些功能。下面將著重分析游戲過 程中的實(shí)現(xiàn)細(xì)節(jié),以便抽象出基本的操作功能。 首先是游戲開始,應(yīng)該有個事件觸發(fā)游戲的開始,譬如菜單欄選項(xiàng)等,相應(yīng)地,也可以 類推出游戲暫停與游戲結(jié)束等操作功能。 游戲開始后,產(chǎn)生一個下墜物件,并且在右上角生成下墜物件的基本形態(tài),因此有隨 機(jī)物件產(chǎn)生這個操作。在游戲過程中,方塊會自動隨著時間的推移而向下移動,因此有向 下移動的操作。在游戲過程中,用戶可以通過按鍵對下墜物的功能進(jìn)行操作,如變形操作、 加速下降操作、向左移動操作、向右移動操作等。上面說到的幾點(diǎn)大多是從與用戶交互 的角度去觀察分析的,而從游戲的規(guī)則方面,也可以作一下分析,當(dāng)下墜物響應(yīng)用戶
38、的指 示向左或向右移動的時候,需要判斷該不墜物件是否已經(jīng)到這了游戲區(qū)域的邊界而無法 向左或著向右移動:當(dāng)下墜物的形態(tài)改變的時候,需要計算出應(yīng)該改變成何種形態(tài): 當(dāng)下 墜物向下移動的時候,需要判斷是否已經(jīng)到達(dá)了底部等。 先虛擬出該俄羅斯方塊游戲的類對象,并抽象出核心的數(shù)據(jù)屬性和操作方法等,然后 再作細(xì),最后將整個虛擬類的外殼脫掉,再移植到視圖類中去,其實(shí)現(xiàn)如下所示。 crectgameview: public cview /內(nèi)部存取數(shù)據(jù)結(jié)構(gòu) int m_statemapmax_rowmax_col; /用于保存當(dāng)前方塊的動態(tài)位置,4 個小方塊分別在大數(shù)組中的存取位置為先 左后 /右,每一列又遵循
39、先上后下的原則 int activestatus42; /存入下一個要出現(xiàn)的方塊形狀的數(shù)組 int nextstatus42; /初始化操作 gameinitnal(); /游戲的初始化 /用于判斷數(shù)據(jù)相關(guān)狀態(tài)的操作 isleftlimit(); /下墜物體是否可向左移動 isrightlitmit(); /下墜物體是否可向右移動 isbottom(); /是否已經(jīng)到達(dá)底部 isgameend(); /是否游戲已經(jīng)結(jié)束 /方塊物體下墜過程中的操作 rectchange(); /下墜物體變形 rectdown(); /下墜物體正常下落 rectarrow(); /下墜物體方向移動(左,右,下加速
40、) /狀態(tài)控制操作 gamestart(); /游戲開始 gamepause(); /游戲暫停 gameend(); /游戲結(jié)束 通過上面的代碼可以看出,在虛擬類中抽象出了核心的內(nèi)部數(shù)據(jù)和一些基本的操作函 數(shù)。對于操作函數(shù),可以把它們分成內(nèi)部實(shí)現(xiàn)的基本核心操(如判斷操作)以及明顯提供給 外部使用的整體模塊外部操作(如狀態(tài)控制操作)。而內(nèi)部的基本操作又可以分成判斷操 作和執(zhí)行操作這樣兩種類型。這里將上面涉及到的操作整理成表,如表 4-1 所示。 表 4-1 操作函數(shù)及功能描述 屬性和操作 功能描述 外部操作外部操作 狀態(tài)控制操作組 gamestart()游戲進(jìn)入開始狀態(tài),進(jìn)行相關(guān)數(shù)據(jù)的初始化以及
41、關(guān)聯(lián)操作 gamepause()游戲進(jìn)入暫停狀態(tài),進(jìn)行數(shù)據(jù)的保持與其他關(guān)聯(lián)的操作 gameend()游戲進(jìn)入結(jié)束狀態(tài),進(jìn)行數(shù)據(jù)的清除以及資源的銷毀和釋放操作 內(nèi)部基本核心操作內(nèi)部基本核心操作 判斷操作組 isleftlimit() 向左偏移前,判斷該下墜物件是否已經(jīng)到達(dá)了游戲區(qū)域的最左邊 界(不可以再左移 isrightlitmit() 向右偏移前,判斷該下墜物件是否已經(jīng)到達(dá)了游戲區(qū)域的最右邊 界(不可以再右移) isbottom() 向下偏移加速或者下墜物件自動向下偏移前,判斷是否已經(jīng)到達(dá) 了底部(這里對底部定義是游戲區(qū)域底部或下面有其他下墜物) isgameend()判斷下墜物是否到達(dá)了游
42、戲區(qū)域頂部而應(yīng)該結(jié)束游戲 執(zhí)行操作組 rectchange()下墜物件的狀態(tài)變形,方法為在原來的狀態(tài)下逆時針旋轉(zhuǎn) 90 度 rectdown()該下墜物件的 4 個小方塊所有坐標(biāo)位置向下偏移一個單位 rectarrow() 直接響應(yīng)用戶按鍵,向左或者向右或者向下偏移一個單位 其他操作其他操作 gamelnitnal()游戲的初始化操作 4.3 流程的設(shè)計流程的設(shè)計與實(shí)現(xiàn)與實(shí)現(xiàn) 流程的設(shè)計分正常流程設(shè)計和中斷流程設(shè)計。下面對這兩部分做具體的 設(shè)計和實(shí)現(xiàn)。 4.3.1 正常流程的設(shè)計正常流程的設(shè)計 對于正常流程的實(shí)現(xiàn)是由定時器驅(qū)動的,也就是說,當(dāng)預(yù)定的時間間隔到達(dá)后就執(zhí)行 這樣的一個工作流程,所以
43、必須先設(shè)置一個定時器機(jī)制,下面來對增加一個定時器進(jìn)行實(shí) 現(xiàn)。 從分析游戲的特性可以知道,定時器的產(chǎn)生與生效應(yīng)該在游戲開始的時候,而在游戲 暫 停或者游戲結(jié)束時則將已經(jīng)設(shè)定的定時器失效/銷亡(對于暫停的情況,使它銷亡,當(dāng)游 戲從 暫停狀態(tài)又進(jìn)入游戲狀態(tài)的時候,則重新創(chuàng)建一個定時器并激活它的運(yùn)作),所以分 別在游戲的開始函數(shù)、暫停函數(shù)以及結(jié)束函數(shù)中實(shí)現(xiàn)定時器的激活與去激活工作。這里, 先在資源編輯器菜單資源里面添加 3 個菜單選項(xiàng),分別是游戲的“開始”、“暫?!焙?“結(jié)束”(由于這 3 個功能是外部給用戶操作的功能,所以可以預(yù)先在菜單欄中添加相應(yīng) 的功能選項(xiàng),然后在視圖類中實(shí)現(xiàn)它們即可,當(dāng)它們找到
44、直接關(guān)聯(lián)的物件后對虛擬類的功 能操作預(yù)先脫殼), 然后利用 classwizard 直接在視圖類對象 cskyblue_rectview 中為 它們添加空白的處理函數(shù) , 具體如表 4-2 所示。 表 4-2 菜單選項(xiàng)功能對應(yīng)表 菜單選項(xiàng)名稱快捷鍵資源 id晌應(yīng)處理函數(shù) 開始游戲 settimer(1、1500-250*m_ilevel、nulll); /游戲暫停 void cskyblue_rectview:ongamepaush() m_bgamepaush=true; killtimer(1); /游戲結(jié)束 void cskyblue_rectview:ongameend() m_bga
45、meend=true; m_bgamepaush= false; /清除游戲暫停狀態(tài) killtimer(1); 從上面的 3 個函數(shù)代碼中可以看到,在添加這 3 個函數(shù)時,視圖類還添加了涉及到游 戲狀態(tài)的 3 個成員變量,它們分別是用作判定當(dāng)前游戲等級的 m_ilevel、記錄游戲狀態(tài)的 m_bgamepaush(是否暫停)和 m_bgameend(是否結(jié)束游戲),它們在視圖類中的定義如下所示。 /in file:skyblue_rectview.h class: csskyblue_rectview /當(dāng)前的級別,換算成速度的算法為:1500-m_ilevel*200 int m_ilev
46、el; /游戲是否已經(jīng)結(jié)束或者暫停 bool m_bgameend; bool m_bgamepaush; 其中 m_ilevel 變量是標(biāo)識當(dāng)前游戲的等級,隨著游戲等級的升高,定時器的固定時間 間隔會逐漸變短,從而達(dá)到加快下降速度的效果。 4.3.2 正常流程的實(shí)現(xiàn)正常流程的實(shí)現(xiàn)( (定時處理定時處理) ) 經(jīng)過定時器的設(shè)置后,就可以在定時器預(yù)定時間到達(dá)后對正常流程進(jìn)行實(shí)現(xiàn)了。這里 通 過利用 classwizard 跳到定時器到時后的處理函數(shù) ontimero 去實(shí)現(xiàn),其清單如下所示。 /int file:skyblue_rectview.cpp void cskyblue_rectvie
47、w:ontimer(uint nidevent) /如果原來的方塊已到底或游戲剛開始,則掉下一個新的方塊 int i,j,k; if (m_isbottom) /1.產(chǎn)生下一個隨機(jī)下墜物 m_icurrentstatus = m_inextstatus; m_inextstatus = random(7); /得到下一次的方塊樣式 / if (m_inextstatus=0) m_inextstatus+; /2.修改新的“下一下墜物” rectstatustonextstatus( m_inextstatus ); / crect rect(m_istarty+320, m_istartx,
48、 m_istarty+440, m_istartx+160); / invalidaterect( / invalidate(false); /3.將舊的“下一下墜物”用作當(dāng)前使用 m_currentrect = m_icurrentstatus; /根據(jù)當(dāng)前下墜物的形狀去初始化激活狀態(tài)下的下墜物坐標(biāo) rectstatustoactivestatus( m_icurrentstatus ); /將當(dāng)前動態(tài)數(shù)組中的數(shù)據(jù)反映到大數(shù)組中 activestatustogamestatus(); m_isbottom = false; /4.判斷當(dāng)前方塊是否已到底 isbottom(); /5.判斷游戲
49、是否已結(jié)束: 碰了底,且第 1 行有小方塊 if (m_isbottom) for (i=0;im_icol;i+) if (gamestatus0i) killtimer(1); afxmessagebox(游戲已結(jié)束!); for (j=0;jm_irow;j+) for (k=0;k selectobject(m_pblackbrush); crect rect; getclientrect( pdc - rectangle(rect); /選用灰色畫刷,繪制游戲區(qū)域的背景 pdc - selectobject(m_pgraybrush); pdc - rectangle(m_istar
50、ty ,m_istartx, m_istarty + 301, m_istartx + 360); pdc-selectobject(m_pblackpen); /畫網(wǎng)格線 if (m_bdrawgrid) /畫橫線 for (i=0;imoveto(m_istarty, m_istartx + i*m_ilarge); pdc-lineto(m_istarty+300, m_istartx +i*m_ilarge); /畫豎線 for (i=0;imoveto(m_istarty+i*m_ilarge, m_istartx); pdc-lineto(m_istarty+i*m_ilarge,
51、 m_istartx+360); int x,y,nw,nh; /小方塊的繪制 for (i=0;im_irow;i+) for (j=0;jbitblt(x,y,nw,nh, /顯示游戲區(qū)域及游戲級別的漢字描述 if (!m_bgameend) pdc - setbkcolor(black); pdc - settextcolor(white); pdc - textout(m_istarty+320, m_istartx+220, 游戲區(qū)域大?。?; pdc - textout(m_istarty+320, m_istartx+240,m_strarea); pdc - textout(m
52、_istarty+320, m_istartx+280, 游戲級別:); pdc - textout(m_istarty+320, m_istartx+300,m_strlevel); /顯示總分 if (!m_bgameend) cstring lsstr; lsstr.format(總分為:%d 分,m_iperformance); pdc - setbkcolor(black); pdc - settextcolor(white); pdc - textout(m_istarty+320, m_istartx+180,lsstr); /畫下一次將要出現(xiàn)的方塊,用于提示用戶 if (!m_
53、bgameend) pdc - setbkcolor(black); pdc - settextcolor(white); pdc - textout(m_istarty+320, m_istartx,下一個方塊:); int x,y,nw,nh; for (uint k=0;kbitblt(x,y,nw,nh, 從上述代碼可以看到,這里并不是先將各個部分的圖像所在的位置先計算出來, 然后 在相應(yīng)的位置繪制適當(dāng)?shù)膱D像,而是采用類似于平常的手工作畫方式,首先是將整個畫布 畫上背景色,接著繪制游戲區(qū)域的背景色(將原來整個畫布的背景覆蓋掉),然后在游戲區(qū) 域中將位置為被占用狀態(tài)的區(qū)域繪制成小方塊圖樣
54、,并將原先繪制好的游戲區(qū)域背景色覆 蓋掉。一般來說,使用這種方式去實(shí)現(xiàn)繪制, 效率比先逐個計算出每個位置區(qū)域應(yīng)當(dāng)顯示 的圖樣,然后再一次性地繪制的方式要高,因?yàn)檫@樣做不必花費(fèi)太多的時 間在計算方面。 在繪制之前,分別通過黑色畫刷 m_pblackbrush 以及灰色畫刷 m_pgraybrush, 對窗 口區(qū)域背景以及游戲區(qū)域背景進(jìn)行繪制,并且選擇黑色畫筆 m_pblackpen 對網(wǎng)格進(jìn)行繪 制。對于這些畫刷和畫筆的使用,也要預(yù)先準(zhǔn)備好,所以在繪圖資源初始化和釋放函數(shù)中, 也要添加它們的創(chuàng)建和釋放。 至此,就完成了俄羅斯游戲的全部基本功能,效果如圖 1.11 所示。 圖 1.11 游戲界面
55、5. .功能的完善功能的完善 完成游戲的功能后,為了使得游戲功能更加健全,還需要對它進(jìn)行一些完善,下面是附 加功能描述的列表,如表 5-1 所示。 表 5-1 附加功能描述列表 功能名稱選項(xiàng)其他描述 游戲等級選擇初級頂級對游戲快慢難度的設(shè)定 方塊圖案樣式選擇深藍(lán)條紋對下墜物的小方塊圖案 樣式選擇 游戲區(qū)域大小選擇小、中、大對游戲區(qū)域的行列數(shù)選 擇 網(wǎng)格的選用有、無是否需要在游戲區(qū)域繪 制網(wǎng)格 背景音樂的選用有、無在游戲過程中是否播放 背景音樂 有了上面的目標(biāo)功能定義后,這里先將這些目標(biāo)功能通過資源編輯器在主菜單條進(jìn)行 添加,將前面已有的菜單選項(xiàng)補(bǔ)全,再通過 class wizard 添加對應(yīng)的
56、響應(yīng)處理函數(shù),其詳 細(xì)信息如表 5-2 所示。 表 5-2 菜單選項(xiàng)功能對應(yīng)表 菜單選項(xiàng)名 稱 快捷鍵資源 id晌應(yīng)處理函數(shù) 基本選項(xiàng)組( hwnd = getsafehwnd(); /分配命令字符串緩沖,錯誤信息儲存緩沖,播放的文件名 char szcmdbuf300,errbuf60,szfilename255; /錯誤碼 mcierror mcierror; /初始化設(shè)備元素 strcpy(szfilename,skyblue_rect.mid); /初始化命令字符串 wsprintf( szcmdbuf,open %s type sequencer alias bkmusic,szfi
57、lename); /打開設(shè)備 mcierror = mcisendstring( szcmdbuf, errbuf, sizeof(errbuf), null); if (mcierror = 0) /如果打開成功則播放 mcierror = mcisendstring(play bkmusic notify,null,0, hwnd); /根據(jù)播放操作是否成功決定是否關(guān)閉設(shè)備 if (mcierror != 0) mcisendstring(close bkmusic,null,0,null); / /終止插放背景音樂 / void cskyblue_rectview:stopmid() /
58、關(guān)閉設(shè)備 mcisendstring(close bkmusic,null,0,null); 完成播放 playmid()以及停止播放 stopmid()的功能封裝后,現(xiàn)在只需在相應(yīng)的菜單 選項(xiàng)以及適當(dāng)?shù)拇a位置中加上它們就可以了。 5.2 工具欄快捷鍵的實(shí)現(xiàn)工具欄快捷鍵的實(shí)現(xiàn) 在完成上面補(bǔ)充功能的拓展和完善后,接下來為俄羅斯方塊游戲增加一個放置常用 功能選項(xiàng)的工具欄,以便用戶可以通過鼠標(biāo)點(diǎn)擊而直接對相應(yīng)的選項(xiàng)功能進(jìn)行實(shí)現(xiàn)。這 些常用功能選項(xiàng)分別是游戲的“開始”、“暫?!?、“結(jié)束”、“配置”。 (1)工具欄的定義 /in file:mainfrm.h class:cmainframe ctoo
59、lbar m_wndtoolbar (2)工具欄的創(chuàng)建 /jin file:mainfrm.cpp int cmainframe:oncreate(lpcreatestruct lpcreatestruct) if (cframewnd:oncreate(lpcreatestruct) = -1) return -1; /工具欄的實(shí)現(xiàn) cimagelist img; cstring str; if (!m_wndtoolbar.createex(this, tbstyle_flat, ws_child | ws_visible | cbrs_top | cbrs_gripper | cbrs_
60、tooltips | cbrs_flyby | cbrs_size_dynamic) return -1; /設(shè)置按鈕的寬度和長度 m_wndtoolbar.gettoolbarctrl().setbuttonwidth(40, 100); /改變屬性 m_wndtoolbar.modifystyle(0, tbstyle_flat |cbrs_tooltips | tbstyle_transparent|tbbs_checkbox ); /設(shè)置按鈕數(shù)為 6 m_wndtoolbar.setbuttons(null,4); / 2. 添加圖像 /設(shè)置熱/hot狀態(tài)的的位圖 img.create
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- (2024年秋季版)七年級道德與法治上冊 第三單元 在學(xué)習(xí)中成長 3.3 享受學(xué)習(xí) 第2框 享受學(xué)習(xí)的快樂教學(xué)實(shí)錄(掃描版) 粵教版
- Starter Unit 3 Welcome Section A 1a-2d教學(xué)設(shè)計 2024-2025學(xué)年人教版(2024)七年級英語上冊
- 2025年箱、包及類似容器合作協(xié)議書
- 2025屆河南省安陽市二模英語試題(原卷版+解析版)
- 人力資源管理中的領(lǐng)導(dǎo)力培養(yǎng)計劃
- 公司貸款服務(wù)合同標(biāo)準(zhǔn)文本
- 2025年年石化倉儲項(xiàng)目建議書
- 中介樓房出售合同標(biāo)準(zhǔn)文本
- 5 認(rèn)識棱鏡 教學(xué)設(shè)計-2024-2025學(xué)年科學(xué)五年級上冊教科版
- 2024年海南省中考數(shù)學(xué)試卷【含解析】
- 傳染病防治知識培訓(xùn)試題及答案(7套)
- 期末培優(yōu)拔高卷(試題)-2023-2024學(xué)年五年級下冊數(shù)學(xué)北師大版
- 那個星期天教學(xué)課件省公開課一等獎新名師比賽一等獎?wù)n件
- 2024年遼寧省撫順市順城區(qū)中考數(shù)學(xué)三模試卷
- 《第3單元 角的度量:角的度量》課件
- 微塑料污染完整版本
- 四年級勞動練習(xí)試題及答案
- 余華小說第七天閱讀分享
- 3.28百萬農(nóng)奴解放紀(jì)念日演講稿1500字2篇
- 圖論與網(wǎng)絡(luò)流
- 火針療法課件
評論
0/150
提交評論