工具欄和狀態(tài)欄_第1頁
工具欄和狀態(tài)欄_第2頁
工具欄和狀態(tài)欄_第3頁
工具欄和狀態(tài)欄_第4頁
工具欄和狀態(tài)欄_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第5章 菜單、工具欄和狀態(tài)欄菜單是一系列命令的列表,用戶能夠選中其中的菜單項(命令)并執(zhí)行相應(yīng)任務(wù)。除一些簡單的基于對話框的應(yīng)用程序外,所有的Windows程序都提供了各自的菜單。菜單是Windows應(yīng)用程序中不可缺少的界面元素,其風格和外觀有時直接影響著用戶對軟件的評價。許多優(yōu)秀的軟件(如Microsoft Office)為增加對用戶的吸引力,不惜資源資源,將菜單做得多姿多彩,甚至達到三維效果。*用編輯器設(shè)計菜單1、在原有的菜單”文件(F)”里加一個菜單,其作用是你單擊它后,能在屏幕上顯示一行字。(1)建一個SDI單文檔應(yīng)用程序名為:顯示一行字(2)ResourceViewàMen

2、u(雙擊打開)àIDR_MAINFRAMEà右面出現(xiàn)菜單à文件(下拉)à(想在哪兒加,可點重下邊一個,按Insert鍵)à雙擊空白菜單à出現(xiàn)對話框à在Caption處寫菜單名“窗口顯示(&C)”(&為快捷鍵標志)àID處寫ID_FILE_XSà最下面的狀態(tài)欄里可寫點什麼à關(guān)閉對話框 (3)在Doc.h的public下加: CString str; 在Doc.cpp的構(gòu)造函數(shù)里加: str=” ”;/置空 (4)將菜單ID_FILE_XS映射到View視圖類中 Viewà

3、ClassWizardàMessageMapsà在Class name里置Viewà在Object IDS里找到ID_FILE_XS(你加的)à右邊Messages里點黑COMMANDàAdd Functionà出現(xiàn)對話框,里面OnFileXS點ok(對話框消失)àEdit Code進入視圖文件:void View:OnFileXS() CMyDoc *pDoc=GetDocument(); ASSERT_VALID(pDoc); pDoc->str=“你成功的在File菜單里建立了一個顯示菜單”; Invalidat

4、e();(5)再在View.cpp里(往上找到) CMyView:OnDraw(CDC *Pdc) pDC->TextOut(100,100,pDoc->str); (6)運行(1)點你建的菜單,在屏幕上顯示你的一行字(2)打開菜單別動,直接按C鍵,也出現(xiàn)這行字(3)將鼠標放在這個菜單上,下面狀態(tài)欄也出現(xiàn)你寫的注釋。 (7)若建子菜單,需在caption處寫上這個菜單名后,點Pop_up便屏蔽ID,你關(guān)閉此對話框,雙擊出現(xiàn)的子菜單欄,開始建就行了。 (8)改變菜單位置 點重不放,往你想加的地方拖即可!2、在頂層菜單欄里加一個菜單項,其作用是你單擊它后能進入”山東旅游”。1、Reso

5、urceViewàMenuàIDR_MAINFRAMEà右面出現(xiàn)菜單編輯à在菜單的空位置上雙擊(或點重一個菜單,按Insert鍵就在這個菜單前加上一個菜單),出現(xiàn)對話框,你在Caption處寫:“山東旅游(&S)”à點Pop_up(屏蔽ID)à退出2、在下面出現(xiàn)的空白菜單上雙擊,寫:煙臺(&Y)àPop_upà關(guān)閉。3、旁邊出現(xiàn)子菜單,你雙擊它à寫”蓬萊村 Ctrl +F5”àID_SD_YT_PLàprompt處寫:蓬萊仙境4、煙臺下面寫“青島”à子菜單寫“

6、嶗山 Ctrl +F6”àID_SD_QD_LSà注釋欄 (prompt) 寫:嶗山道士。 5、青島下面寫:泰安à子菜單處寫:泰山 Ctrl +F7àID_SD_TA_TSàprompt處寫:五岳之首 6、填加速鍵表:(資源欄)Acceleratorà(雙擊)IDR_MAINFRAMEà出現(xiàn)加速鍵表,你雙擊最下面的空白格à出現(xiàn)對話框àID處下拉找到ID_SD_YT_PL置好àkey處下拉,找到VK_F5置好(或置好ID后,單擊Next Key Typed,按下Ctrl+5鍵也可)7、按第6步,將

