版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、5.1 菜單 圖5.1是一個(gè)菜單樣例,注意它們的規(guī)則含義。需要說明的是,在常見的菜單系 統(tǒng)中,最上面的一層水平排列的菜單稱為“頂層菜單”,每一個(gè)頂層菜單項(xiàng)可以是 一個(gè)簡單的菜單命令,也可以是下拉(Popup)菜單,在下拉菜單中的每一個(gè)菜單 項(xiàng)也可是菜單命令或下拉菜單,這樣一級一級下去可以構(gòu)造出復(fù)雜的菜單系統(tǒng)。頂層菜單彈出菜單圖5.1 菜單樣例第1頁/共50頁用編輯器設(shè)計(jì)菜單 1. 編輯菜單 在頂層菜單的最后一項(xiàng),Visual C+為用戶留出了一個(gè)空位置,用來輸入新的頂層菜單 項(xiàng)。在菜單的空位置上雙擊鼠標(biāo)左鍵,出現(xiàn)菜單項(xiàng)的屬性對話框,在標(biāo)題框中輸入“測試 (&T)”,結(jié)果如圖5.2所示,
2、其中符號&用來將其后面的字符作為該菜單項(xiàng)的助記符,這樣當(dāng) 按住“Alt”鍵不放,再敲擊該助記符鍵時(shí),對應(yīng)的菜單項(xiàng)就會被選中,或在菜單打開時(shí),直 接按相應(yīng)的助記符鍵,對應(yīng)的菜單項(xiàng)也會被選中。子菜單的空位置保存可見按鈕頂層菜單的空位置圖5.2 Ex_SDI菜單資源第2頁/共50頁用編輯器設(shè)計(jì)菜單 1. 編輯菜單 單擊“測試”菜單項(xiàng)下方的空位置,在菜單項(xiàng)屬性對話框中,輸入標(biāo)題“切換菜單 (&D)”,在ID框輸入該菜單項(xiàng)的資源標(biāo)識符:ID_TEST_CHANGE,結(jié)果如圖5.3 所示。圖5.3 修改菜單項(xiàng)屬性關(guān)閉菜單項(xiàng)屬性對話框,將新添加的菜單項(xiàng)拖放到“查看”和“幫助”菜單項(xiàng)之間,結(jié)果
3、如圖5.4所示。需要說明的是,菜單項(xiàng)位置改變后,其屬性并沒改變。圖5.4 菜單項(xiàng)“測試”拖放后的位置第3頁/共50頁用編輯器設(shè)計(jì)菜單 2. 菜單命令的消息映射 (1) 選擇“查看”“建立類向?qū)А辈藛蚊罨虬碈trl+W快捷鍵,則出現(xiàn)MFC ClassWizard對話框,并自動切換到Message Maps頁面。從“Class name”列表 中選擇CMainFrame,在IDs列表中選擇ID_TEST_CHANGE,然后在Messages 框中選擇COMMAND消息。如圖5.5所示。圖5.5 菜單命令消息的映射第4頁/共50頁2. 菜單命令的消息映射 (2) 單擊Add Function按鈕或
4、雙擊COMMAND消息,出現(xiàn)“Add Member Function”對話框以輸入成員函數(shù)的名稱。系統(tǒng)默認(rèn)的函數(shù)名為OnTestChange, 如圖5.6所示。該函數(shù)是對菜單項(xiàng)ID_TEST_CHANGE的映射,也就是說,當(dāng)應(yīng) 用程序運(yùn)行后,用戶選擇“測試”“對話框”菜單時(shí),該函數(shù)OnTestDlg被調(diào)用,執(zhí) 行函數(shù)中的代碼。(3) 單擊OK按鈕,在ClassWizard的“Member functions”列表中將列出新增加的成員函數(shù)。選擇此函數(shù),單擊Edit Code按鈕(或直接在函數(shù)名雙擊鼠標(biāo)),在此成員函數(shù)中添加下列代碼:void CMainFrame:OnTestChange() /
5、 TODO: Add your command handler code hereAfxMessageBox(現(xiàn)在就切換嗎?);圖5.6 添加映射函數(shù)第5頁/共50頁2. 菜單命令的消息映射 (4) 編譯并運(yùn)行。在應(yīng)用程序的頂層菜單上,單擊“測試”菜單項(xiàng),然后將鼠標(biāo)移動 到彈出的子菜單項(xiàng)“切換菜單”上,則結(jié)果如圖5.7所示,此時(shí)狀態(tài)欄上顯示該菜單 項(xiàng)的提示信息,該信息就是在前圖5.3的菜單項(xiàng)屬性對話框“提示”框中設(shè)置的內(nèi) 容。單擊“切換菜單”,則彈出一個(gè)消息對話框,顯示內(nèi)容“現(xiàn)在就切換嗎?”。圖5.7 Ex_SDI運(yùn)行后的菜單第6頁/共50頁使用鍵盤快捷鍵 (1) 展開項(xiàng)目工作區(qū)窗口中Acce
6、lerator的資源項(xiàng),雙擊IDR_MAINFRAME,出現(xiàn) 如圖5.8的加速鍵資源列表。圖5.8 Ex_SDI的加速鍵資源 下端的空行第7頁/共50頁使用鍵盤快捷鍵 (2) 建立一個(gè)新的加速鍵時(shí),只要雙擊加速鍵列表的最下端的空行,彈出如圖5.9 所示的“Accel Properties”(加速鍵屬性)對話框,其中可設(shè)置的屬性如表5.2所示圖5.9 加速鍵屬性對話框 表5.2 加速鍵General屬性對話框的各項(xiàng)含義第8頁/共50頁使用鍵盤快捷鍵 (3) 在加速鍵屬性對話框中,先選擇在Ex_SDI應(yīng)用程序菜單資源添加的“切換菜 單”菜單項(xiàng)ID_TEST_CHANGE作為要聯(lián)用的加速鍵的ID標(biāo)識
7、符,然后單擊下一 鍵按鈕,并按下Ctrl+1作為此加速鍵的鍵值。需要說明的是,為了使其他用戶能 查看并使用該加速鍵,還需在相應(yīng)的菜單項(xiàng)文本后面添加加速鍵內(nèi)容。例如,可 將ID_TEST_CHANGE菜單項(xiàng)的標(biāo)題改成“切換菜單(&C)tCtrl+1”,其中“t”是將后 面的“Ctrl+1”定位到一個(gè)水平制表位。 (4) 編譯運(yùn)行并測試。當(dāng)程序運(yùn)行后,按Ctrl+1鍵將執(zhí)行相應(yīng)的菜單命令。第9頁/共50頁菜單的編程控制 1. 創(chuàng)建菜單 CMenu類的CreateMenu和CreatePopupMenu分別用來創(chuàng)建一個(gè)菜單或子菜單框 架,它們的原型如下: BOOL CreateMenu( )
8、;/ 產(chǎn)生一個(gè)空菜單 BOOL CreatePopupMenu( );/ 產(chǎn)生一個(gè)空的彈出式子菜單 2. 裝入菜單 將菜單從資源裝入應(yīng)用程序中,需調(diào)用CMenu成員函數(shù)LoadMenu,或者用 SetMenu對應(yīng)用程序菜單進(jìn)行重新設(shè)置。 BOOL LoadMenu( LPCTSTR lpszResourceName ); BOOL LoadMenu( UINT nIDResource ); 其中,lpszResourceName為菜單資源名稱,nIDResource為菜單資源ID標(biāo)識 符。第10頁/共50頁菜單的編程控制 3. 添加菜單項(xiàng) 當(dāng)菜單創(chuàng)建后,用戶可以調(diào)用AppendMenu或Ins
9、ertMenu函數(shù)來添加一些菜單項(xiàng)。但每次添加 時(shí),AppendMenu是將菜單項(xiàng)添加在菜單的末尾處,而 InsertMenu在菜單的指定位置處插入菜單項(xiàng),并將后面的菜單項(xiàng)依次下移。 BOOL AppendMenu( UINT nFlags, UINT nIDNewItem = 0,LPCTSTR lpszNewItem = NULL ); BOOL AppendMenu( UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp ); BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewI
10、tem = 0, LPCTSTR lpszNewItem = NULL ); BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp ); 其中,nIDNewItem表示新菜單項(xiàng)的資源ID標(biāo)識符,lpszNewItem表示新菜單項(xiàng)的內(nèi)容,pBmp用 于菜單項(xiàng)的位圖指針,nPosition表示新菜單項(xiàng)要插入的菜單項(xiàng)位置。nFlags表示要增加的新菜單 項(xiàng)的狀態(tài)信息,它的值影響其他參數(shù)的含義,如表5.3所示。第11頁/共50頁表5.3 nFlags的值及其對其他參數(shù)的影響第12頁/共50頁
11、菜單的編程控制 4. 刪除菜單項(xiàng) 調(diào)用DeleteMenu函數(shù)可將指定的菜單項(xiàng)刪除,函數(shù)DeleteMenu的原型如下: BOOL DeleteMenu( UINT nPosition, UINT nFlags ); 其中,參數(shù)nPosition表示要刪除的菜單項(xiàng)位置,它由nFlags進(jìn)行說明。若當(dāng) nFlags為MF_BYCOMMAND時(shí),nPosition表示菜單項(xiàng)的ID標(biāo)識符,而當(dāng)nFlags 為MF_BYPOSITION時(shí),nPosition表示菜單項(xiàng)的位置(第一個(gè)菜單項(xiàng)位置為0)。 5. 獲取菜單項(xiàng) 下面的3個(gè)CMenu成員函數(shù)分別獲得菜單的項(xiàng)數(shù)、菜單項(xiàng)的ID標(biāo)識符以及彈出式 子菜單
12、的句柄。 UINT GetMenuItemCount( ) const; 該函數(shù)用來獲得菜單的菜單項(xiàng)數(shù),調(diào)用失敗后返回-1。 UINT GetMenuItemID( int nPos ) const; 該函數(shù)用來獲得由nPos指定菜單項(xiàng)位置(以0為基數(shù))的菜單項(xiàng)的標(biāo)識號,若nPos 是SEPARATOR(分隔符),則返回-1。 CMenu* GetSubMenu( int nPos ) const; 該函數(shù)用來獲得指定菜單的彈出式菜單的菜單句柄。該彈出式菜單位置由參數(shù) nPos指定,開始的位置為0。若菜單不存在,則創(chuàng)建一個(gè)臨時(shí)的菜單指針。第13頁/共50頁菜單的編程控制 例Ex_Menu 用程
13、序添加并處理一個(gè)菜單項(xiàng)(1)創(chuàng)建一個(gè)默認(rèn)的單文檔應(yīng)用程序Ex_Menu。 (2) 選擇“查看”菜單“Resource Symbols”命令,彈出如圖5.10所示的“資源符 號”對話框,它能對應(yīng)用程序中的資源標(biāo)識符進(jìn)行管理。由于程序中要添加的菜 單項(xiàng)需要一個(gè)標(biāo)識值,最好用一個(gè)標(biāo)識符來代替這個(gè)值,這是一個(gè)好的習(xí)慣。因 此這里通過“資源符號”對話框來創(chuàng)建一個(gè)新的標(biāo)識符。圖5.10 “資源符號”對話框第14頁/共50頁 例Ex_Menu (3) 單擊新建按鈕,彈出如圖5.11所示的“New Symbol”(新標(biāo)識符)對話框。在名 字(Name)框中輸入一個(gè)新的標(biāo)識符ID_NEW_MENUITEM。在值
14、(Value)框中, 輸入該ID的值,系統(tǒng)要求用戶定義的ID值應(yīng)大于15(0X000F)而小于 61440(0XF000)。保留默認(rèn)的ID值101,單擊確定按鈕。圖5.11 新標(biāo)識符對話框第15頁/共50頁例Ex_Menu (4) 關(guān)閉“資源符號”對話框,在CMainFrame:OnCreate函數(shù)中添加下列代碼,該函數(shù)在框 架窗口創(chuàng)建時(shí)自動調(diào)用。 int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) .CMenu* pSysMenu = GetMenu();/ 獲得程序菜單指針CMenu* pSubMenu = pSysMenu-Get
15、SubMenu(1);/ 獲得第二個(gè)子菜單的指針CString StrMenuItem(新的菜單項(xiàng));pSubMenu-AppendMenu(MF_SEPARATOR);/ 增加一水平分隔線pSubMenu-AppendMenu(MF_STRING,ID_NEW_MENUITEM,StrMenuItem);/ 在子菜單中增加一菜單項(xiàng)m_bAutoMenuEnable = FALSE; / 關(guān)閉系統(tǒng)自動更新菜單狀態(tài)pSysMenu-EnableMenuItem(ID_NEW_MENUITEM,MF_BYCOMMAND|MF_ENABLED);/ 激活菜單項(xiàng)DrawMenuBar();/ 更新菜單
16、return 0; 第16頁/共50頁例Ex_Menu (5) 此時(shí)編譯運(yùn)行后,結(jié)果如圖5.12所示。但此時(shí)選擇“新的菜單項(xiàng)”命令不會有反 應(yīng)。圖5.12 程序添加的菜單項(xiàng)第17頁/共50頁例Ex_Menu (6) 用MFC ClassWizard在CMainFrame添加OnCommand消息函數(shù)的重載,并 添加下列代碼: BOOL CMainFrame:OnCommand(WPARAM wParam, LPARAM lParam) / wParam的低字節(jié)表示菜單、控件、加速鍵的命令I(lǐng)D if (LOWORD(wParam) = ID_NEW_MENUITEM) MessageBox(你選
17、中了新的菜單項(xiàng)); return CFrameWnd:OnCommand(wParam, lParam); (7) 編譯運(yùn)行并測試。這時(shí)當(dāng)選擇菜單“編輯”“新的菜單項(xiàng)”命令后,就會彈一個(gè) 對話框,顯示“你選中了新的菜單項(xiàng)”消息。第18頁/共50頁使用快捷菜單 快捷菜單是一種浮動的彈出式菜單,它是一種新的用戶界面設(shè)計(jì)風(fēng)格。當(dāng)用戶按 下鼠標(biāo)右鍵時(shí),就會相應(yīng)地彈出一個(gè)浮動菜單,其中提供了幾個(gè)與當(dāng)前選擇內(nèi)容 相關(guān)的選項(xiàng)。 用資源編輯器和MFC庫的CMenu:TrackPopupMenu函數(shù)可以很容易地創(chuàng)建這樣 的菜單,CMenu:TrackPopupMenu函數(shù)原型如下:BOOL TrackPopup
18、Menu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL ); 該函數(shù)用來顯示一個(gè)浮動的彈出式菜單,其位置由各參數(shù)決定。其中,nFlags表示 菜單在屏幕顯示的位置以及鼠標(biāo)按鈕標(biāo)志,如表5.4所示。 表5.4 nFlags的值及其對其他參數(shù)的影響第19頁/共50頁使用快捷菜單例Ex_ContextMenu 使用快捷菜單(1) 創(chuàng)建一個(gè)默認(rèn)的單文檔應(yīng)用程序Ex_ContextMenu。用MFC ClassWizard在CEx_ContextMenuView類添加WM_CONTEXTMENU消息映射,并在映射函數(shù)中添加下列
19、代碼:void CEx_ContextMenuView:OnContextMenu(CWnd* pWnd, CPoint point) CMainFrame* pFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd;/ 獲得主窗口指針CMenu* pSysMenu = pFrame-GetMenu();/ 獲得程序窗口菜單指針int nCount = pSysMenu-GetMenuItemCount();/ 獲得頂層菜單個(gè)數(shù)int nSubMenuPos = -1;for (int i=0; iGetMenuString(i, str, MF_BYPOSITIO
20、N);if (str.Left(4) = 文件) nSubMenuPos = i;break;if (nSubMenuPosGetSubMenu( nSubMenuPos) -TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this);第20頁/共50頁例Ex_ContextMenu (3) 在Ex_ContextMenuView.cpp文件的前面添加CMainFrame類的文件包含: #include Ex_ContextMenuView.h #include MainFrm.h (4) 運(yùn)行并測試。當(dāng)用戶在應(yīng)用
21、程序窗口的客戶區(qū)中右擊鼠標(biāo),會彈出如圖5.13 的快捷菜單。圖5.13 快捷菜單 客戶區(qū)第21頁/共50頁5.2 工具欄 使用工具欄編輯器 選擇菜單“文件”“打開工作區(qū)”,將前面的單文檔應(yīng)用程序Ex_SDI調(diào)入或重新創(chuàng) 建。在項(xiàng)目工作區(qū)窗口中選擇ResourceView頁面,雙擊“Toolbar”項(xiàng)中的 IDR_MAINFRAME,則工具欄編輯器出現(xiàn)在主界面的右邊,如圖5.14所示。圖5.14 工具欄編輯器窗口空按鈕圖形工具箱顏色工具箱第22頁/共50頁使用工具欄編輯器 下面就工具欄按鈕的一般操作進(jìn)行說明。 (1) 創(chuàng)建一個(gè)新的工具欄按鈕。 (2) 移動一個(gè)按鈕。 (3) 刪除一個(gè)按鈕。 (4
22、) 在工具欄中插入空格。 在工具欄中插入空格有以下幾種情況: 如果按扭前沒有任何空格,拖動該按鈕向右移動并當(dāng)覆蓋相鄰按鈕的一半以上時(shí),釋放鼠標(biāo)鍵,則此按鈕前出現(xiàn)空格。 如果按鈕前有空格而按鈕后沒有空格,拖動該按鈕向左移動并當(dāng)按鈕的左邊界接觸到前面按鈕時(shí),釋放鼠標(biāo)鍵,則此按鈕后將出現(xiàn)空格。 如果按鈕前后均有空格,拖動該按鈕向右移動并當(dāng)接觸到相鄰按鈕時(shí),則此按鈕前的空格保留,按鈕后的空格消失。相反,拖動該按鈕向左移動并當(dāng)接觸到前一個(gè)相鄰按鈕時(shí),則此按鈕前面的空格消失,后面的空格保留。第23頁/共50頁使用工具欄編輯器 工具欄按鈕的一般操作進(jìn)行說明 (5) 工具欄按鈕屬性的設(shè)置。雙擊某按鈕彈出其屬性
23、對話框,如圖5.15所示。屬 性對話框中的各項(xiàng)說明見表5.5。圖5.15 工具欄按鈕屬性對話框表5.5 工具欄按鈕屬性對話框的各項(xiàng)含義第24頁/共50頁使用工具欄編輯器 工具欄按鈕的一般操作進(jìn)行說明 (6) 工具欄和菜單相結(jié)合。工具欄和菜單相結(jié)合是指當(dāng)選擇工具按鈕或菜單命令 時(shí),操作結(jié)果是一樣的。使它們結(jié)合的具體方法是在工具按鈕的屬性對話框中將 按鈕的ID標(biāo)識符設(shè)置為相關(guān)聯(lián)的菜單項(xiàng)ID。需要說明的是,對于單獨(dú)工具按鈕命 令消息的映射方法跟菜單命令是一樣的。第25頁/共50頁多個(gè)工具欄的使用 例Ex_SDI 使用多個(gè)工具欄 1) 添加并更改應(yīng)用程序菜單 (1) 創(chuàng)建一個(gè)默認(rèn)的單文檔應(yīng)用程序Ex_
24、SDI。 (2) 按快捷鍵Ctrl+R,彈出“插入資源”對話框,在資源類型中選定“Menu”,如圖 5.16。圖5.16 “插入資源”對話框第26頁/共50頁例Ex_SDI 1) 添加并更改應(yīng)用程序菜單 (3) 單擊新建按鈕,系統(tǒng)就會為應(yīng)用程序添加一個(gè)新的菜單資源,并自動賦給它 一個(gè)默認(rèn)的標(biāo)識符名稱(第一次為IDR_MENU1,以后依次為IDR_MENU2、IDR_ MENU3、.),同時(shí)自動打開這個(gè)新的菜單資源,如圖5.17所示。 菜單空位置 菜單默認(rèn)ID圖5.17 添加菜單資源后的開發(fā)環(huán)境第27頁/共50頁例Ex_SDI 1) 添加并更改應(yīng)用程序菜單 (4) 在Menu資源的ID_MENU
25、1上右擊鼠標(biāo),從彈出的快捷菜單中選擇 “Properties”命令,出現(xiàn)如圖5.18所示的菜單屬性對話框,在這里可以重新指定菜 單資源ID,設(shè)置菜單資源的語言和條件,這個(gè)條件用來決定菜單資源包含到哪個(gè) 環(huán)境中,例如當(dāng)指定條件為_DEBUG,則菜單資源只存在于Debug編譯環(huán)境中。圖5.18 菜單屬性對話框第28頁/共50頁例Ex_SDI 1) 添加并更改應(yīng)用程序菜單 (5) 為菜單ID_MENU1添加一個(gè)頂層彈出菜單項(xiàng)“測試(&T)”,并在該菜單下添加一 個(gè)子菜單項(xiàng)“返回(&R)”,ID設(shè)為ID_TEST_RETURN,如圖5.19所示。需要再次 強(qiáng)調(diào)的是,符號&用來指
26、定后面的字符是一個(gè)助記符。 (6) 打開Ex_SDI程序菜單資源IDR_MAINFRAME,在“查看”菜單的最后添加一個(gè) 子菜單項(xiàng)“顯示測試菜單(&M)”,ID設(shè)為ID_VIEW_TEST。圖5.19 設(shè)計(jì)新的菜單資源第29頁/共50頁例Ex_SDI 1) 添加并更改應(yīng)用程序菜單 (7) 為CMainFrame類添加一個(gè)CMenu類型的成員變量m_NewMenu。如下面的 代碼: class CMainFrame : public CFrameWnd / Attributes public:CMenu m_NewMenu; (8) 按快捷鍵Ctrl+W打開MFC ClassWizard
27、對話框,切換到Message Maps頁 面,從“Class name”列表中選擇CMainFrame,分別為菜單項(xiàng)ID_VIEW_TEST和 ID_TEST_RETURN添加COMMAND消息映射,使用默認(rèn)的消息映射函數(shù)名,并 添中下列代碼:第30頁/共50頁例Ex_SDI (8)添中下列代碼: void CMainFrame:OnViewTest() m_NewMenu.Detach();/ 使菜單對象和菜單句柄分離m_NewMenu.LoadMenu( IDR_MENU1 ); SetMenu(NULL); / 清除應(yīng)用程序菜單SetMenu( &m_NewMenu ); / 設(shè)
28、置應(yīng)用程序菜單 void CMainFrame:OnTestReturn() m_NewMenu.Detach();m_NewMenu.LoadMenu( IDR_MAINFRAME );SetMenu(NULL);SetMenu( &m_NewMenu ); 代碼中,LoadMenu和Detach都是CMenu類成員函數(shù),LoadMenu用來裝載菜單資源,而 Detach是使菜單對象與菜單句柄分離。在調(diào)用LoadMenu后,菜單對象m_NewMenu就擁 有一個(gè)菜單句柄,當(dāng)再次調(diào)用LoadMenu時(shí),由于菜單對象的句柄已經(jīng)創(chuàng)建,因而會發(fā)生 運(yùn)行時(shí)錯誤,但當(dāng)菜單對象與菜單句柄分離后,就
29、可以再次創(chuàng)建菜單了。SetMenu是 CWnd類的一個(gè)成員函數(shù),用來設(shè)置應(yīng)用程序的菜單。 (9) 第一次編譯運(yùn)行并測試。第31頁/共50頁例Ex_SDI 2. 添加并設(shè)計(jì)工具欄按鈕 (1) 在項(xiàng)目工作區(qū)的ResourceView頁面中,展開Toolbar(工具欄)資源,雙擊雙擊 “Toolbar”項(xiàng)中的IDR_MAINFRAME,顯示工具欄編輯器。 (2)利用工具欄編輯器設(shè)計(jì)兩個(gè)工具按鈕,其位置和內(nèi)容如圖5.20所示。 (3)雙擊剛才設(shè)計(jì)的第一個(gè)工具按鈕,彈出該工具按鈕的屬性對話框,將該工具 按鈕的ID號設(shè)為ID_TEST_RETURN,在提示框內(nèi)鍵入“返回應(yīng)用程序主菜單n返 回主菜單”。圖5
30、.20 設(shè)計(jì)的兩個(gè)工具欄按鈕第32頁/共50頁例Ex_SDI 2. 添加并設(shè)計(jì)工具欄按鈕 (4)雙擊剛才設(shè)計(jì)的第二個(gè)工具按鈕,彈出該工具按鈕的屬性對話框,將該工具 按鈕的ID號設(shè)為ID_VEW_TEST,在提示框內(nèi)鍵入“顯示測試菜單n顯示測試菜 單”。 (5) 第二次編譯運(yùn)行并測試。當(dāng)程序運(yùn)行后,將鼠標(biāo)移至剛才設(shè)計(jì)的第一個(gè)工具 按鈕處,這時(shí)在狀態(tài)欄上顯示出“返回應(yīng)用程序主菜單”信息,若稍等片刻后,還 會彈出提示小窗口,顯示出“返回主菜單”字樣,如圖5.21所示。單擊新添加的這 兩個(gè)按鈕,會執(zhí)行相應(yīng)的菜單命令。圖5.21 工具按鈕提示第33頁/共50頁例Ex_SDI 3. 添加工具欄 (1) 在
31、項(xiàng)目工作區(qū)切的ResourceView頁面中,展開Toolbar(工具欄)資源,用鼠標(biāo) 單擊IDR_MAINFRAME不松開,然后按下Ctrl鍵,移動鼠標(biāo)將IDR_MAINFRAME 拖到Toolbar資源名稱上,這樣就復(fù)制了工具欄默認(rèn)資源IDR_MAINFRAME,復(fù) 制后的資源標(biāo)識系統(tǒng)自動設(shè)為IDR_MAINFRAME1。 (2) 右擊工具欄資源IDR_MAINFRAME1,從彈出的快捷菜單中選擇Properties命 令,如圖5.22所示,將ID設(shè)為IDR_TOOLBAR1。 (3) 雙擊IDR_TOOLBAR1,打開工具欄資源,按圖5.23刪除不要的工具按鈕。圖5.22 工具欄屬性對話
32、框圖5.23 刪除不要的工具按鈕(4)在CMainFrame類中添加一個(gè)成員變量m_wndTestBar,變量類型為CToolBar。CToolBar類封裝了工具欄的操作。第34頁/共50頁例Ex_SDI3. 添加工具欄(5) 在CMainFrame:OnCreate函數(shù)中添加下面的工具欄創(chuàng)建代碼:int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)if (CFrameWnd:OnCreate(lpCreateStruct) = -1)return -1;int nRes = m_wndTestBar.CreateEx(this, TBS
33、TYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC,CRect(0,0,0,0),AFX_IDW_TOOLBAR + 10);if (!nRes | !m_wndTestBar.LoadToolBar(IDR_TOOLBAR1) TRACE0(Failed to create toolbarn);return -1; / fail to create m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY
34、);m_wndTestBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar);DockControlBar(&m_wndTestBar); return 0;第35頁/共50頁例Ex_SDI 4. 完善程序代碼 (1) 事實(shí)上這不是本例要的結(jié)果。還需調(diào)用CFrameWnd類的成員函數(shù) ShowControlBar來使程序一開始運(yùn)行時(shí)隱藏工具欄IDR_TOOLBAR1。 (2) 在CMainFrame:OnCreate函數(shù)中添加下列代碼: int C
35、MainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) ShowControlBar( &m_wndTestBar, FALSE, FALSE ); / 關(guān)閉測試工具欄return 0; 代碼中,ShowControlBa函數(shù)有三個(gè)參數(shù),第一個(gè)參數(shù)用來指定要操作的工具欄 或狀態(tài)欄指針,第二個(gè)參數(shù)是一個(gè)布爾型,當(dāng)為TRUE時(shí)表示顯示,否則表示隱 藏,第三個(gè)參數(shù)用來表示是否延遲顯示或隱藏,當(dāng)為FALSE時(shí)表示立即顯示或隱 藏。第36頁/共50頁例Ex_SDI 4. 完善程序代碼 (3) 在CMainFrame:OnViewTest和CMainFr
36、ame:OnTestReturn函數(shù)中添加下列 代碼: void CMainFrame:OnViewTest() ShowControlBar( &m_wndTestBar, TRUE, FALSE ); / 顯示測試工具欄ShowControlBar( &m_wndToolBar, FALSE, FALSE ); / 關(guān)閉主工具欄 void CMainFrame:OnTestReturn() ShowControlBar( &m_wndTestBar, FALSE, FALSE ); / 關(guān)閉測試工具欄ShowControlBar( &m_wndToolBar
37、, TRUE, FALSE ); / 顯示主工具欄 第37頁/共50頁例Ex_SDI 4. 完善程序代碼 (4) 編譯運(yùn)行并測試,結(jié)果如圖5.25所示,左邊是一開始運(yùn)行的結(jié)果,右邊是單擊工具按鈕 運(yùn)行的結(jié)果。圖5.25 Ex_SDI最后運(yùn)行結(jié)果第38頁/共50頁5.3 狀態(tài)欄 狀態(tài)欄是一條水平長條,位于應(yīng)用程序的主窗口的底部。它可以分割成幾個(gè)窗 格,用來顯示多組信息。 狀態(tài)欄的定義 用MFC AppWizard創(chuàng)建的單文檔或多文檔應(yīng)用程序框架中,有一個(gè)靜態(tài)的 indicators數(shù)組,它是在MainFrm.cpp文件中定義的,被MFC用作狀態(tài)欄的定義。 圖5.26列出了indicators數(shù)組
38、元素與標(biāo)準(zhǔn)狀態(tài)欄窗格的關(guān)系。圖5.26 indicators數(shù)組的定義第39頁/共50頁狀態(tài)欄的常用操作 Visual C+ 6.0中可以方便地對狀態(tài)欄進(jìn)行操作,如增減窗格、在狀態(tài)欄中顯示 文本、改變狀態(tài)欄的風(fēng)格和大小等,并且MFC的CStatusBar類封裝了狀態(tài)欄的 大部分操作。 1. 增加和減少窗格 狀態(tài)欄中的窗格可以分為信息行窗格和指示器窗格兩類。若在狀態(tài)欄中增加一個(gè) 信息行窗格,則只需在indicators數(shù)組中的適當(dāng)位置中增加一個(gè)ID_SEPARATOR 標(biāo)識即可;若在狀態(tài)欄中增加一個(gè)用戶指示器窗格,則在indicators數(shù)組中的適 當(dāng)位置增加一個(gè)在字符串表中定義過的資源ID,其
39、字符串的長度表示用戶指示器 窗格的大小。若狀態(tài)欄減少一個(gè)窗格,其操作與增加相類似,只需減少 indicators數(shù)組元素即可。第40頁/共50頁狀態(tài)欄的常用操作 2. 在狀態(tài)欄上顯示文本 有3種辦法可以在狀態(tài)欄窗格顯示文本信息: (1) 調(diào)用CWnd:SetWindowText更新信息行窗格(或窗格0)中的文本。由于狀態(tài)欄 也是一種窗口,故在使用時(shí)可直接調(diào)用。若狀態(tài)欄變量為m_wndStatusBar,則 m_wndStatusBar. SetWindowText(“消息”)語句將在信息行窗格(或窗格0)內(nèi)顯示 “消息”字樣。 (2) 手動處理狀態(tài)欄的ON_UPDATE_COMMAND_UI更
40、新消息,并在處理函數(shù)中 調(diào)用CCmdUI:SetText函數(shù)。 (3) 調(diào)用CStatusBar:SetPaneText函數(shù)更新任何窗格(包括信息行窗格)中的文 本。此函數(shù)原型描述如下: BOOL SetPaneText( int nIndex, LPCTSTR lpszNewText, BOOL bUpdate = TRUE ); 其中,lpszNewText表示要顯示的字符串。nIndex是表示設(shè)置的窗格索引(第一個(gè) 窗格的索引為0)。若bUpdate為TRUE,則系統(tǒng)自動更新顯示的結(jié)果。 值得注意的是,在使用第2種方法時(shí),應(yīng)按一定的步驟進(jìn)行。例如下面的示例過 程是在狀態(tài)欄的最右邊兩個(gè)窗格
41、中顯示出當(dāng)前鼠標(biāo)在窗口客戶區(qū)的位置。第41頁/共50頁狀態(tài)欄的常用操作 例Ex_SDIMouse 將鼠標(biāo)在窗口客戶區(qū)的位置顯示在狀態(tài)欄上 (1) 創(chuàng)建一個(gè)默認(rèn)的單文檔應(yīng)用程序Ex_SDIMouse。 (2) 將項(xiàng)目工作區(qū)切換到ClassView頁面,展開CMainFrame所有項(xiàng),雙擊構(gòu)造函 數(shù)CMainFrame,在文檔窗口中出現(xiàn)該函數(shù)的定義,在它的前面就是狀態(tài)欄數(shù)組 的定義。 (3) 將狀態(tài)欄indicators數(shù)組的定義改為下列代碼: static UINT indicators = ID_SEPARATOR, ID_SEPARATOR, ;第42頁/共50頁例Ex_SDIMouse (
42、4) 由于鼠標(biāo)移動消息WM_MOUSEMOVE在CMainFrame類映射后不起作用,因此只能映 射到CEx_SDIMouseView類中。但是,這樣一來,就需要更多的代碼,因?yàn)闋顟B(tài)欄對象 m_wndStatusBar是在CMainFrame類定義的成員變量,因而需要在CEx_SDIMouseView 類中添加訪問CMainFrame類的代碼。CEx_SDIMouseView:OnMouseMove函數(shù)代碼如下: void CEx_SDIMouseView:OnMouseMove(UINT nFlags, CPoint point) CString str;CMainFrame* pFrame
43、=(CMainFrame*)AfxGetApp()-m_pMainWnd; / 獲得主窗口指針CStatusBar* pStatus=&pFrame-m_wndStatusBar; / 獲得主窗口中的狀態(tài)欄指針if (pStatus) str.Format(X=%d, Y=%d,point.x, point.y);/ 格式化文本pStatus-SetPaneText(1,str);/ 更新第二個(gè)窗格的文本CView:OnMouseMove(nFlags, point); 第43頁/共50頁例Ex_SDIMouse (5) 將MainFrm.h文件中的受保護(hù)變量m_wndStatusBa
44、r變成公共變量。 (6) 在Ex_SDIMouseView.cpp文件的開始處增加下列語句: #include Ex_SDIMouseView.h #include MainFrm.h (7) 編譯并運(yùn)行,結(jié)果如圖5.27所示。圖5.27 鼠標(biāo)的位置顯示在狀態(tài)欄上第44頁/共50頁狀態(tài)欄的常用操作 3. 改變狀態(tài)欄的風(fēng)格 在MFC的CStatusBar類中,有兩個(gè)成員函數(shù)可以改變狀態(tài)欄風(fēng)格,它們是: void SetPaneInfo( int nIndex, UINT nID, UINT nStyle, int cxWidth ); void SetPaneStyle( int nIndex,
45、 UINT nStyle ); 其中,參數(shù)nIndex表示要設(shè)置的狀態(tài)欄窗格的索引,nID用來為狀態(tài)欄窗格指定 新的ID,cxWidth表示窗格的像素寬度,nStyle表示窗格的風(fēng)格類型,用來指定 窗格的外觀,例如SBPS_POPOUT表示窗格是凸起來的,具體見表5.6。表5.6 狀態(tài)欄窗格的風(fēng)格類型第45頁/共50頁5.4 交互對象的動態(tài)更新 例Ex_Update 交互對象的動態(tài)更新 (1) 創(chuàng)建一個(gè)默認(rèn)的單文檔應(yīng)用程序Ex_Update。 (2) 將項(xiàng)目工作區(qū)窗口切換到ResourceView頁面,展開Toolbar資源節(jié)點(diǎn)。 (3) 選中Toolbar資源IDR_MAINFRAME,然后按下Ctrl鍵不放,移動鼠標(biāo)將 IDR_MAIN- FRAME拖到Toolbar資源名稱上,這樣就復(fù)制了工具欄默認(rèn)資源 IDR_MAINFRAME,復(fù)制后的資源標(biāo)識系統(tǒng)自動設(shè)為IDR_MAINFRAME1。 (4) 右擊IDR_MAINFRAME1,從彈出的快捷菜單中選擇Properties命令,在彈出 的屬性對話框中將ID改為IDR_NEWBAR。 (5) 將IDR_NEWBAR工具按鈕刪除幾個(gè)以與I
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 環(huán)保產(chǎn)業(yè)三方施工合同
- 2025版瓷磚品牌年度購銷及品牌推廣合同3篇
- 圖書館防火門工程合同
- 城市水電站擴(kuò)建項(xiàng)目施工合同
- 2024年現(xiàn)代農(nóng)業(yè)示范園:大棚設(shè)計(jì)與施工合同
- 航空維修人員技能培訓(xùn)
- 廣告公司門頭房租賃合同
- 學(xué)校電工招聘協(xié)議范文
- 遵守新法提升招投標(biāo)項(xiàng)目質(zhì)量
- 2024年跨境電商服務(wù)平臺建設(shè)合同標(biāo)的與服務(wù)內(nèi)容
- 《網(wǎng)吧證件轉(zhuǎn)讓協(xié)議推薦》
- 重慶氣體行業(yè)協(xié)會
- 公司走賬合同范本
- 獲獎一等獎QC課題PPT課件
- 企業(yè)中高層人員安全管理培訓(xùn)--責(zé)任、案例、管理重點(diǎn)
- 人教版小學(xué)三年級數(shù)學(xué)上冊判斷題(共3頁)
- 小學(xué)五年級思政課教案三篇
- 高強(qiáng)螺栓施工記錄
- 一億以內(nèi)的質(zhì)數(shù)表(一)
- (完整版)倒插、翻口、評點(diǎn)文件
- 病理生理學(xué)缺氧
評論
0/150
提交評論