菜單編程上機實驗_第1頁
菜單編程上機實驗_第2頁
菜單編程上機實驗_第3頁
菜單編程上機實驗_第4頁
菜單編程上機實驗_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、Visual C+游戲程序設(shè)計 菜單編程一、上機目的:(1)掌握關(guān)于CMenu類成員函數(shù)的編程方法。(2)掌握動態(tài)加載子菜單。(3)掌握添加菜單項及其命令響應(yīng)函數(shù)。(4)掌握用MSDN查找相關(guān)API函數(shù)。二、上機內(nèi)容:以下題目都在VC+6.0環(huán)境下編程完成。1、電話本示例程序功能:在應(yīng)用程序的窗口中,輸入一行文字,這行文字的格式是:人名 電話號碼。在這行文字輸入完成后按下回車鍵,就會在程序的菜單上的【幫助】菜單之后動態(tài)生成一個子菜單,并且剛才輸入的人名將作為其中的一個菜單項來顯示,然后可以繼續(xù)上述過程,接著在程序窗口中輸入下一行文字,但這時按下回車鍵后,并不需要再新添一個子菜單,而是直接在已添

2、加的子菜單下添加菜單項,這個新菜單項的文本就是新輸入的人名。當(dāng)單擊這個動態(tài)生成的子菜單中的某個菜單項時,程序就會把相應(yīng)的人名和電話號碼顯示在程序窗口上。操作步驟:(1)新建一個MFC的單文檔工程,工程名為:Menu2;(2)在CMainFrame類的OnCreate函數(shù)中添加代碼:(3)添加動態(tài)子菜單的實現(xiàn):為了在窗口中顯示鍵盤輸入的文字內(nèi)容,視類需要捕獲WM_CHAR消息,這可以利用類向?qū)瓿?,程序運行時,只是在第一次輸入一行文字后按下回車鍵時,需要在菜單欄上添加一個動態(tài)子菜單,以后只是向這個子菜單添加菜單項。為視圖類添加一個int類型的變量m_nIndex,在構(gòu)造函數(shù)中初始化為-1,用來指

3、示當(dāng)前是第幾次按下回車鍵。另外,還需要為視圖類增加一個CMenu類型的成員變量m_menu,用于創(chuàng)建新的子菜單使用。然后在WM_CHAR消息響應(yīng)函數(shù)中需要進(jìn)行判斷,只有是第一次按下回車鍵時,才為程序添加一個新的子菜單。代碼如下:(4)我們運行代碼,發(fā)現(xiàn)敲入的幾個字符,然后按回車鍵,這時將會發(fā)現(xiàn)Menu2程序的菜單欄上并沒有添加PhoneBook子菜單,但當(dāng)我們把鼠標(biāo)移動到應(yīng)該顯示這個子菜單的位置時,或者程序窗口尺寸發(fā)生變化之后,這個子菜單就出現(xiàn)了。為什么會這樣呢?為什么先前在CMainFrame類的OnCreate函數(shù)中進(jìn)行的菜單操作會立即顯示結(jié)果?這時因為CMainFrame類的OnCrea

4、te函數(shù)的作用是實現(xiàn)窗口的創(chuàng)建,也就是說,在調(diào)用這個函數(shù)時,程序的窗口還未創(chuàng)建和顯示,所以這個函數(shù)中對窗口上的菜單所做的修改會立即在程序界面上呈現(xiàn)出來。但是在窗口創(chuàng)建并顯示完成之后,再去修改程序菜單的內(nèi)容時,需要對菜單欄進(jìn)行一次重繪操作才能顯現(xiàn)修改的結(jié)果。CWnd類提供了一個DrawMenuBar成員函數(shù)用來完成菜單欄的重繪操作。修改后代碼如下:(5)運行程序,隨意輸入幾個字符,將會發(fā)現(xiàn)程序的狀態(tài)和剛才一樣,程序的菜單欄上還是沒有出現(xiàn)PhoneBook子菜單,當(dāng)我們把鼠標(biāo)移動到應(yīng)該顯示這個子菜單的位置時,或者程序窗口的尺寸發(fā)生變化之后,這個子菜單就出現(xiàn)了。這又是什么原因呢?我們發(fā)現(xiàn)在視圖類中調(diào)

5、用DrawMenuBar這個函數(shù),菜單屬于框架類窗口的,因此,應(yīng)該讓框架類窗口去重繪菜單欄。這樣的話,在CMenu2View類的OnChar函數(shù)中,就應(yīng)該先利用GetParent函數(shù)獲得視類的父窗口:框架類窗口,然后再利用該窗口對象去調(diào)用DrawMenuBar函數(shù),修改后代碼如下:(6)顯示輸入的字符我們在視圖類中增加一個CString類型的成員變量,用來保存輸入的字符。成員變量為m_strLine。接著在視圖類的構(gòu)造函數(shù)中將這個變量初始化為空。m_strLine=”;然后在OnChar函數(shù)中就可以把當(dāng)前的輸入的字符先添加到m_strLine變量中,再利用CDC類的TextOut函數(shù)在窗口(0

6、,0)位置處輸出。具體代碼如下:運行程序輸入abc 12345678按下回車鍵,將會發(fā)現(xiàn)程序的菜單欄上立即多了一個子菜單:PhoneBook。當(dāng)我們再次輸入字符時,發(fā)現(xiàn)字符是接著剛才那行文字輸出的。這時因為程序中將輸入的字符不斷地添加到用來保存輸入字符的字符串變量:m_strLine中,這樣它就會把以前的輸入內(nèi)容也顯示出來,正確的做法是按下回車鍵后,將m_strLine這個變量中的內(nèi)容清空。修改后的代碼如下。再次測試,將會發(fā)現(xiàn)出現(xiàn)一個問題:再次輸入的文字是在上次輸入的文字之上顯示的,我們將希望將上次顯示的內(nèi)容清除掉,再顯示當(dāng)前輸入的文字。有多種方法可以實現(xiàn)窗口上文字的擦除,這里,我們利用CWn