7、青島嶗山、泰安泰山分別置好VK_F6 ,VK_F7.8、向工具欄中加新按鈕:使鼠標放在這個按鈕上,就出現(xiàn)個小方框和菜單注釋欄中的蓬萊仙境一樣字樣。(1)ResoureViewàToolbaràIDR_MAINFRAMEà點一下最后的空白按鈕,用紅刷將中間大塊涂紅色。(2)雙擊你涂好的紅色按鈕,出現(xiàn)對話框,你在ID欄下拉,找到ID_SD_YT_PL點黑置好(和煙臺蓬萊菜單共用一個ID)Prompt處寫:蓬萊仙境n蓬萊仙境。(如果你不想與蓬萊仙境一起顯示,就寫自己的工具欄ID號,自己在注釋欄寫東西n-à將ID映射到View中,設(shè)變量,運行后點工具欄就出現(xiàn)你寫

8、的東西)。 9、使菜單變灰(不被激活,不起作用) ViewàClassWizardàClassname選Viewà在ObjectTDS里找到你想屏蔽的菜單,點黑ID_SD_TA_TS,右邊選UPDATE COMMAND UIàAddFoutionàEdit Codeà在此函數(shù)里寫:pCmdUI->Enable(false);(CCmdUI類是用來設(shè)置菜單的等,5.0書128頁,教材243頁) 10、核對菜單項,使這個菜單字的前面加個“”號,和前面一樣用ClassWizard,View里連接UPDATE COMMAND UI,是哪

9、個要被核對,就將哪個ID映射到View里,這里是ID_SD_QD_LS,并加代碼: pCmdUI->Enable(true); pCmdUI->SetCheck(1);/如果括弧里寫0是刪除核對符 11、建立顯示字符串的過程(1)在View.h里的public:寫 CString str; 在View.cpp的構(gòu)造函數(shù)里寫: str=“ ”; (2)分別將煙臺蓬萊ID_SD_YT_PL、青島嶗山ID_SD_QD_LS、泰安泰山ID_SD_TA_TS映射到視圖類View里,即:ViewàClassWizardà在LassName處置Viewà在Objec

10、tIDs里分別找到以上的各個ID并點黑à點黑COMMANDàAdd Functionà各個加完后àEdit Codeà分別加代碼:(青島嶗山映射函數(shù):) str=“青島嶗山”;Invalidate();(煙臺蓬萊映射函數(shù):) str=“八仙過海”;Invalidate();(泰安泰山映射函數(shù):) str=“五岳之首”;Invalidate();(3)在OnDraw()函數(shù)里寫:pDC->TextOut(50,50,str);菜單General(屬性)對話框的各項含義:(223頁表5.1)ID 菜單的資源ID標識符Caption(標題) 用

11、于標識菜單項顯示文本,助記符字母的前面有一個“ &”符號,這個字母與Alt構(gòu)成組合鍵Separator(分隔符) 選中時,菜單項是一個分隔符或是一條水平線Checked(選中的) 選中時,菜單項文本前顯示一個選中標記Pop_up(彈出) 選中時,菜單項含有一個彈出式子菜單Grayed(變灰) 選中時,菜單項顯示是灰色的,用戶不能選用Inactive(非激活) 選中時,菜單項沒有被激活,用戶不能選用Help(幫助) 選中時,菜單項在程序運行時被放在頂層菜單的最右端Break(暫停) 當為Column時,對于頂層菜單上的菜單項來說,被防置在另外一行上,而對于彈出式子菜單的菜單項來說,則被放

