




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第5章 菜單、工具欄和狀態(tài)欄菜單是一系列命令的列表,用戶(hù)能夠選中其中的菜單項(xiàng)(命令)并執(zhí)行相應(yīng)任務(wù)。除一些簡(jiǎn)單的基于對(duì)話(huà)框的應(yīng)用程序外,所有的Windows程序都提供了各自的菜單。菜單是Windows應(yīng)用程序中不可缺少的界面元素,其風(fēng)格和外觀有時(shí)直接影響著用戶(hù)對(duì)軟件的評(píng)價(jià)。許多優(yōu)秀的軟件(如Microsoft Office)為增加對(duì)用戶(hù)的吸引力,不惜資源資源,將菜單做得多姿多彩,甚至達(dá)到三維效果。*用編輯器設(shè)計(jì)菜單1、在原有的菜單”文件(F)”里加一個(gè)菜單,其作用是你單擊它后,能在屏幕上顯示一行字。(1)建一個(gè)SDI單文檔應(yīng)用程序名為:顯示一行字(2)ResourceViewàMen
2、u(雙擊打開(kāi))àIDR_MAINFRAMEà右面出現(xiàn)菜單à文件(下拉)à(想在哪兒加,可點(diǎn)重下邊一個(gè),按Insert鍵)à雙擊空白菜單à出現(xiàn)對(duì)話(huà)框à在Caption處寫(xiě)菜單名“窗口顯示(&C)”(&為快捷鍵標(biāo)志)àID處寫(xiě)ID_FILE_XSà最下面的狀態(tài)欄里可寫(xiě)點(diǎn)什麼à關(guān)閉對(duì)話(huà)框 (3)在Doc.h的public下加: CString str; 在Doc.cpp的構(gòu)造函數(shù)里加: str=” ”;/置空 (4)將菜單ID_FILE_XS映射到View視圖類(lèi)中 Viewà
3、ClassWizardàMessageMapsà在Class name里置Viewà在Object IDS里找到ID_FILE_XS(你加的)à右邊Messages里點(diǎn)黑COMMANDàAdd Functionà出現(xiàn)對(duì)話(huà)框,里面OnFileXS點(diǎn)ok(對(duì)話(huà)框消失)àEdit Code進(jìn)入視圖文件:void View:OnFileXS() CMyDoc *pDoc=GetDocument(); ASSERT_VALID(pDoc); pDoc->str=“你成功的在File菜單里建立了一個(gè)顯示菜單”; Invalidat
4、e();(5)再在View.cpp里(往上找到) CMyView:OnDraw(CDC *Pdc) pDC->TextOut(100,100,pDoc->str); (6)運(yùn)行(1)點(diǎn)你建的菜單,在屏幕上顯示你的一行字(2)打開(kāi)菜單別動(dòng),直接按C鍵,也出現(xiàn)這行字(3)將鼠標(biāo)放在這個(gè)菜單上,下面狀態(tài)欄也出現(xiàn)你寫(xiě)的注釋。 (7)若建子菜單,需在caption處寫(xiě)上這個(gè)菜單名后,點(diǎn)Pop_up便屏蔽ID,你關(guān)閉此對(duì)話(huà)框,雙擊出現(xiàn)的子菜單欄,開(kāi)始建就行了。 (8)改變菜單位置 點(diǎn)重不放,往你想加的地方拖即可!2、在頂層菜單欄里加一個(gè)菜單項(xiàng),其作用是你單擊它后能進(jìn)入”山東旅游”。1、Reso
5、urceViewàMenuàIDR_MAINFRAMEà右面出現(xiàn)菜單編輯à在菜單的空位置上雙擊(或點(diǎn)重一個(gè)菜單,按Insert鍵就在這個(gè)菜單前加上一個(gè)菜單),出現(xiàn)對(duì)話(huà)框,你在Caption處寫(xiě):“山東旅游(&S)”à點(diǎn)Pop_up(屏蔽ID)à退出2、在下面出現(xiàn)的空白菜單上雙擊,寫(xiě):煙臺(tái)(&Y)àPop_upà關(guān)閉。3、旁邊出現(xiàn)子菜單,你雙擊它à寫(xiě)”蓬萊村 Ctrl +F5”àID_SD_YT_PLàprompt處寫(xiě):蓬萊仙境4、煙臺(tái)下面寫(xiě)“青島”à子菜單寫(xiě)“
6、嶗山 Ctrl +F6”àID_SD_QD_LSà注釋欄 (prompt) 寫(xiě):嶗山道士。 5、青島下面寫(xiě):泰安à子菜單處寫(xiě):泰山 Ctrl +F7àID_SD_TA_TSàprompt處寫(xiě):五岳之首 6、填加速鍵表:(資源欄)Acceleratorà(雙擊)IDR_MAINFRAMEà出現(xiàn)加速鍵表,你雙擊最下面的空白格à出現(xiàn)對(duì)話(huà)框àID處下拉找到ID_SD_YT_PL置好àkey處下拉,找到VK_F5置好(或置好ID后,單擊Next Key Typed,按下Ctrl+5鍵也可)7、按第6步,將
7、青島嶗山、泰安泰山分別置好VK_F6 ,VK_F7.8、向工具欄中加新按鈕:使鼠標(biāo)放在這個(gè)按鈕上,就出現(xiàn)個(gè)小方框和菜單注釋欄中的蓬萊仙境一樣字樣。(1)ResoureViewàToolbaràIDR_MAINFRAMEà點(diǎn)一下最后的空白按鈕,用紅刷將中間大塊涂紅色。(2)雙擊你涂好的紅色按鈕,出現(xiàn)對(duì)話(huà)框,你在ID欄下拉,找到ID_SD_YT_PL點(diǎn)黑置好(和煙臺(tái)蓬萊菜單共用一個(gè)ID)Prompt處寫(xiě):蓬萊仙境n蓬萊仙境。(如果你不想與蓬萊仙境一起顯示,就寫(xiě)自己的工具欄ID號(hào),自己在注釋欄寫(xiě)東西n-à將ID映射到View中,設(shè)變量,運(yùn)行后點(diǎn)工具欄就出現(xiàn)你寫(xiě)
8、的東西)。 9、使菜單變灰(不被激活,不起作用) ViewàClassWizardàClassname選Viewà在ObjectTDS里找到你想屏蔽的菜單,點(diǎn)黑ID_SD_TA_TS,右邊選UPDATE COMMAND UIàAddFoutionàEdit Codeà在此函數(shù)里寫(xiě):pCmdUI->Enable(false);(CCmdUI類(lèi)是用來(lái)設(shè)置菜單的等,5.0書(shū)128頁(yè),教材243頁(yè)) 10、核對(duì)菜單項(xiàng),使這個(gè)菜單字的前面加個(gè)“”號(hào),和前面一樣用ClassWizard,View里連接UPDATE COMMAND UI,是哪
9、個(gè)要被核對(duì),就將哪個(gè)ID映射到View里,這里是ID_SD_QD_LS,并加代碼: pCmdUI->Enable(true); pCmdUI->SetCheck(1);/如果括弧里寫(xiě)0是刪除核對(duì)符 11、建立顯示字符串的過(guò)程(1)在View.h里的public:寫(xiě) CString str; 在View.cpp的構(gòu)造函數(shù)里寫(xiě): str=“ ”; (2)分別將煙臺(tái)蓬萊ID_SD_YT_PL、青島嶗山ID_SD_QD_LS、泰安泰山ID_SD_TA_TS映射到視圖類(lèi)View里,即:ViewàClassWizardà在LassName處置Viewà在Objec
10、tIDs里分別找到以上的各個(gè)ID并點(diǎn)黑à點(diǎn)黑COMMANDàAdd Functionà各個(gè)加完后àEdit Codeà分別加代碼:(青島嶗山映射函數(shù):) str=“青島嶗山”;Invalidate();(煙臺(tái)蓬萊映射函數(shù):) str=“八仙過(guò)?!?Invalidate();(泰安泰山映射函數(shù):) str=“五岳之首”;Invalidate();(3)在OnDraw()函數(shù)里寫(xiě):pDC->TextOut(50,50,str);菜單General(屬性)對(duì)話(huà)框的各項(xiàng)含義:(223頁(yè)表5.1)ID 菜單的資源ID標(biāo)識(shí)符Caption(標(biāo)題) 用
11、于標(biāo)識(shí)菜單項(xiàng)顯示文本,助記符字母的前面有一個(gè)“ &”符號(hào),這個(gè)字母與Alt構(gòu)成組合鍵Separator(分隔符) 選中時(shí),菜單項(xiàng)是一個(gè)分隔符或是一條水平線Checked(選中的) 選中時(shí),菜單項(xiàng)文本前顯示一個(gè)選中標(biāo)記Pop_up(彈出) 選中時(shí),菜單項(xiàng)含有一個(gè)彈出式子菜單Grayed(變灰) 選中時(shí),菜單項(xiàng)顯示是灰色的,用戶(hù)不能選用Inactive(非激活) 選中時(shí),菜單項(xiàng)沒(méi)有被激活,用戶(hù)不能選用Help(幫助) 選中時(shí),菜單項(xiàng)在程序運(yùn)行時(shí)被放在頂層菜單的最右端Break(暫停) 當(dāng)為Column時(shí),對(duì)于頂層菜單上的菜單項(xiàng)來(lái)說(shuō),被防置在另外一行上,而對(duì)于彈出式子菜單的菜單項(xiàng)來(lái)說(shuō),則被放
12、置在另外一列上;當(dāng)為Bar時(shí),與Column相同,只不過(guò)對(duì)于彈出式子菜單來(lái)說(shuō),它還在新列與原來(lái)的列之間增加一條豎直線,注意這些效果只能在程序運(yùn)行后才能看到Prompt(提示) 用于指明光標(biāo)移至該菜單項(xiàng)時(shí)在狀態(tài)欄上顯示的提示信息下面回到書(shū)221頁(yè)5.1菜單 習(xí)慣上菜單的顯示都遵循下列一些規(guī)則:(1)若單擊某菜單項(xiàng)后,將彈出一個(gè)對(duì)話(huà)框,那么在該菜單項(xiàng)文本后有“”(2)若某項(xiàng)菜單有子菜單,那么在該菜單項(xiàng)文本后有“”(3)若菜單項(xiàng)需要助記符,則用括號(hào)將帶下劃線的字母括起來(lái),助記符與Alt構(gòu)成一個(gè)組合鍵,當(dāng)按住“Alt”鍵不放,再敲擊該字母時(shí),對(duì)應(yīng)的菜單項(xiàng)就會(huì)被選中(4)若某項(xiàng)菜單需要快捷鍵的支持,則一
13、般將其列在相應(yīng)菜單項(xiàng)文本之后。所謂“快捷鍵”是一個(gè)組合鍵,如Ctrl+N,使用時(shí)是先按下”Ctrl”鍵不放,然后再按”N”鍵。任何時(shí)候按下快捷鍵,相應(yīng)的菜單命令都會(huì)被執(zhí)行。如書(shū)221頁(yè)圖5.1所示用編輯器設(shè)計(jì)菜單(1) 建一個(gè)單文檔應(yīng)用程序(2) ResourceViewà雙擊Menu項(xiàng)中的IDR_MAINFRAMEà頂層菜單的右邊最后一個(gè)空位置雙擊à出現(xiàn)屬性對(duì)話(huà)框àPop-up處于選中狀態(tài)à Caption處寫(xiě):測(cè)試(&T)(3)單擊“測(cè)試”菜單項(xiàng)下方的空位置,在Caption對(duì)話(huà)框中,輸入標(biāo)題 “切換菜單(&D)”,在ID框
14、輸入該菜單項(xiàng)的資源標(biāo)識(shí)符:ID_TEST_CHANGE 在最下面的注釋欄中寫(xiě)“單擊此菜單項(xiàng)將主菜單變成另一菜單”。(3) view(查看)àClassWizard(類(lèi)向?qū)?àMessage MapsàClass nameà選CMainFrameàIDsà選ID_TEST_CHANGEàMessagesà選中COMMANDà單擊“Add Function”或雙擊“COMMAND”消息àOKàEdit Code(4) 加代碼:AfxMessageBox(“現(xiàn)在就切換嗎?”);(5) 編譯運(yùn)
15、行!出現(xiàn)對(duì)話(huà)框,上面寫(xiě)“現(xiàn)在就切換嗎?”(6) 按Alt+T 再接著按Alt+D便不用鼠標(biāo)點(diǎn)就能出來(lái)“現(xiàn)在就切換嗎?”對(duì)話(huà)框。以上為作業(yè),上機(jī)完成。使用鍵盤(pán)快捷鍵(加速鍵)(接上個(gè)程序)A、打開(kāi)此例的項(xiàng)目工作區(qū)窗口中的Accelerator的資源項(xiàng),雙擊其下的:IDR_MAINFRAME,出現(xiàn)加速鍵表。B、你雙擊最下面的空行,彈出書(shū)225頁(yè)圖5.8,其中可設(shè)置屬性如:書(shū)225頁(yè)ID處下拉找到ID_TEST_CHANGE,Key處下拉找到VK_F5置好(單擊Next Key Typed,按下Ctrl+F5鍵也可),(在對(duì)話(huà)框?qū)傩悦趾竺婕?Ctrl+F5即寫(xiě)成:切換菜單Ctrl+F5)。C、運(yùn)行
16、程序 按Ctrl +F5將彈出對(duì)話(huà)框。菜單的編程控制 在交互式軟件的設(shè)計(jì)中,菜單有時(shí)會(huì)隨著用戶(hù)操作的改變而改變,這時(shí)的菜單就需要在程序中進(jìn)行控制。菜單的基本操作MFC提供的菜單類(lèi)CMenu可在程序運(yùn)行時(shí),處理有關(guān)菜單的操作:如: 創(chuàng)建菜單、裝入菜單、刪除菜單、獲取菜單或設(shè)置菜單的狀態(tài)等。1、 創(chuàng)建菜單:CMenu類(lèi)的CreateMenu()和CreatePopupMenu()函數(shù)分別用于創(chuàng)建一個(gè)菜單或子菜單框架,它們的原型是:BOOL CreateMenu(); 產(chǎn)生一個(gè)空菜單BOOL CreatePopupMenu();產(chǎn)生一個(gè)空的彈出式子菜單2、 裝入菜單將菜單從資源裝入應(yīng)用程序中,需要調(diào)
17、用CMenu成員函數(shù)LoadMenu或者用SetMenu對(duì)應(yīng)用程序菜單進(jìn)行重新設(shè)置。BOOL LoadMenu(LPCTSTR lpszResourceName); BOOL LoadMenu(UINT nIDResource); 其中參數(shù):lpszResourceName:菜單資源名稱(chēng)nIDResource:菜單資源ID標(biāo)識(shí)號(hào)3、 添加菜單項(xiàng)BOOL AppendMenu(UINT nFlags,UINT nIDNewItem=0,LPCTSTR lpszNewItem=NULL); BOOL AppendMenu(UINT nFlags,UINT nIDNewItem,const CBit
18、map *pBmp); BOOL InSertMenu(UINT nPosition,UINT nFlags,UINT nIDNewItem=0, LPCTSTR lpszNewItem=NULL); BOOL InSertMenu(UINT nPosition,UINT nFlags,UINT nIDNewItem, const CBitmap *pBmp);其中:nIDNewItem 表示新菜單項(xiàng)的資源ID號(hào) lpszNewItem表示新菜單項(xiàng)的內(nèi)容 pBmp 用于菜單項(xiàng)的位圖指針 nPosition 表示新菜單項(xiàng)要插入的菜單項(xiàng)位置 nFlags表示要增加的新菜單項(xiàng)的狀態(tài)信息(見(jiàn)246頁(yè)表
19、)4、 刪除菜單項(xiàng)BOOL DeleteMenu(UINT nPosition,UINT nFlags);其中:nPosition表示要?jiǎng)h除的菜單項(xiàng)位置 當(dāng):Flags為MF_BYCOMMAND時(shí),nPosition表示菜單項(xiàng)ID號(hào) 當(dāng):Flags為MF_BYPOSITION時(shí),nPosition表示菜單項(xiàng)的位置(第一個(gè)菜單項(xiàng)為0)5、 獲取菜單項(xiàng)UINT GetMenuItemCount()const;獲得菜單項(xiàng)的項(xiàng)數(shù),調(diào)用失敗返回-1.UINT GetMenuItemID(int nPos)const;獲得由nPos指定菜單項(xiàng)位置(以0為基數(shù))的菜單項(xiàng)的標(biāo)識(shí)號(hào),若nPos是SEPARATO
20、R(分隔符)則返回-1。 CMenu *GetSubMenu(int nPos)const; 獲得指定菜單的彈出式菜單的菜單句柄,該彈出式菜單由參數(shù)nPos指定,開(kāi)始位置為0,若選單不存在,則創(chuàng)建一個(gè)臨時(shí)的菜單指針。例:用程序添加并處理一個(gè)菜單項(xiàng)(1)新建一個(gè)單文檔(SDI)應(yīng)用程序(2)ViewàResourceSymbols彈出書(shū)228頁(yè)圖5.10的對(duì)話(huà)框(3)單擊“New”按鈕彈出如圖228頁(yè)5.11所示的“New Symbol”(新標(biāo)識(shí)符)對(duì)話(huà)框。在名字(Name)框中輸入一個(gè)新的標(biāo)識(shí)符ID_NEW_MENUITEM.在值(Value)框中,輸入該ID的值,系統(tǒng)要求用戶(hù)定義的
21、ID值應(yīng)大于15(0X000F)而小于61440(0XF000)。保留默認(rèn)的ID值101,單擊“確定”按鈕。(4)關(guān)閉“資源符號(hào)”對(duì)話(huà)框,在CMainFrame:OnCreate函數(shù)中添加下列代碼,該函數(shù)在框架窗口創(chuàng)建時(shí)自動(dòng)調(diào)用。int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) CMenu *pSysMenu=GetMenu();/獲得主菜單句柄 CMenu *pSubMenu=pSysMenu->GetSubMenu(1);/獲得第二個(gè)子菜單指針 CString StrMenuItem(“新的選單項(xiàng)”); pSubMenu-&
22、gt;AppendMenu(MF_SEPARATOR);/增加一水平分割線 pSubMenu->AppendMenu(MF_STRING,ID_NEW_MENUITEM,StrMenuItem); /在子選單中增加一選單項(xiàng),允許使用ON_UPDATE_COMMAND_UI或 /ON_COMMAND的選單項(xiàng) m_bAutoMenuEnable=FALSE;/關(guān)閉系統(tǒng)自動(dòng)更新菜單狀態(tài) pSysMenu->EnableMenuItem(ID_NEW_MENUITEM,MF_BYCOMMAND| MF_ENABLED);/激活菜單項(xiàng) DrawMenuBar();/更新菜單 return 0
23、;(5)(6)使用ClassWizard在CMainFrame主框架類(lèi)中添加OnCommand消息函數(shù)的重載,并檢測(cè)用戶(hù)選單的nID參數(shù) View->ClassWizard->在Class name處下拉置CMainFrame ->Messages處找到OnCommand消息映射到CMainFrame里并添代碼: BOOL CMainFrame:OnCommand(WPARAM wParam,LPARAM lParam) /wParam的低字節(jié)表示選單、控件、加速鍵的命令I(lǐng)Dif(LOWORD(wParam)=ID_NEW_MENUITEM) MessageBox(“你選中了
24、新的選單項(xiàng)”);(7)編譯運(yùn)行并測(cè)試。編輯->新的選單項(xiàng);彈出對(duì)話(huà)框,顯示“你選中了新的選單項(xiàng)” 使用快捷菜單快捷菜單是一種浮動(dòng)的彈出式菜單,它是一種新的用戶(hù)界面設(shè)計(jì)風(fēng)格,當(dāng)用戶(hù)按下鼠標(biāo)右鍵時(shí),就會(huì)相應(yīng)地彈出一個(gè)浮動(dòng)菜單,其中提供了幾個(gè)與當(dāng)前選擇內(nèi)容相關(guān)的選項(xiàng)。用資源編輯器和MFC庫(kù)的CMenu:TrackPopupMenu()函數(shù)可以 很容易地創(chuàng)建這樣的菜單,其原形如下: BOOL TrackPopupMenu(UINT nFlags,int x,int y,CWnd *pWnd, LPCRECT lpRect=NULL);該函數(shù)用于顯示一個(gè)浮動(dòng)的彈出式菜單,其位置由各參數(shù)決定。其中:
25、nFlags表示菜單在屏幕顯示的位置以及鼠標(biāo)按鈕標(biāo)志,見(jiàn)230頁(yè)表5.4。x,y表示菜單的水平坐標(biāo)和菜單的頂端的垂直坐標(biāo)。pWnd表示彈出菜單的窗口,此窗口將收到菜單的全部WM_COMMAND消息。lpRect是一個(gè)RECT結(jié)構(gòu)或CRect對(duì)象指針,它表示一個(gè)矩形區(qū)域,用戶(hù)單擊這個(gè)區(qū)域時(shí),彈出菜單不消失。當(dāng)lpRect為NULL時(shí),若用戶(hù)在菜單外面單擊,菜單立刻消失。例1:使用快捷菜單(顯示運(yùn)行后的窗口菜單里的”文件(F)”下面的菜單項(xiàng))按 書(shū)230頁(yè)做 第2步:void CMyView:OnContextMenu(CWnd* pWnd, CPoint point) / TODO: Add y
26、our message handler code hereCMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;/獲得/主窗口指針CMenu *pSysMenu=pFrame->GetMenu();/獲得程序窗口菜單指針int nCount=pSysMenu->GetMenuItemCount();/獲得頂層菜單個(gè)數(shù)int nSubMenuPos=-1;for(int i=0;i<nCount;i+)/查找“文件”菜單CString str;pSysMenu->GetMenuString(i,str,MF_
27、BYPOSITION);if(str.Left(4)="文件") nSubMenuPos=i; break;if(nSubMenuPos<0) return;/沒(méi)有找到返回pSysMenu->GetSubMenu(nSubMenuPos)->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);第3步:#include “MainFrm.h”第4步:編譯運(yùn)行,在應(yīng)用程序窗口的客戶(hù)區(qū)中,用鼠標(biāo)單擊右鍵,會(huì)彈出快捷菜單(將原File下拉的菜單彈出來(lái))(如書(shū)231頁(yè)圖5.13)。說(shuō)明
28、:由于菜單、工具欄、狀態(tài)欄是由主框架類(lèi)CMainFrame來(lái)控制的,雖在視圖類(lèi)可以添加快捷菜單消息映射,但若要在視圖類(lèi)中訪問(wèn)應(yīng)用程序的主框架窗口的系統(tǒng)菜單,則必須通過(guò)AfxGetApp來(lái)獲取主框架類(lèi)對(duì)象指針后才能獲取相應(yīng)的菜單。AfxGetApp是CWinApp類(lèi)的一個(gè)成員函數(shù),該函數(shù)可在應(yīng)用程序項(xiàng)目中的任何類(lèi)中使用,用于獲取應(yīng)用程序中的CWinApp類(lèi)對(duì)象指針。例:使用快捷菜單(自己建立的菜單以快捷方式彈出來(lái))1、創(chuàng)建一個(gè)單文檔應(yīng)用程序2、InsertàResourceà點(diǎn)黑MenuàNewà便在Menu資源下出現(xiàn)一個(gè)新菜單資源(默認(rèn)的ID號(hào)為IDR_
29、MENU1),將此ID號(hào)改為:IDR_MYFLOATMENU。3、雙擊這個(gè)菜單資源,文檔區(qū)出現(xiàn)一個(gè)空白菜單項(xiàng),你為它起個(gè)名叫“彈出式菜單”,關(guān)閉à點(diǎn)開(kāi)下面的子菜單,依次添加如下子菜單項(xiàng):菜單 ID 標(biāo) 題 屬 性ID_MENU_SCOREIN 成績(jī)輸入(&S) 默認(rèn)ID_MENU_SCOREPRINT 成績(jī)打印(&P) 默認(rèn)ID_SEPARATRO Separator- 其他(&Q) Pop_up其余默認(rèn)4、 (如果要有提問(wèn)對(duì)話(huà)框,你回答選擇已存在的類(lèi),否則按以下步驟做)ViewàClassWizardàClassNameàCMa
30、inFrameà將上面的ID分別選中,并分別加COMMAND消息。這里我們僅選ID_MENU_SCOREIN映射COMMAND消息,并加如下代碼:void CMainFrame:OnMenuScorein() AfxMessageBox(“現(xiàn)在就輸入成績(jī)嗎?”); 5、在CMainFrame類(lèi)(或其它類(lèi))加入WM_CONTEXTMENU消息處理函數(shù),添加代碼:void CMainFrame:OnContextMenu(CWnd *pWnd,CPoint point) CMenu menu; menu.LoadMenu(IDR_MYFLOATMENU);/剛才加上的菜單資源 menu.
31、GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN| TPM_RIGHTBUTTON,point.x,point.y,this); 6、運(yùn)行并測(cè)試,你在出現(xiàn)的應(yīng)用程序窗口中,單擊右鍵會(huì)出現(xiàn)你創(chuàng)建的菜單(快捷菜單)你再按成績(jī)輸入會(huì)出現(xiàn)已寫(xiě)好的“現(xiàn)在就輸入成績(jī)嗎?”; 注意:若按“成績(jī)打印菜單”有信息在窗口顯示則: 在View.h里寫(xiě):CString str; 將ID_MENU_SCOREPRINT映射到View中,在此函數(shù)中加: str=“你按了成績(jī)打印菜單”; Invalidate(); 在OnDraw()里:pDC->TextOut(100,1
32、00,str);5.2工具欄工具欄是一系列工具按鈕的組合,借助它們可以提高用戶(hù)的工作效率。Visual C+6.0系統(tǒng)保存了每個(gè)工具欄相應(yīng)的位圖,其中包括所有按鈕的圖象,而所有的按鈕圖象具有相同的尺寸(15像素高,16像素寬),它們?cè)谖粓D中的排列次序與屏幕上的按鈕在工具欄上的次序相同。使用工具欄編輯器(1)創(chuàng)建一個(gè)SDI單文檔應(yīng)用程序。(2)ResourceViewàToobaràIDR_MAINFRAMEà點(diǎn)最后一個(gè)空的工具欄à涂紅色后à再雙擊出現(xiàn)屬性對(duì)話(huà)框,ID處寫(xiě):ID_TOOLBARà在prompt框內(nèi)鍵入“向系統(tǒng)輸入學(xué)生成績(jī)
33、n成績(jī)輸入”(3)將ID_TOOLBAR映射到View視圖類(lèi)中,寫(xiě):void CMainFrame:OnToolbar() / TODO: Add your command handler code hereMessageBox(“工具欄顯示”);(4)編譯運(yùn)行(在狀態(tài)攔上出現(xiàn)上面的字,鼠標(biāo)放在工具攔上就出現(xiàn)一個(gè)成績(jī)輸入框)(5)建一個(gè)菜單項(xiàng)ResourceViewàMenuà雙擊IDR_MAINFRAMEà出現(xiàn)空白菜單à標(biāo)題處寫(xiě):和工具欄連用àID處寫(xiě)和工具欄的ID一樣的ID即:ID_TOOLBAR這樣運(yùn)行à點(diǎn)這個(gè)菜單和點(diǎn)這個(gè)工具欄
34、的顯示結(jié)果是一樣的(工具欄和菜單相結(jié)合)。*(1)在工具欄中移動(dòng)一個(gè)按鈕(2)消失一個(gè)按鈕(刪除)(3)復(fù)制一個(gè)按鈕 (4)按鈕前插入一個(gè)空格(5)按鈕后插入空格(6)按鈕前后空格消失 見(jiàn)232頁(yè)“工具欄按鈕屬性”對(duì)話(huà)框的各項(xiàng)含義:ID 工具欄按鈕的標(biāo)識(shí)符,可以輸入自己的標(biāo)識(shí)符名稱(chēng),也可從ID的下拉列表中選取標(biāo)識(shí)符名稱(chēng)Width(寬) 工具欄按鈕的像素寬度Height(高) 工具欄按鈕的像素高度Prompt(提示) 工具欄按鈕提示文本:若為“建立新文檔n新建”,則表示將鼠標(biāo)指向該按鈕時(shí),在狀態(tài)欄中顯示“建立新文檔”,而在彈出的提示信息中出現(xiàn)“新建”字樣?!眓”是它們的分割轉(zhuǎn)義符。多個(gè)工具欄的使
35、用 實(shí)際應(yīng)用中,常常需要多個(gè)工具欄,下面來(lái)討論多個(gè)工具欄的創(chuàng)建、顯示和隱藏,以及多個(gè)工具欄和菜單之間的聯(lián)動(dòng)操作等。例:使用多個(gè)工具欄(1)添加并更改應(yīng)用程序菜單1)創(chuàng)建一個(gè)單文檔應(yīng)用程序2)按快捷鍵Ctrl+R(或InsertàResourceà在資源類(lèi)型中選中Menu(233頁(yè)5.16所示)3)單擊“New”按鈕,便在右邊出現(xiàn)一個(gè)空菜單,系統(tǒng)給的默認(rèn)ID為IDR_MENU1 如書(shū)234頁(yè)圖5.174)不做(書(shū)只是說(shuō)明)5)、6)、按書(shū)233頁(yè)做7)CMenu m_NewMenu;8)void CMainFrame:OnViewTest() / TODO: Add your
36、 command handler code herem_NewMenu.Detach();/使菜單對(duì)象和菜單句柄分離.m_NewMenu.LoadMenu(IDR_MENU1);SetMenu(NULL);/清除應(yīng)用程序菜單SetMenu(&m_NewMenu);/設(shè)置應(yīng)用程序菜單void CMainFrame:OnTestReturn() / TODO: Add your command handler code herem_NewMenu.Detach();/使菜單對(duì)象和菜單句柄分離 m_NewMenu.LoadMenu(IDR_MAINFRAME);SetMenu(NULL);S
37、etMenu(&m_NewMenu);9)編譯運(yùn)行:查看à顯示測(cè)試菜單à在上面出現(xiàn)“測(cè)試”à測(cè)試à返回à又回到原菜單。(2)添加并設(shè)計(jì)工具欄按鈕按書(shū)235頁(yè)做 1)、2)、3)、4)、5)(3)添加工具欄1)、2)、3)、4)5)int nRes = m_wndTestBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC,CRect(0,0,0,0),AFX_I
38、DW_TOOLBAR+10); if(!nRes|!m_wndTestBar.LoadToolBar(IDR_TOOLBAR1)TRACE0("Failed to create toolbarn");return -1;m_wndTestBar.EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndTestBar);程序中的代碼:Create(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS
39、_SIZE_DYNAMIC,CRect(0,0,0,0),AFX_IDW_TOOLBAR+10);第一個(gè)參數(shù)用于指定工具欄所在的父窗口指針(this表示當(dāng)前的CMainFrame類(lèi)窗口指針)第二個(gè)參數(shù)用于指定工具按鈕的風(fēng)格(TBSTYLE_FLAT表示工具按鈕是“平面”的)第三個(gè)參數(shù)用于指針工具欄的風(fēng)格,由于這里的工具欄是CMainFrame的子窗口,因此需要指定WS_CHILD|WS_VISIBLE。CBRS_TOP表示工具欄放置在父窗口的頂部,CBRS_GRIPPER表示工具欄前面有一個(gè)“把手”CBRS_TOOLTIPS表示允許有工具提示CBRS_FLYBY表示在狀態(tài)欄顯示工具提示文本CB
40、RS_SIZE_DYNAMIC表示工具欄在浮動(dòng)時(shí),其大小是可以動(dòng)態(tài)改變的第四個(gè)參數(shù)用于指定工具欄四周的邊框大小,一般都為0(如:CRect(0,0,0,0))最后一個(gè)參數(shù)用于指定工具欄這個(gè)子窗口的標(biāo)識(shí)ID(與工具欄資源標(biāo)識(shí)不同)if語(yǔ)句中的LoadToolBar函數(shù)用于裝載工具欄資源。若CreateEx或 LoadToolBar的返回值為0,既調(diào)用不成功,則顯示診斷信息“Failed to create toolbar”。TRACEO是一個(gè)用于程序調(diào)試的跟蹤宏OnCreate函數(shù)返回-1時(shí),主框架窗口被清除。應(yīng)用程序中的工具欄一般具有??炕蚋?dòng)性:m_wndTestBar.EnableDock
41、ing使得m_wndTestBar對(duì)象可以???,CBRS_ALIGN_ANY表示可以停靠在窗口的任一邊。EnableDocking(CBRS_ALIGN_ANY)調(diào)用的是CFrameWnd類(lèi)的成員函數(shù),用于讓工具欄或其它控制條在主框架窗口可以進(jìn)行停靠操作。DockControlBar也是CFrameWnd類(lèi)的成員函數(shù),用于將指定的工具欄或其他控制條進(jìn)行???。說(shuō)明:AFX_IDW_TOOLBAR是系統(tǒng)內(nèi)部的工具欄子窗口標(biāo)識(shí),并將AFX_IDW_TOOLBAR+1的值表示默認(rèn)的狀態(tài)欄子窗口標(biāo)識(shí)。如果在創(chuàng)建新的工具欄時(shí)沒(méi)有指定相應(yīng)的子窗口標(biāo)識(shí),則會(huì)使用默認(rèn)的AFX_IDM_TOOLBAR。這樣,當(dāng)打
42、開(kāi)“查看”菜單,單擊“工具欄”菜單時(shí),顯示或隱藏的工具欄不是原來(lái)的工具欄,而是新添加的工具欄。為此,需要重新指定工具欄子窗口的標(biāo)識(shí),并使其值等于AFX_IDW_TOOLBAR+10(4)完善程序代碼1) 見(jiàn)書(shū)2)int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)ShowControlBar(&m_wndTestBar,FALSE,FALSE);/關(guān)閉測(cè)試工具欄Return 0;說(shuō)明:ShowControlBar函數(shù)有3個(gè)參數(shù),第1個(gè)參數(shù)用于指定要操作的工具欄或狀態(tài)欄指針,第2個(gè)參數(shù)是一個(gè)布爾型,當(dāng)為T(mén)RUE時(shí)表示顯示,否則表示隱
43、藏,第3個(gè)參數(shù)用于表示是否延遲顯示或隱藏,當(dāng)為FALSE時(shí)表示立即顯示或隱藏。3)void CMainFrame:OnViewTest() ShowControlBar(&m_wndTestBar,FALSE,FALSE);/關(guān)閉測(cè)試工具欄ShowControlBar(&m_wndToolBar,TRUE,FALSE);/顯示主工具欄void CMainFrame:OnTestReturn() ShowControlBar(&m_wndTestBar,FALSE,FALSE);/關(guān)閉測(cè)試工具欄 ShowControlBar(&m_wndToolBar,TRUE,
44、FALSE);/顯示主工具欄4)編譯運(yùn)行:結(jié)果見(jiàn)238頁(yè)圖5.25所示5.3狀態(tài)欄 狀態(tài)欄是一條水平長(zhǎng)條,位于應(yīng)用程序的主窗口的底部,它可以分割成幾個(gè)窗格,用來(lái)顯示多組信息。應(yīng)用程序往往需要把當(dāng)前的狀態(tài)信息或提示信息告訴用戶(hù),雖然其他窗口(如窗口的標(biāo)題欄上、提示窗口等)也可顯示文本,但它們的功能比較有限,而狀態(tài)欄能很好地滿(mǎn)足應(yīng)用程序顯示信息的需求。 狀態(tài)欄的定義在MFC AppWizard創(chuàng)建的SDI或MDI應(yīng)用程序框架的MainFrm.cpp文件中有一個(gè)靜態(tài)數(shù)組indicators數(shù)組,它被MFC用做狀態(tài)欄的定義(見(jiàn)239頁(yè)圖5.26為indicator數(shù)組元素與標(biāo)準(zhǔn)狀態(tài)欄窗口的關(guān)系)。這個(gè)
45、數(shù)組中的元素是一些標(biāo)識(shí)常量或是字串資源的ID標(biāo)識(shí)符。默認(rèn)的indicators數(shù)組包含了4個(gè)元素,它們是:ID_SEPARATOR 是用于標(biāo)識(shí)信息行窗格的,菜單項(xiàng)或工具欄按鈕的許多信息都在這個(gè)信息行窗格中顯示。ID_INDICATOR_CAPS 是用于標(biāo)識(shí)指示器窗格顯示出CapsLock鍵的狀態(tài)(大寫(xiě))ID_INDICATOR_NUM 是用于標(biāo)識(shí)指示器窗格顯示出NumLock鍵狀態(tài)(數(shù)字)ID_INDICATOR_SCRL 是用于標(biāo)識(shí)指示器窗格顯示出ScrollLock鍵的狀態(tài)(小寫(xiě))狀態(tài)欄的常用操作Visual C+6.0中可以方便地對(duì)狀態(tài)欄進(jìn)行操作,如增加窗格、減少窗格、在狀態(tài)欄中顯示文本
46、、改變狀態(tài)欄的風(fēng)格 大小等,并且MFC的CStatusBar類(lèi)封裝了狀態(tài)欄的大部分操作。1、增加和減少窗格狀態(tài)欄中的窗格可以分為信息行窗格和指示器窗格2類(lèi)。(1)若在狀態(tài)欄中增加一個(gè)信息行窗格,則只需要在indicators數(shù)組的適當(dāng)位置增加一個(gè)ID_SEPARATOR標(biāo)識(shí)即可;(2)若在狀態(tài)欄中增加一個(gè)用戶(hù)指示器窗格,則在indicators數(shù)組中的適當(dāng)位置增加一個(gè)在字符串表中定義過(guò)的資源ID,其字符串的長(zhǎng)度表示用戶(hù)指示器窗格的大小。(3)若狀態(tài)欄減少一個(gè)窗格,其操作與增加相類(lèi)似,只需減少indicators數(shù)組元素即可。2、在狀態(tài)欄上顯示文本(1)調(diào)用CWnd:SetWindowText更
47、新信息行窗格(或窗格0)中的文本。由于狀態(tài)欄也是一種窗口,故在使用時(shí)可直接調(diào)用。若狀態(tài)欄變量為m_wndStatusBar顯示為m_wndStatusBar。SetWindowText(“消息”)語(yǔ)句將在信息行窗格(或窗格0)內(nèi)顯示”消息”字樣。(2)手動(dòng)處理狀態(tài)欄的ON_UPDATE_COMMAND_UI更新消息,并在處理函數(shù)中調(diào)用CCmdUI:SetText函數(shù)。(3)調(diào)用CStatusBar:SetPaneText函數(shù)更新任何窗格(包括信息行窗格)中的文本,此函數(shù)原型描述如下: BOOL SetPaneText(int nIndex,LPCTSTR lpszNewText,BOOL bU
48、pdate=TRUE);其中:nIndex是表示設(shè)置的窗格索引(第1個(gè)窗格的索引為0) lpszNewText表示要顯示的字符串,若bUpdate為T(mén)RUE,則系統(tǒng)自動(dòng)更新顯示的結(jié)果注意:在使用第2種方法時(shí),應(yīng)按一定的步驟進(jìn)行,例如: 例 1:在狀態(tài)欄的最右邊兩個(gè)窗格中顯示出當(dāng)前鼠標(biāo)在窗口客戶(hù)區(qū)的位置。按書(shū)239頁(yè)做第4步:void CNnView:OnMouseMove(UINT nFlags, CPoint point) CString str; CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; /獲得主窗口指針 CSt
49、atusBar *pStatus=&pFrame->m_wndStatusBar; /獲得主窗口中的狀態(tài)欄指針 if(pStatus) str.Format("X=%d,Y=%d",point.x,point.y);/格式化文本 pStatus->SetPaneText(1,str);/更新第2個(gè)窗格的文本 第5步:將MainFrm.h文件中的受保護(hù)變量m_wndStatusBar變?yōu)楣沧兞康?步:在View.cpp視圖類(lèi)的最上面寫(xiě):#include “MainFrm.h”結(jié)果見(jiàn)書(shū)240頁(yè)圖5.27所示3、改變狀態(tài)欄的風(fēng)格 在MFC的CStatusBa
50、r類(lèi)中,有2個(gè)成員函數(shù)可以改變狀態(tài)欄風(fēng)格,他們是:void SetPaneInfo(int nIndex,UINT nID,UINT nStyle,int cxWidth);viod SetPaneStyle(int nIndex,UINT nStyle);其中,參數(shù)nIndex表示要設(shè)置的狀態(tài)欄窗格的索引,nID用于為狀態(tài)欄窗格指定新的ID,cxWidth表示窗格的像素寬度,nStyle表示窗格的風(fēng)格類(lèi)型,用于指定窗格的外觀,例如:SBPS_POPOUT表示窗格是凸起來(lái)的,狀態(tài)欄窗格的風(fēng)格類(lèi)型如下:風(fēng)格類(lèi)型 含義SBPS_NOBORDERS 窗口周?chē)鷽](méi)有3D邊框SBPS_POPOUT 反顯邊
51、界以使文字“凸出來(lái)”SBPS_DISABLED 禁用窗格,不顯示文本SBPS_STRETCH 拉伸窗格,并填充窗格不用的空白空間。但狀態(tài)欄只能有一個(gè)窗格具有這種風(fēng)格SBPS_NORMAL 普通風(fēng)格,它沒(méi)有”拉伸”,”3D邊框”或”凸出來(lái)”等特性在上面的OnMouseMove(UINT nFlags, CPoint point)里加:pStatus->SetPaneStyle(1,SBPS_POPOUT);(見(jiàn)241頁(yè))str.Format("X=%d,Y=%d",point.x,point.y);/格式化文本 pStatus->SetPaneText(1,str
52、);/更新第2個(gè)窗格的文本見(jiàn)窗格就鼓起來(lái)了,如241頁(yè)圖5.28所示例 2:在狀態(tài)欄的最右邊兩個(gè)窗格中顯示出當(dāng)前鼠標(biāo)在窗口客戶(hù)區(qū)的位置。(1)建一個(gè)單文檔的應(yīng)用程序(2)將項(xiàng)目工作區(qū)窗口切換到ResourceView頁(yè)面,雙擊”String Table”項(xiàng)的“String Table”圖標(biāo),則在主界面的右邊出現(xiàn)字符串編輯器。在字符串列表的最后一行的空項(xiàng)上雙擊鼠標(biāo)左鍵,彈出一個(gè)對(duì)話(huà)框如下圖2所示: 圖2:(3)在該對(duì)話(huà)框中,用戶(hù)可以指定相應(yīng)的ID和字符串值,這里加入2個(gè)字符串資源ID_LEFT和ID_RIGHT,其字符的多少?zèng)Q定窗格的大小,其結(jié)果如下圖: 圖 3 :添加的字符串資源(4)打開(kāi)Ma
53、inFrm.cpp文件,將原先的indicators數(shù)組修改如下:static UINT indicators =ID_SEPARATOR, / 第一個(gè)信息行窗格 ID_SEPARATOR, / 第二個(gè)信息行窗格 ID_LEFT, / 第三個(gè)窗格 ID_RIGHT, / 第四個(gè)窗格;(5)由于ClassWizard不能組織相應(yīng)的命令更新消息的映射,用戶(hù)必須手工添加消息處理函數(shù)原型。打開(kāi)View.h文件,在AFX_MSG內(nèi)增加消息處理語(yǔ)句,ClassWizard以后允許用戶(hù)訪問(wèn)和編輯該代碼。protected:/AFX_MSG(CQqView)/ NOTE - the ClassWizard w
54、ill add and remove member functions here.afx_msg void OnUpdateXY(CCmdUI *pCmdUI);/ DO NOT EDIT what you see in these blocks of generated code !/AFX_MSG注意:CCmdUI 類(lèi):其數(shù)據(jù)成員:m_nID用戶(hù)界面元素對(duì)象的ID,m_nIndex用戶(hù)界面(6)打開(kāi)View.cpp文件,在其消息入口處添加消息映射函數(shù)BEGIN_MESSAGE_MAP(CQqView, CView)/AFX_MSG_MAP(CQqView)/ NOTE - the ClassWizard will add and remove mapping macros here. ON_UPDATE_COMMAND_UI(ID_LEFT,OnUpdateXY) ON_UPDATE_COMMAND_UI(ID_RIGHT,OnUpdateXY)/ DO NOT EDIT
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 心臟彩超疾病試題及答案
- 江西省吉安市井岡山市2024-2025學(xué)年數(shù)學(xué)四年級(jí)第二學(xué)期期末達(dá)標(biāo)檢測(cè)模擬試題含解析
- 有機(jī)反應(yīng)機(jī)制解析試題及答案
- 吉林省四平市重點(diǎn)中學(xué)2025年高三下學(xué)期沖刺(四)生物試題含解析
- 電商在農(nóng)產(chǎn)品市場(chǎng)中的角色與機(jī)遇試題及答案
- 小學(xué)教師教育教學(xué)反思對(duì)教師發(fā)展影響分析試題及答案
- 民法學(xué)試題及答案
- 紡織服裝行業(yè)2025年智能化生產(chǎn)智能生產(chǎn)設(shè)備智能化改造市場(chǎng)拓展策略?xún)?yōu)化策略報(bào)告
- 山東省臨沂市蘭陵縣市級(jí)名校2025屆初三質(zhì)量普查調(diào)研考試數(shù)學(xué)試題試卷含解析
- 天津市部分區(qū)五區(qū)縣重點(diǎn)中學(xué)2025屆初三下第二次診斷性考試英語(yǔ)試題含答案
- GB/T 22720.1-2017旋轉(zhuǎn)電機(jī)電壓型變頻器供電的旋轉(zhuǎn)電機(jī)無(wú)局部放電(Ⅰ型)電氣絕緣結(jié)構(gòu)的鑒別和質(zhì)量控制試驗(yàn)
- 機(jī)柜間主體施工方案
- 福格行為模型
- 2021年四川綿竹高發(fā)投資有限公司招聘筆試試題及答案解析
- 銀級(jí)考試題目p43測(cè)試題
- 有限空間作業(yè)及應(yīng)急物資清單
- 思想道德與法治教案第一章:領(lǐng)悟人生真諦把握人生方向
- 61850報(bào)文解析-深瑞版-131016
- 0-6歲兒童隨訪表
- 江西新定額2017土建定額說(shuō)明及解釋
- 國(guó)家電網(wǎng)有限公司十八項(xiàng)電網(wǎng)重大反事故措施(修訂版)-2018版(word文檔良心出品)
評(píng)論
0/150
提交評(píng)論