7、d類有一個名為Invalidate的成員函數(shù),該函數(shù)的作用是讓窗口的整個客戶區(qū)無效,這樣,當(dāng)下一條WM_PAINT消息發(fā)生時,窗口就會被更新。void Invalidate( BOOL bErase = TRUE );請參考MSDN理解該函數(shù)。在m_strLine.Empty()代碼之后加上下面這行代碼,即給Invalidate函數(shù)傳遞一個TRUE值,讓視圖類窗口重繪并擦除窗口的背景。這樣,在顯示新一行輸入字符串時,窗口上已顯示的上一次輸入的文字已消失了。Invalidate();再次測試Menu2程序,可以發(fā)現(xiàn)當(dāng)按下回車鍵后,先前輸入的文字從窗口上消失了。接下來再輸入字符時,窗口就會顯示新的

8、輸入字符。(7)添加菜單項及其命令響應(yīng)函數(shù)接下來需要實現(xiàn)現(xiàn)在輸入人名、空格、電話號碼,并當(dāng)按下回車鍵后,把輸入的人名作為菜單項的文本添加到PhoneBook子菜單下這一功能。代碼如下:大家可以運行測試(8)下面就要實現(xiàn)當(dāng)單擊這些菜單時,應(yīng)在程序窗口中顯示對應(yīng)的字符串,即:人名 電話號碼。那么在程序中就應(yīng)該將所有輸入的字符串都保存起來。我們可以定義字符串?dāng)?shù)組來保存用戶輸入的所有字符串,但是不知道用戶輸入多少。數(shù)組大小無法確定。MFC為我們提供了一些非常有用的集合類,這些集合類類似于數(shù)組的集合類,這個集合類支持CString對象的數(shù)組。為了增加一個字符串元素,可以利用該集合類的Add成員函數(shù):In

9、t Add(LPCTSTR newElement); /查找MSDN理解它當(dāng)需要返回一個集合元素時,可以利用集合類的GetAt成員函數(shù),這個函數(shù)如下所示:CString: GetAt( int nIndex ) const;下面我們?yōu)镃MenuView類定義一個公有的CStringArray類型的成員變量:m_strArray,用來保存所有輸入的字符串。至于為什么將m_strLine聲明為公有的。對應(yīng)的代碼如下:程序的要求是當(dāng)單擊動態(tài)添加的人名菜單項時,程序要在窗口中顯示對應(yīng)的字符串:人名 電話號碼。首先動態(tài)添加的菜單項進(jìn)行命令捕獲。首先,在Menu2工程中,在資源編輯器打開程序的菜單。然后在

10、【幫助】子菜單后面添加一個新的子菜單,名稱可以任意,例如abc,接著為它添加幾個菜單項。菜單項名稱菜單項ID1IDM_PHONE12IDM_PHONE23IDM_PHONE34IDM_PHONE4在Menu2程序的Resource.h文件,在其中可以看到如下幾行代碼:#define IDM_PHONE1 32771#define IDM_PHONE2 32772#define IDM_PHONE3 32773#define IDM_PHONE4 32774然后利用ClassWizard為CMenu類分別添加以上這四個菜單項的命令響應(yīng)函數(shù),其中在消息列表中都選擇COMMAND消息。接下來,我們在

11、菜單編輯器中刪除剛才新添加的子菜單abc。但是將會發(fā)現(xiàn)他們的命令響應(yīng)函數(shù)在源文件中保存了下來。在OnChar函數(shù)中找到動態(tài)添加菜單項的代碼,即調(diào)用AppendMenu函數(shù)的那行代碼,把其中菜單ID參數(shù)改成IDM_PHONE1 ,即m_menu.AppendMenu(MF_STRING,IDM_PHONE1+m_nIndex,m_strLine.Left(m_strLine.Find(' ');依次類推,可以看到CMenu2View類的頭文件中消息映射函數(shù)的聲明代碼:同時發(fā)現(xiàn)在源文件中發(fā)現(xiàn):經(jīng)過以上幾步,Menu2程序的CMenu2View類就有了四個動態(tài)菜單項的命令響應(yīng)函數(shù)。比

12、如第一個:void CMenu2View:OnPhone1() / TODO: Add your command handler code hereCClientDC dc(this);dc.TextOut(0,0,m_strArray.GetAt(0);依次類推其他三個函數(shù)。(9)框架類窗口截獲菜單命令消息下面讓程序動態(tài)添加的菜單項命令由框架類來捕獲。經(jīng)過“菜單命令的路由”過程,交由OnCommand函數(shù)來處理的,這個函數(shù)中將完成命令消息的路由。CWnd:OnCommand  virtual BOOL OnCommand( WPARAM wParam, LPARAM lParam

13、);Return ValueAn application returns nonzero if it processes this message; otherwise 0.ParameterswParamThe low-order word of wParam identifies the command ID of the menu item, control, or accelerator. The high-order word of wParam specifies the notification message if the message is from a control. If the message is from an accelerator, the high-order word is 1. If the message is from a menu, the high-order word is 0.lParamIdentifies the

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論