12、置在另外一列上;當為Bar時,與Column相同,只不過對于彈出式子菜單來說,它還在新列與原來的列之間增加一條豎直線,注意這些效果只能在程序運行后才能看到Prompt(提示) 用于指明光標移至該菜單項時在狀態(tài)欄上顯示的提示信息下面回到書221頁5.1菜單 習慣上菜單的顯示都遵循下列一些規(guī)則:(1)若單擊某菜單項后,將彈出一個對話框,那么在該菜單項文本后有“”(2)若某項菜單有子菜單,那么在該菜單項文本后有“”(3)若菜單項需要助記符,則用括號將帶下劃線的字母括起來,助記符與Alt構(gòu)成一個組合鍵,當按住“Alt”鍵不放,再敲擊該字母時,對應(yīng)的菜單項就會被選中(4)若某項菜單需要快捷鍵的支持,則一

13、般將其列在相應(yīng)菜單項文本之后。所謂“快捷鍵”是一個組合鍵,如Ctrl+N,使用時是先按下”Ctrl”鍵不放,然后再按”N”鍵。任何時候按下快捷鍵,相應(yīng)的菜單命令都會被執(zhí)行。如書221頁圖5.1所示用編輯器設(shè)計菜單(1) 建一個單文檔應(yīng)用程序(2) ResourceViewà雙擊Menu項中的IDR_MAINFRAMEà頂層菜單的右邊最后一個空位置雙擊à出現(xiàn)屬性對話框àPop-up處于選中狀態(tài)à Caption處寫:測試(&T)(3)單擊“測試”菜單項下方的空位置,在Caption對話框中,輸入標題 “切換菜單(&D)”,在ID框

14、輸入該菜單項的資源標識符:ID_TEST_CHANGE 在最下面的注釋欄中寫“單擊此菜單項將主菜單變成另一菜單”。(3) view(查看)àClassWizard(類向?qū)?àMessage MapsàClass nameà選CMainFrameàIDsà選ID_TEST_CHANGEàMessagesà選中COMMANDà單擊“Add Function”或雙擊“COMMAND”消息àOKàEdit Code(4) 加代碼:AfxMessageBox(“現(xiàn)在就切換嗎?”);(5) 編譯運

15、行!出現(xiàn)對話框,上面寫“現(xiàn)在就切換嗎?”(6) 按Alt+T 再接著按Alt+D便不用鼠標點就能出來“現(xiàn)在就切換嗎?”對話框。以上為作業(yè),上機完成。使用鍵盤快捷鍵(加速鍵)(接上個程序)A、打開此例的項目工作區(qū)窗口中的Accelerator的資源項,雙擊其下的:IDR_MAINFRAME,出現(xiàn)加速鍵表。B、你雙擊最下面的空行,彈出書225頁圖5.8,其中可設(shè)置屬性如:書225頁ID處下拉找到ID_TEST_CHANGE,Key處下拉找到VK_F5置好(單擊Next Key Typed,按下Ctrl+F5鍵也可),(在對話框?qū)傩悦趾竺婕?Ctrl+F5即寫成:切換菜單Ctrl+F5)。C、運行

16、程序 按Ctrl +F5將彈出對話框。菜單的編程控制 在交互式軟件的設(shè)計中,菜單有時會隨著用戶操作的改變而改變,這時的菜單就需要在程序中進行控制。菜單的基本操作MFC提供的菜單類CMenu可在程序運行時,處理有關(guān)菜單的操作:如: 創(chuàng)建菜單、裝入菜單、刪除菜單、獲取菜單或設(shè)置菜單的狀態(tài)等。1、 創(chuàng)建菜單:CMenu類的CreateMenu()和CreatePopupMenu()函數(shù)分別用于創(chuàng)建一個菜單或子菜單框架,它們的原型是:BOOL CreateMenu(); 產(chǎn)生一個空菜單BOOL CreatePopupMenu();產(chǎn)生一個空的彈出式子菜單2、 裝入菜單將菜單從資源裝入應(yīng)用程序中,需要調(diào)

17、用CMenu成員函數(shù)LoadMenu或者用SetMenu對應(yīng)用程序菜單進行重新設(shè)置。BOOL LoadMenu(LPCTSTR lpszResourceName); BOOL LoadMenu(UINT nIDResource); 其中參數(shù):lpszResourceName:菜單資源名稱nIDResource:菜單資源ID標識號3、 添加菜單項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 表示新菜單項的資源ID號 lpszNewItem表示新菜單項的內(nèi)容 pBmp 用于菜單項的位圖指針 nPosition 表示新菜單項要插入的菜單項位置 nFlags表示要增加的新菜單項的狀態(tài)信息(見246頁表

19、)4、 刪除菜單項BOOL DeleteMenu(UINT nPosition,UINT nFlags);其中:nPosition表示要刪除的菜單項位置 當:Flags為MF_BYCOMMAND時,nPosition表示菜單項ID號 當:Flags為MF_BYPOSITION時,nPosition表示菜單項的位置(第一個菜單項為0)5、 獲取菜單項UINT GetMenuItemCount()const;獲得菜單項的項數(shù),調(diào)用失敗返回-1.UINT GetMenuItemID(int nPos)const;獲得由nPos指定菜單項位置(以0為基數(shù))的菜單項的標識號,若nPos是SEPARATO

20、R(分隔符)則返回-1。 CMenu *GetSubMenu(int nPos)const; 獲得指定菜單的彈出式菜單的菜單句柄,該彈出式菜單由參數(shù)nPos指定,開始位置為0,若選單不存在,則創(chuàng)建一個臨時的菜單指針。例:用程序添加并處理一個菜單項(1)新建一個單文檔(SDI)應(yīng)用程序(2)ViewàResourceSymbols彈出書228頁圖5.10的對話框(3)單擊“New”按鈕彈出如圖228頁5.11所示的“New Symbol”(新標識符)對話框。在名字(Name)框中輸入一個新的標識符ID_NEW_MENUITEM.在值(Value)框中,輸入該ID的值,系統(tǒng)要求用戶定義的

21、ID值應(yīng)大于15(0X000F)而小于61440(0XF000)。保留默認的ID值101,單擊“確定”按鈕。(4)關(guān)閉“資源符號”對話框,在CMainFrame:OnCreate函數(shù)中添加下列代碼,該函數(shù)在框架窗口創(chuàng)建時自動調(diào)用。int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) CMenu *pSysMenu=GetMenu();/獲得主菜單句柄 CMenu *pSubMenu=pSysMenu->GetSubMenu(1);/獲得第二個子菜單指針 CString StrMenuItem(“新的選單項”); pSubMenu-&

22、gt;AppendMenu(MF_SEPARATOR);/增加一水平分割線 pSubMenu->AppendMenu(MF_STRING,ID_NEW_MENUITEM,StrMenuItem); /在子選單中增加一選單項,允許使用ON_UPDATE_COMMAND_UI或 /ON_COMMAND的選單項 m_bAutoMenuEnable=FALSE;/關(guān)閉系統(tǒng)自動更新菜單狀態(tài) pSysMenu->EnableMenuItem(ID_NEW_MENUITEM,MF_BYCOMMAND| MF_ENABLED);/激活菜單項 DrawMenuBar();/更新菜單 return 0

23、;(5)(6)使用ClassWizard在CMainFrame主框架類中添加OnCommand消息函數(shù)的重載,并檢測用戶選單的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、新的選單項”);(7)編譯運行并測試。編輯->新的選單項;彈出對話框,顯示“你選中了新的選單項” 使用快捷菜單快捷菜單是一種浮動的彈出式菜單,它是一種新的用戶界面設(shè)計風格,當用戶按下鼠標右鍵時,就會相應(yīng)地彈出一個浮動菜單,其中提供了幾個與當前選擇內(nèi)容相關(guān)的選項。用資源編輯器和MFC庫的CMenu:TrackPopupMenu()函數(shù)可以 很容易地創(chuàng)建這樣的菜單,其原形如下: BOOL TrackPopupMenu(UINT nFlags,int x,int y,CWnd *pWnd, LPCRECT lpRect=NULL);該函數(shù)用于顯示一個浮動的彈出式菜單,其位置由各參數(shù)決定。其中:

25、nFlags表示菜單在屏幕顯示的位置以及鼠標按鈕標志,見230頁表5.4。x,y表示菜單的水平坐標和菜單的頂端的垂直坐標。pWnd表示彈出菜單的窗口,此窗口將收到菜單的全部WM_COMMAND消息。lpRect是一個RECT結(jié)構(gòu)或CRect對象指針,它表示一個矩形區(qū)域,用戶單擊這個區(qū)域時,彈出菜單不消失。當lpRect為NULL時,若用戶在菜單外面單擊,菜單立刻消失。例1:使用快捷菜單(顯示運行后的窗口菜單里的”文件(F)”下面的菜單項)按 書230頁做 第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();/獲得頂層菜單個數(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;/沒有找到返回pSysMenu->GetSubMenu(nSubMenuPos)->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);第3步:#include “MainFrm.h”第4步:編譯運行,在應(yīng)用程序窗口的客戶區(qū)中,用鼠標單擊右鍵,會彈出快捷菜單(將原File下拉的菜單彈出來)(如書231頁圖5.13)。說明

28、:由于菜單、工具欄、狀態(tài)欄是由主框架類CMainFrame來控制的,雖在視圖類可以添加快捷菜單消息映射,但若要在視圖類中訪問應(yīng)用程序的主框架窗口的系統(tǒng)菜單,則必須通過AfxGetApp來獲取主框架類對象指針后才能獲取相應(yīng)的菜單。AfxGetApp是CWinApp類的一個成員函數(shù),該函數(shù)可在應(yīng)用程序項目中的任何類中使用,用于獲取應(yīng)用程序中的CWinApp類對象指針。例:使用快捷菜單(自己建立的菜單以快捷方式彈出來)1、創(chuàng)建一個單文檔應(yīng)用程序2、InsertàResourceà點黑MenuàNewà便在Menu資源下出現(xiàn)一個新菜單資源(默認的ID號為IDR_

29、MENU1),將此ID號改為:IDR_MYFLOATMENU。3、雙擊這個菜單資源,文檔區(qū)出現(xiàn)一個空白菜單項,你為它起個名叫“彈出式菜單”,關(guān)閉à點開下面的子菜單,依次添加如下子菜單項:菜單 ID 標 題 屬 性ID_MENU_SCOREIN 成績輸入(&S) 默認ID_MENU_SCOREPRINT 成績打印(&P) 默認ID_SEPARATRO Separator- 其他(&Q) Pop_up其余默認4、 (如果要有提問對話框,你回答選擇已存在的類,否則按以下步驟做)ViewàClassWizardàClassNameàCMa

30、inFrameà將上面的ID分別選中,并分別加COMMAND消息。這里我們僅選ID_MENU_SCOREIN映射COMMAND消息,并加如下代碼:void CMainFrame:OnMenuScorein() AfxMessageBox(“現(xiàn)在就輸入成績嗎?”); 5、在CMainFrame類(或其它類)加入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、運行并測試,你在出現(xiàn)的應(yīng)用程序窗口中,單擊右鍵會出現(xiàn)你創(chuàng)建的菜單(快捷菜單)你再按成績輸入會出現(xiàn)已寫好的“現(xiàn)在就輸入成績嗎?”; 注意:若按“成績打印菜單”有信息在窗口顯示則: 在View.h里寫:CString str; 將ID_MENU_SCOREPRINT映射到View中,在此函數(shù)中加: str=“你按了成績打印菜單”; Invalidate(); 在OnDraw()里:pDC->TextOut(100,1

32、00,str);5.2工具欄工具欄是一系列工具按鈕的組合,借助它們可以提高用戶的工作效率。Visual C+6.0系統(tǒng)保存了每個工具欄相應(yīng)的位圖,其中包括所有按鈕的圖象,而所有的按鈕圖象具有相同的尺寸(15像素高,16像素寬),它們在位圖中的排列次序與屏幕上的按鈕在工具欄上的次序相同。使用工具欄編輯器(1)創(chuàng)建一個SDI單文檔應(yīng)用程序。(2)ResourceViewàToobaràIDR_MAINFRAMEà點最后一個空的工具欄à涂紅色后à再雙擊出現(xiàn)屬性對話框,ID處寫:ID_TOOLBARà在prompt框內(nèi)鍵入“向系統(tǒng)輸入學生成績

33、n成績輸入”(3)將ID_TOOLBAR映射到View視圖類中,寫:void CMainFrame:OnToolbar() / TODO: Add your command handler code hereMessageBox(“工具欄顯示”);(4)編譯運行(在狀態(tài)攔上出現(xiàn)上面的字,鼠標放在工具攔上就出現(xiàn)一個成績輸入框)(5)建一個菜單項ResourceViewàMenuà雙擊IDR_MAINFRAMEà出現(xiàn)空白菜單à標題處寫:和工具欄連用àID處寫和工具欄的ID一樣的ID即:ID_TOOLBAR這樣運行à點這個菜單和點這個工具欄

34、的顯示結(jié)果是一樣的(工具欄和菜單相結(jié)合)。*(1)在工具欄中移動一個按鈕(2)消失一個按鈕(刪除)(3)復制一個按鈕 (4)按鈕前插入一個空格(5)按鈕后插入空格(6)按鈕前后空格消失 見232頁“工具欄按鈕屬性”對話框的各項含義:ID 工具欄按鈕的標識符,可以輸入自己的標識符名稱,也可從ID的下拉列表中選取標識符名稱Width(寬) 工具欄按鈕的像素寬度Height(高) 工具欄按鈕的像素高度Prompt(提示) 工具欄按鈕提示文本:若為“建立新文檔n新建”,則表示將鼠標指向該按鈕時,在狀態(tài)欄中顯示“建立新文檔”,而在彈出的提示信息中出現(xiàn)“新建”字樣?!眓”是它們的分割轉(zhuǎn)義符。多個工具欄的使

35、用 實際應(yīng)用中,常常需要多個工具欄,下面來討論多個工具欄的創(chuàng)建、顯示和隱藏,以及多個工具欄和菜單之間的聯(lián)動操作等。例:使用多個工具欄(1)添加并更改應(yīng)用程序菜單1)創(chuàng)建一個單文檔應(yīng)用程序2)按快捷鍵Ctrl+R(或InsertàResourceà在資源類型中選中Menu(233頁5.16所示)3)單擊“New”按鈕,便在右邊出現(xiàn)一個空菜單,系統(tǒng)給的默認ID為IDR_MENU1 如書234頁圖5.174)不做(書只是說明)5)、6)、按書233頁做7)CMenu m_NewMenu;8)void CMainFrame:OnViewTest() / TODO: Add your

36、 command handler code herem_NewMenu.Detach();/使菜單對象和菜單句柄分離.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();/使菜單對象和菜單句柄分離 m_NewMenu.LoadMenu(IDR_MAINFRAME);SetMenu(NULL);S

37、etMenu(&m_NewMenu);9)編譯運行:查看à顯示測試菜單à在上面出現(xiàn)“測試”à測試à返回à又回到原菜單。(2)添加并設(shè)計工具欄按鈕按書235頁做 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);第一個參數(shù)用于指定工具欄所在的父窗口指針(this表示當前的CMainFrame類窗口指針)第二個參數(shù)用于指定工具按鈕的風格(TBSTYLE_FLAT表示工具按鈕是“平面”的)第三個參數(shù)用于指針工具欄的風格,由于這里的工具欄是CMainFrame的子窗口,因此需要指定WS_CHILD|WS_VISIBLE。CBRS_TOP表示工具欄放置在父窗口的頂部,CBRS_GRIPPER表示工具欄前面有一個“把手”CBRS_TOOLTIPS表示允許有工具提示CBRS_FLYBY表示在狀態(tài)欄顯示工具提示文本CB

40、RS_SIZE_DYNAMIC表示工具欄在浮動時,其大小是可以動態(tài)改變的第四個參數(shù)用于指定工具欄四周的邊框大小,一般都為0(如:CRect(0,0,0,0))最后一個參數(shù)用于指定工具欄這個子窗口的標識ID(與工具欄資源標識不同)if語句中的LoadToolBar函數(shù)用于裝載工具欄資源。若CreateEx或 LoadToolBar的返回值為0,既調(diào)用不成功,則顯示診斷信息“Failed to create toolbar”。TRACEO是一個用于程序調(diào)試的跟蹤宏OnCreate函數(shù)返回-1時,主框架窗口被清除。應(yīng)用程序中的工具欄一般具有??炕蚋有裕簃_wndTestBar.EnableDock

41、ing使得m_wndTestBar對象可以??浚珻BRS_ALIGN_ANY表示可以??吭诖翱诘娜我贿叀nableDocking(CBRS_ALIGN_ANY)調(diào)用的是CFrameWnd類的成員函數(shù),用于讓工具欄或其它控制條在主框架窗口可以進行??坎僮?。DockControlBar也是CFrameWnd類的成員函數(shù),用于將指定的工具欄或其他控制條進行??俊Uf明:AFX_IDW_TOOLBAR是系統(tǒng)內(nèi)部的工具欄子窗口標識,并將AFX_IDW_TOOLBAR+1的值表示默認的狀態(tài)欄子窗口標識。如果在創(chuàng)建新的工具欄時沒有指定相應(yīng)的子窗口標識,則會使用默認的AFX_IDM_TOOLBAR。這樣,當打

42、開“查看”菜單,單擊“工具欄”菜單時,顯示或隱藏的工具欄不是原來的工具欄,而是新添加的工具欄。為此,需要重新指定工具欄子窗口的標識,并使其值等于AFX_IDW_TOOLBAR+10(4)完善程序代碼1) 見書2)int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)ShowControlBar(&m_wndTestBar,FALSE,FALSE);/關(guān)閉測試工具欄Return 0;說明:ShowControlBar函數(shù)有3個參數(shù),第1個參數(shù)用于指定要操作的工具欄或狀態(tài)欄指針,第2個參數(shù)是一個布爾型,當為TRUE時表示顯示,否則表示隱

43、藏,第3個參數(shù)用于表示是否延遲顯示或隱藏,當為FALSE時表示立即顯示或隱藏。3)void CMainFrame:OnViewTest() ShowControlBar(&m_wndTestBar,FALSE,FALSE);/關(guān)閉測試工具欄ShowControlBar(&m_wndToolBar,TRUE,FALSE);/顯示主工具欄void CMainFrame:OnTestReturn() ShowControlBar(&m_wndTestBar,FALSE,FALSE);/關(guān)閉測試工具欄 ShowControlBar(&m_wndToolBar,TRUE,

44、FALSE);/顯示主工具欄4)編譯運行:結(jié)果見238頁圖5.25所示5.3狀態(tài)欄 狀態(tài)欄是一條水平長條,位于應(yīng)用程序的主窗口的底部,它可以分割成幾個窗格,用來顯示多組信息。應(yīng)用程序往往需要把當前的狀態(tài)信息或提示信息告訴用戶,雖然其他窗口(如窗口的標題欄上、提示窗口等)也可顯示文本,但它們的功能比較有限,而狀態(tài)欄能很好地滿足應(yīng)用程序顯示信息的需求。 狀態(tài)欄的定義在MFC AppWizard創(chuàng)建的SDI或MDI應(yīng)用程序框架的MainFrm.cpp文件中有一個靜態(tài)數(shù)組indicators數(shù)組,它被MFC用做狀態(tài)欄的定義(見239頁圖5.26為indicator數(shù)組元素與標準狀態(tài)欄窗口的關(guān)系)。這個

45、數(shù)組中的元素是一些標識常量或是字串資源的ID標識符。默認的indicators數(shù)組包含了4個元素,它們是:ID_SEPARATOR 是用于標識信息行窗格的,菜單項或工具欄按鈕的許多信息都在這個信息行窗格中顯示。ID_INDICATOR_CAPS 是用于標識指示器窗格顯示出CapsLock鍵的狀態(tài)(大寫)ID_INDICATOR_NUM 是用于標識指示器窗格顯示出NumLock鍵狀態(tài)(數(shù)字)ID_INDICATOR_SCRL 是用于標識指示器窗格顯示出ScrollLock鍵的狀態(tài)(小寫)狀態(tài)欄的常用操作Visual C+6.0中可以方便地對狀態(tài)欄進行操作,如增加窗格、減少窗格、在狀態(tài)欄中顯示文本

46、、改變狀態(tài)欄的風格 大小等,并且MFC的CStatusBar類封裝了狀態(tài)欄的大部分操作。1、增加和減少窗格狀態(tài)欄中的窗格可以分為信息行窗格和指示器窗格2類。(1)若在狀態(tài)欄中增加一個信息行窗格,則只需要在indicators數(shù)組的適當位置增加一個ID_SEPARATOR標識即可;(2)若在狀態(tài)欄中增加一個用戶指示器窗格,則在indicators數(shù)組中的適當位置增加一個在字符串表中定義過的資源ID,其字符串的長度表示用戶指示器窗格的大小。(3)若狀態(tài)欄減少一個窗格,其操作與增加相類似,只需減少indicators數(shù)組元素即可。2、在狀態(tài)欄上顯示文本(1)調(diào)用CWnd:SetWindowText更

47、新信息行窗格(或窗格0)中的文本。由于狀態(tài)欄也是一種窗口,故在使用時可直接調(diào)用。若狀態(tài)欄變量為m_wndStatusBar顯示為m_wndStatusBar。SetWindowText(“消息”)語句將在信息行窗格(或窗格0)內(nèi)顯示”消息”字樣。(2)手動處理狀態(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個窗格的索引為0) lpszNewText表示要顯示的字符串,若bUpdate為TRUE,則系統(tǒng)自動更新顯示的結(jié)果注意:在使用第2種方法時,應(yīng)按一定的步驟進行,例如: 例 1:在狀態(tài)欄的最右邊兩個窗格中顯示出當前鼠標在窗口客戶區(qū)的位置。按書239頁做第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個窗格的文本 第5步:將MainFrm.h文件中的受保護變量m_wndStatusBar變?yōu)楣沧兞康?步:在View.cpp視圖類的最上面寫:#include “MainFrm.h”結(jié)果見書240頁圖5.27所示3、改變狀態(tài)欄的風格 在MFC的CStatusBa

50、r類中,有2個成員函數(shù)可以改變狀態(tài)欄風格,他們是: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表示窗格的風格類型,用于指定窗格的外觀,例如:SBPS_POPOUT表示窗格是凸起來的,狀態(tài)欄窗格的風格類型如下:風格類型 含義SBPS_NOBORDERS 窗口周圍沒有3D邊框SBPS_POPOUT 反顯邊

51、界以使文字“凸出來”SBPS_DISABLED 禁用窗格,不顯示文本SBPS_STRETCH 拉伸窗格,并填充窗格不用的空白空間。但狀態(tài)欄只能有一個窗格具有這種風格SBPS_NORMAL 普通風格,它沒有”拉伸”,”3D邊框”或”凸出來”等特性在上面的OnMouseMove(UINT nFlags, CPoint point)里加:pStatus->SetPaneStyle(1,SBPS_POPOUT);(見241頁)str.Format("X=%d,Y=%d",point.x,point.y);/格式化文本 pStatus->SetPaneText(1,str

52、);/更新第2個窗格的文本見窗格就鼓起來了,如241頁圖5.28所示例 2:在狀態(tài)欄的最右邊兩個窗格中顯示出當前鼠標在窗口客戶區(qū)的位置。(1)建一個單文檔的應(yīng)用程序(2)將項目工作區(qū)窗口切換到ResourceView頁面,雙擊”String Table”項的“String Table”圖標,則在主界面的右邊出現(xiàn)字符串編輯器。在字符串列表的最后一行的空項上雙擊鼠標左鍵,彈出一個對話框如下圖2所示: 圖2:(3)在該對話框中,用戶可以指定相應(yīng)的ID和字符串值,這里加入2個字符串資源ID_LEFT和ID_RIGHT,其字符的多少決定窗格的大小,其結(jié)果如下圖: 圖 3 :添加的字符串資源(4)打開Ma

53、inFrm.cpp文件,將原先的indicators數(shù)組修改如下:static UINT indicators =ID_SEPARATOR, / 第一個信息行窗格 ID_SEPARATOR, / 第二個信息行窗格 ID_LEFT, / 第三個窗格 ID_RIGHT, / 第四個窗格;(5)由于ClassWizard不能組織相應(yīng)的命令更新消息的映射,用戶必須手工添加消息處理函數(shù)原型。打開View.h文件,在AFX_MSG內(nèi)增加消息處理語句,ClassWizard以后允許用戶訪問和編輯該代碼。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 類:其數(shù)據(jù)成員:m_nID用戶界面元素對象的ID,m_nIndex用戶界面(6)打開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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論