第9章菜單、工具欄和狀態(tài)欄_第1頁
第9章菜單、工具欄和狀態(tài)欄_第2頁
第9章菜單、工具欄和狀態(tài)欄_第3頁
第9章菜單、工具欄和狀態(tài)欄_第4頁
第9章菜單、工具欄和狀態(tài)欄_第5頁
已閱讀5頁,還剩84頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第9章 菜單、工具欄和狀態(tài)欄設(shè)計(jì)菜單、工具欄和狀態(tài)欄是Windows應(yīng)用程序中常見的界面元素。Visual C+ 6.0支持各種界面元素的創(chuàng)建,這樣使得應(yīng)用程序的界面更加美觀、實(shí)用。學(xué)習(xí)本章,讀者可以掌握利用Visual C+ 6.0創(chuàng)建菜單、工具欄和狀態(tài)欄的基本過程,掌握其使用方法。9.1 概 述在Windows應(yīng)用程序中,菜單欄、工具欄和狀態(tài)欄是經(jīng)常使用的界面元素。在Windows應(yīng)用程序中使用菜單欄、工具欄和狀態(tài)欄可以使得應(yīng)用程序的界面更加美觀,同時(shí)用戶可以方便地通過菜單欄、工具欄和狀態(tài)欄與應(yīng)用程序進(jìn)行交互。菜單欄是大部分Windows應(yīng)用程序的組成部分,它提供了應(yīng)用程序和用戶進(jìn)行交互的

2、工具,同時(shí)它明確指出用戶可以進(jìn)行的操作,并且對(duì)操作進(jìn)行分類。在前面文檔/視圖應(yīng)用程序中,創(chuàng)建單文檔或者多文檔應(yīng)用程序時(shí)向?qū)?huì)自動(dòng)生成一個(gè)菜單欄。它提供了一般應(yīng)用程序所擁有的菜單命令。工具欄和狀態(tài)欄是一個(gè)完善的Windows應(yīng)用程序的重要組成部分。工具欄一般位于主框架窗口的上部,上面有一些圖形按鈕。當(dāng)用戶用鼠標(biāo)在某一按鈕上單擊時(shí),程序就會(huì)執(zhí)行相應(yīng)的命令;當(dāng)鼠標(biāo)在按鈕上停留片刻后,就會(huì)彈出一個(gè)小窗口并顯示工具提示。按鈕的圖形是它所代表功能的形象表示,人們對(duì)于形象圖形的辨別速度要快于抽象文字,因此工具條提供了一種比菜單更快捷的用戶接口。在一個(gè)標(biāo)準(zhǔn)的Windows應(yīng)用程序中,工具條的大部分按鈕執(zhí)行的命

3、令與菜單命令相同,這樣做的目的是能同時(shí)提供形象和抽象的用戶接口,以方便用戶的使用。狀態(tài)欄位于主框架窗口的底部,主要用來顯示一些提示信息,可細(xì)分為幾個(gè)窗格。狀態(tài)欄的主要功能是簡(jiǎn)要解釋被選中的菜單、命令或工具條、按鈕、命令,有時(shí)狀態(tài)欄還會(huì)顯示鍵盤上某些特定鍵的狀態(tài)。例如:顯示Caps Lock鍵、Num Lock鍵的狀態(tài)。在一般應(yīng)用程序中菜單欄、工具欄和狀態(tài)欄的位置是固定的,如圖9.1所示。菜單欄、工具欄和狀態(tài)欄是一個(gè)Windows應(yīng)用程序中最為常用的界面元素。它不僅使應(yīng)用程序的界面更加美觀,同時(shí)可以提供方便的操作。9.2 菜 單在利用Visual C+的應(yīng)用程序向?qū)蓡挝臋n或者多文檔應(yīng)用程序時(shí)

4、,向?qū)?huì)自動(dòng)生成一個(gè)Windows應(yīng)用程序常見的菜單欄,它提供了Windows應(yīng)用程序常見的命令。在實(shí)際的應(yīng)用中有時(shí)需要對(duì)菜單進(jìn)行重新設(shè)計(jì),利用Visual C+的資源編輯工具可以方便地設(shè)計(jì)菜單資源。本節(jié)介紹菜單資源的創(chuàng)建與使用。圖9.1 菜單欄、工具欄和狀態(tài)欄9.2.1 創(chuàng)建菜單在Visual C+ 6.0的資源編輯工具中可以方便地創(chuàng)建菜單資源。在Windows應(yīng)用程序中,菜單通常有3類,系統(tǒng)菜單、程序主菜單和快捷菜單。系統(tǒng)菜單提供了系統(tǒng)對(duì)應(yīng)用程序主窗口的管理功能,單擊程序窗口左上角的標(biāo)題前的圖標(biāo)時(shí)就會(huì)彈出系統(tǒng)菜單,如圖9.2所示。由于程序中一般不需要對(duì)系統(tǒng)菜單進(jìn)行修改,因此在此不再介紹。圖

5、9.2 系統(tǒng)菜單說明:系統(tǒng)菜單是由應(yīng)用程序自動(dòng)生成的,用戶不需要做任何改變,也不需要對(duì)其菜單命令進(jìn)行消息映射。程序菜單通常位于應(yīng)用程序的最頂端,它包含了應(yīng)用程序的大部分功能。在MFC的文檔/視圖應(yīng)用程序中,向?qū)?huì)自動(dòng)創(chuàng)建應(yīng)用程序主菜單,但是它只是生成了默認(rèn)的菜單項(xiàng),在實(shí)際中需要根據(jù)實(shí)際需要進(jìn)行修改或者添加菜單項(xiàng)。下面結(jié)合實(shí)例介紹在Visual C+ 6.0中創(chuàng)建菜單資源的方法?!臼纠?.1】 在單文檔應(yīng)用程序中添加新的菜單項(xiàng)。操作步驟如下所述。(1)創(chuàng)建一個(gè)基于單文檔的應(yīng)用程序。(2)單擊項(xiàng)目工作區(qū)的“Resource View”面板,展開面板里面的內(nèi)容。單擊Menu前面的加號(hào)圖標(biāo),雙擊其選項(xiàng)

6、,在代碼編輯區(qū)彈出向?qū)?chuàng)建的菜單資源。(3)右擊菜單資源右邊的空白項(xiàng),在彈出的快捷菜單中選擇Properties命令,彈出Menu Item Properties對(duì)話框,如圖9.3所示。在該對(duì)話框中可以對(duì)菜單資源的樣式等進(jìn)行設(shè)計(jì),下面介紹其屬性的具體含義。圖9.3 Menu Item Properties對(duì)話框Separator:表示該菜單項(xiàng)是一個(gè)分割線。Pop Up:表示該菜單項(xiàng)是彈出式菜單,如果是主菜單,那么其有下拉菜單。如果是下拉菜單,那么有向左彈出的菜單。這種菜單一般不具有具體的操作,它只是負(fù)責(zé)對(duì)菜單進(jìn)行分類。Inactive:表示該菜單項(xiàng)是否被激活,選中該選項(xiàng)表示菜單不可用。Chec

7、ked:表示菜單是否被選中,選中時(shí)會(huì)在左側(cè)出現(xiàn)一個(gè)“”。Grayed:表示菜單是否被禁止使用,禁止使用時(shí)字體顏色為灰色。Prompt:表示鼠標(biāo)滑動(dòng)到菜單項(xiàng),是否顯示提示內(nèi)容,提示內(nèi)容在文本框中輸入。(4)設(shè)置菜單“下拉菜單選項(xiàng)1”的“Pop Up”按鈕,此時(shí)它是一個(gè)子菜單,即本身不提供操作,擁有向右彈出的菜單。設(shè)計(jì)兩個(gè)菜單“具體操作菜單”和“具體操作2”。并且為“具體操作2”設(shè)計(jì)一個(gè)提示字符串:“這是具體操作2”。(5)在“主菜單”下設(shè)計(jì)另一個(gè)菜單命令“下拉菜單2”,取消其“Pop Up”按鈕,即本身提供一個(gè)菜單命令。(6)編譯、連接,運(yùn)行結(jié)果如圖9.4所示。圖9.4 菜單設(shè)計(jì)上面的例子雖然設(shè)

8、計(jì)了菜單,但是可以看到運(yùn)行時(shí)具體的菜單命令是灰色的。這是因?yàn)閼?yīng)用程序沒有對(duì)菜單命令進(jìn)行任何響應(yīng),即此時(shí)菜單是沒有用處的。在9.2.2節(jié)將會(huì)利用類向?qū)砑硬藛蔚捻憫?yīng)命令,即使得菜單可用。說明:設(shè)計(jì)菜單時(shí),如果需要添加菜單項(xiàng),只要在已設(shè)計(jì)的菜單項(xiàng)下一個(gè)空白菜單中右擊就可以進(jìn)行設(shè)計(jì)。9.2.2 響應(yīng)菜單項(xiàng)命令前面介紹了在Visual C+ 6.0的資源編輯器中設(shè)計(jì)菜單資源的一般方法。但是程序運(yùn)行時(shí),菜單選項(xiàng)都是灰色的,這是因?yàn)閷?duì)菜單命令沒有進(jìn)行映射,即菜單只是一個(gè)擺設(shè),還沒有具體功能。下面介紹菜單的命令處理,在類向?qū)е校琈FC封裝了對(duì)菜單項(xiàng)的兩類消息映射,一是COMMAND消息,另一個(gè)是UPDATE

9、_COMMAND_UI消息,下面分別進(jìn)行介紹。1COMMAND消息的響應(yīng)COMMAND消息是在用戶單擊菜單項(xiàng)時(shí)產(chǎn)生的消息。因此如果需要對(duì)用戶單擊菜單命令時(shí)進(jìn)行響應(yīng),只需要添加COMMAND的消息響應(yīng)函數(shù)就可以了。在前面程序的基礎(chǔ)上對(duì)前面的“下拉菜單2”進(jìn)行單擊響應(yīng),只需要進(jìn)行如下步驟。(1)選擇View|ClassWizard命令,彈出MFC ClassWizard對(duì)話框。選擇Message Maps標(biāo)簽,在Object Ids列表框中選擇ID_MENU2,即是下拉菜單2 的ID。(2)選擇Message列表框的COMMAND選項(xiàng),單擊Add Function按鈕,即添加了COMMAND的消息

10、映射。如圖9.5所示。圖9.5 添加消息映射(3)編寫消息映射函數(shù)的函數(shù)體,代碼如下:01void CMainFrame:OnMenu2() 0203/ TODO: Add your command handler code here04AfxMessageBox(單擊了下拉菜單2命令);/彈出消息框05其功能是彈出一個(gè)消息框,提示用戶單擊了菜單。(4)編譯、鏈接,運(yùn)行程序,選擇“主菜單”|“下拉菜單2”命令,結(jié)果如圖9.6所示。可見上面代碼響應(yīng)的單擊菜單命令的消息,彈出了一個(gè)對(duì)話框。2UPDATE_COMMAND_UI消息的響應(yīng)UPDATE_COMMAND_UI消息是在窗口繪制菜單項(xiàng)時(shí)產(chǎn)生的

11、消息。有時(shí)需要對(duì)菜單項(xiàng)的狀態(tài)或者屬性進(jìn)行設(shè)置,那么就可以利用UPDATE_COMMAND_UI消息進(jìn)行處理。圖9.6 運(yùn)行結(jié)果例如可以設(shè)置菜單是否可用,菜單前面是否加上“”號(hào),表示選中,表示選中的狀態(tài)經(jīng)常和單擊菜單結(jié)合起來。因此如果需要對(duì)用戶選擇菜單命令時(shí)對(duì)菜單狀態(tài)進(jìn)行處理,只需要添加UPDATE_COMMAND_UI的消息響應(yīng)函數(shù)就可以了。仍然在前面程序的基礎(chǔ)上添加“主菜單”|“下拉菜單2”的UPDATE_COMMAND_UI消息。即需要對(duì)前面的“下拉菜單2”進(jìn)行單擊時(shí)的狀態(tài)設(shè)置,即添加“”,只需要進(jìn)行如下步驟。(1)選擇View|ClassWizard命令,彈出MFC ClassWizar

12、d對(duì)話框。選擇Message Maps標(biāo)簽,在Object Ids列表框中選擇ID_MENU2,即是下拉菜單2 的ID。(2)選擇Message列表框的UPDATE_COMMAND_UI選項(xiàng),單擊Add Function按鈕,即添加了UPDATE_COMMAND_UI的消息映射。(3)在消息響應(yīng)這種編寫函數(shù)體,代碼如下:01void CMainFrame:OnUpdateMenu2(CCmdUI* pCmdUI) 0203/ TODO: Add your command update UI handler code here04pCmdUI-SetCheck(flag);/設(shè)置狀態(tài)05需要注意

13、的是flag變量是在類中添加的一個(gè)BOOL成員,并且初始化為false。因?yàn)榇藭r(shí)需要在單擊時(shí)添加“”,再次單擊去掉“”,所以在上面單擊的消息響應(yīng)函數(shù)中添加下面一條語句:flag=!flag;通過上面的處理,當(dāng)選擇菜單命令時(shí),會(huì)在前面出現(xiàn)“”,再次單擊,“”去掉。類CCmdUI常用的函數(shù)有下面幾個(gè)。SetCheck():設(shè)置菜單前面的“”。Enable():設(shè)置菜單是否可用。SetRadio():設(shè)置菜單前面的“”,和SetCheck()相似。SetText():設(shè)置菜單的字符串。在UPDATE_COMMAND_UI消息中可以方便地利用上面的函數(shù)對(duì)菜單進(jìn)行處理,設(shè)置菜單的狀態(tài)等。(4)編譯、連接

14、,運(yùn)行結(jié)果如圖9.7所示。首先選擇“主菜單”|“下拉菜單2”命令,此時(shí)彈出一個(gè)消息框。單擊“確定”按鈕后,再次單擊主菜單可以看到,其下面的子菜單上的“下拉菜單2”命令前面添加了一個(gè)“”。圖9.7 運(yùn)行結(jié)果說明:一般情況下SetCheck()和SetRadio()函數(shù)是用來表明菜單的一種狀態(tài),使得用戶可以方面地查看當(dāng)前的狀態(tài)。9.2.3 菜單類概覽在MFC中,類CMenu對(duì)菜單進(jìn)行了封裝,CMenu類是由CObject類直接派生出來的類。它封裝了菜單的基本操作,其中常見的成員如表9.1所示。表9.1 CMenu的成員上面的函數(shù)是對(duì)菜單的處理函數(shù)。在實(shí)際應(yīng)用中,有時(shí)需要添加快捷菜單或者其他情況,這

15、時(shí)需要利用上面的函數(shù)對(duì)菜單進(jìn)行處理,具體實(shí)例參見9.2.4節(jié)。函函 數(shù)數(shù)說說 明明BOOL Attach( HMENU hMenu );得到得到Windows標(biāo)準(zhǔn)菜單句柄標(biāo)準(zhǔn)菜單句柄HMENU GetSafeHmenu() const;獲得菜單的句柄獲得菜單的句柄BOOL CreateMenu();創(chuàng)建一個(gè)菜單創(chuàng)建一個(gè)菜單BOOL CreatePopupMenu();創(chuàng)建一個(gè)彈出式菜單創(chuàng)建一個(gè)彈出式菜單BOOL LoadMenu( LPCTSTR lpszResourceName );BOOL LoadMenu( UINT nIDResource );加載菜單資源加載菜單資源BOOL Dest

16、royMenu();釋放菜單釋放菜單BOOL AppendMenu ( UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );添加新項(xiàng)添加新項(xiàng)UINT EnableMenuItem ( UINT nIDEnableItem, UINT nEnable );激活或禁止菜單項(xiàng)激活或禁止菜單項(xiàng)UINT GetMenuItemCount() const;獲取菜單項(xiàng)數(shù)獲取菜單項(xiàng)數(shù)UINT GetMenuItemID( int nPos ) const;獲取指定位置的菜單的獲取指定位置的菜單的IDUINT GetMenuState(

17、UINT nID, UINT nFlags ) const;獲取菜單狀態(tài)獲取菜單狀態(tài)int GetMenuString( UINT nIDItem, CString& rString, UINT nFlags ) const;獲取菜單的字符串獲取菜單的字符串BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem, const CB

18、itmap* pBmp );插入菜單插入菜單BOOL ModifyMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );修改菜單修改菜單BOOL RemoveMenu( UINT nPosition, UINT nFlags );刪除菜單刪除菜單9.2.4 彈出式菜單彈出式菜單是在應(yīng)用程序中經(jīng)常用到的一類菜單,又稱為快捷菜單。例如在Word文檔的工作區(qū)里右擊,會(huì)彈出一個(gè)快捷菜單。在應(yīng)用程序中經(jīng)常需要設(shè)計(jì)一個(gè)右擊的快捷菜單。下面結(jié)合實(shí)例進(jìn)行介紹?!臼纠?.2】 在SDI應(yīng)用程序中設(shè)

19、計(jì)一個(gè)右擊的快捷菜單。具體的操作步驟如下所述。(1)創(chuàng)建一個(gè)基于單文檔的應(yīng)用程序。(2)在項(xiàng)目工作區(qū)中,單擊Resource View面板,然后右擊Menu小圖標(biāo),選擇Insert Menu命令,在工作區(qū)彈出新建的菜單資源。設(shè)計(jì)菜單資源如圖9.8所示。圖9.8 設(shè)計(jì)菜單(3)在類CTestView中添加數(shù)據(jù)成員如下:CMenu menu;/定義對(duì)象CMenu *menupop;/定義對(duì)象指針menu是快捷菜單,menupop是子菜單,本例子中menu是顏色,子菜單是下面的幾個(gè)菜單項(xiàng)。在構(gòu)造函數(shù)中添加初始化和釋放菜單的語句如下:01CTestView:CTestView()0203/ TODO:

20、 add construction code here04menu.LoadMenu(IDR_MENU1);/加載菜單資源050607CTestView:CTestView()0809menu.DestroyMenu();/銷毀菜單10(4)向?qū)е刑砑佑覔魰r(shí)的消息響應(yīng)函數(shù)。編寫函數(shù)體,代碼如下:01void CTestView:OnRButtonDown(UINT nFlags, CPoint point) 0203/ TODO: Add your message handler code here and/or call default04menupop=menu.GetSubMenu(0)

21、;/得到子菜單05ClientToScreen(&point);/客戶坐標(biāo)轉(zhuǎn)換為屏幕坐標(biāo)06menupop-TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);07/彈出菜單08CView:OnRButtonDown(nFlags, point);09分析:上面的代碼首先獲得了子菜單,然后進(jìn)行顯示。需要注意的是,中間需要由客戶坐標(biāo)轉(zhuǎn)換為屏幕坐標(biāo),這是因?yàn)樗褂玫膬蓚€(gè)坐標(biāo)系是不相同的,關(guān)于此處將在第10章進(jìn)行介紹。在快捷菜單中,子菜單項(xiàng)的獲取需要利用主菜單的GetSubMenu()函數(shù),這樣在實(shí)際應(yīng)用中就可以根據(jù)需要?jiǎng)討B(tài)地加載某個(gè)子菜單。

22、(5)編譯、連接,運(yùn)行結(jié)果如圖9.9所示。圖9.9 右擊彈出快捷菜單快捷菜單的消息響應(yīng)函數(shù)與程序主菜單的消息響應(yīng)的處理完全一樣,只需要利用類向?qū)?duì)相應(yīng)的菜單添加相應(yīng)的消息映射,然后編寫處理代碼就可以了,在此不再介紹。9.2.5 使用對(duì)話框中的菜單菜單資源不僅僅可以在文檔應(yīng)用程序中使用,在對(duì)話框應(yīng)用程序中同樣可以使用菜單資源。下面結(jié)合實(shí)例,介紹對(duì)話框應(yīng)用程序中菜單資源的使用。【示例9.3】 在對(duì)話框應(yīng)用程序中使用菜單資源實(shí)例。(1)在資源編輯環(huán)境中創(chuàng)建一個(gè)菜單資源。在此不再介紹具體步驟,讀者可參閱前面的敘述。(2)在對(duì)話框資源上右擊,在彈出的快捷菜單中選擇Properties命令,彈出Dialo

23、g Properties對(duì)話框,如圖9.10所示。在Menu下拉列表框中選擇IDR_MENU1選項(xiàng)。圖9.10 Dialog Properties對(duì)話框說明:在Menu下拉列表框中會(huì)列出本工程中所有的菜單資源,如果沒有菜單資源,那么下拉列表框中是空白的。(3)利用上面的步驟,可以將菜單與對(duì)話框綁定在一起。此時(shí)的菜單顯示在對(duì)話框的標(biāo)題欄的下面。利用類向?qū)閱螕舨藛蚊钐砑酉⒂成?。下面僅僅實(shí)驗(yàn)菜單命令的消息映射。實(shí)際應(yīng)用中可以設(shè)計(jì)具體的功能代碼。01void CTestDlg:OnMenu11() 0203/ TODO: Add your command handler code here04A

24、fxMessageBox(單擊主菜單1下的下拉菜單11命令);05flag=!flag;06上面的代碼是響應(yīng)COMMAND消息的消息映射函數(shù)。選擇菜單命令時(shí)彈出一個(gè)消息對(duì)話框。實(shí)際應(yīng)用中可以設(shè)計(jì)相關(guān)的操作。在菜單中還有一個(gè)比較重要的消息UPDATE_COMMAND_UI消息。該消息是在窗口繪制菜單項(xiàng)時(shí)產(chǎn)生的消息。有時(shí)需要對(duì)菜單項(xiàng)的狀態(tài)或者屬性進(jìn)行設(shè)置,那么就可以利用UPDATE_COMMAND_UI消息進(jìn)行處理。但是此時(shí)在對(duì)話框中并不能響應(yīng)這個(gè)消息。對(duì)于基于文檔的應(yīng)用程序,在下拉菜單顯示的時(shí)候,WM_INITMENUPOPUP消息被先發(fā)送以顯示菜單項(xiàng)。MFC CFrameWnd:OnInitM

25、enuPopup()函數(shù)遍歷菜單項(xiàng)并為每個(gè)菜單項(xiàng)調(diào)用更新命令處理函數(shù)。菜單的外觀被更新以反映它的狀態(tài)。而更新用戶界面機(jī)制在基于對(duì)話框的應(yīng)用程序中不能工作,因?yàn)镃Dialog沒有OnInitMenuPopup()處理函數(shù),而使用CWnd的默認(rèn)處理函數(shù),該函數(shù)沒有為菜單項(xiàng)調(diào)用更新命令處理函數(shù)。為了解決整個(gè)問題可以在對(duì)話框應(yīng)用程序中添加WM_INITMENUPOPUP的消息映射。具體步驟如下所述。(4)選擇View|CLassWizard命令,彈出MFC CLassWizard對(duì)話框。選擇Class Info標(biāo)簽,在Message filter下拉列表框中選擇Window,如圖9.11所示。這樣就可

26、以攔截所有的Windows消息。單擊Message Maps標(biāo)簽,添加WM_INITMENUPOPUP的消息映射。圖9.11 MFC CLassWizard對(duì)話框(5)編寫WM_INITMENUPOPUP消息的消息映射函數(shù),實(shí)現(xiàn)對(duì)菜單的更新。在實(shí)際應(yīng)用中并不需要讀者自己編寫此函數(shù),因?yàn)樵谖臋n中對(duì)菜單的更新進(jìn)行了函數(shù)實(shí)現(xiàn)。因此可以直接復(fù)制文檔模型中CFrameWnd:OnInitMenuPopup()函數(shù)的代碼,將其粘貼到void CTestDlg:OnInitMenuPopup()函數(shù)中,函數(shù)代碼如下:分析:上面的代碼實(shí)現(xiàn)了菜單資源的更新操作,并且在MFC中對(duì)這類操作提供了很強(qiáng)的保護(hù)功能。讀者

27、在使用時(shí)可以直接復(fù)制代碼,而不要自己編寫代碼。利用上面的代碼就實(shí)現(xiàn)了菜單的更新操作,此時(shí)菜單就可以響應(yīng)WM_INITMENUPOPUP消息。說明:如果讀者十分清楚添加消息映射的概念,可以手動(dòng)添加消息映射,而不需要利用類向?qū)ヌ砑?。?)利用類向?qū)砑印爸鞑藛?”|“下拉菜單11”的UPDATE_COMMAND_UI的消息映射,編寫代碼如下:01void CTestDlg:OnUpdateMenu11(CCmdUI* pCmdUI) 0203/ TODO: Add your command update UI handler code here04pCmdUI-SetCheck(flag1);/

28、設(shè)置菜單狀態(tài)05上面的代碼實(shí)現(xiàn)了菜單命令的樣式操作,單擊一次后則在菜單前面添加“”,再次單擊“”消失。(7)編譯、連接,運(yùn)行后選擇“主菜單1”|“下拉菜單11”命令,彈出一個(gè)消息框,如圖9.12所示。再次單擊“主菜單”,可以看到其下拉菜單的“下拉菜單11”前面添加了一個(gè)“”,即響應(yīng)了UPDATE_COMMAND_UI消息,如圖9.13所示。圖9.12 單擊菜單命令圖9.13 響應(yīng)UPDATE_COMMAND_UI消息上面介紹了在對(duì)話框中使用菜單資源的基本過程和方法。雖然菜單資源可以方便地顯示在對(duì)話框上,并可以響應(yīng)COMMAND消息。但對(duì)話框并沒有實(shí)現(xiàn)UPDATE_COMMAND_UI消息的處理

29、,因此需要利用WM_INITMENUPOPUP消息實(shí)現(xiàn)對(duì)菜單資源的更新。9.3 工具欄工具欄一般位于主框架窗口的上部,上面有一些圖形按鈕。當(dāng)用戶用鼠標(biāo)在某一按鈕上單擊時(shí),程序就會(huì)執(zhí)行相應(yīng)的命令。按鈕的圖形是它所代表功能的形象表示,人們對(duì)于形象圖形的辨別速度要快于抽象文字,因此工具條提供了一種比菜單更快捷的用戶接口。一般情況下,工具欄提供了常用菜單的功能。9.3.1 創(chuàng)建工具欄在Visual C+的資源編輯環(huán)境中可以方便地對(duì)工具欄進(jìn)行設(shè)計(jì)。在創(chuàng)建基于文檔/視圖的應(yīng)用程序中,向?qū)?huì)自動(dòng)生成一些常用的工具欄,但是有時(shí)這些工具欄并不能滿足要求,需要程序員自己設(shè)計(jì)工具欄資源。一般工具欄的設(shè)計(jì)分為兩類,一

30、是在原有工具欄的基礎(chǔ)上添加工具按鈕。但大部分的情況是程序員新添加一個(gè)工具欄,把新添加的工具欄放在向?qū)ё詣?dòng)生成工具欄的下面,下面對(duì)兩種情況的設(shè)計(jì)分別進(jìn)行介紹。1添加工具欄按鈕要在自動(dòng)生成的工具欄上設(shè)計(jì)工具按鈕,只需要進(jìn)行如下操作:在項(xiàng)目工作區(qū)中,單擊Resource View面板,然后單擊Toolbar圖標(biāo)的加號(hào),在其展開項(xiàng)中雙擊主工具欄的圖標(biāo),在代碼編輯區(qū)彈出工具欄編輯,如圖9.14所示。程序員可以方便地添加或者刪除工具欄按鈕。圖9.14 工具欄設(shè)計(jì)系統(tǒng)自動(dòng)的為新建按鈕指定位置,程序員只要在最后一個(gè)按鈕處雙擊,即彈出Toolbar Button Properties對(duì)話框,如圖9.15所示,只

31、要指定其ID就可以了。由于工具欄按鈕一般是和菜單命令完成相同的功能,因此其ID可以指定為其相應(yīng)菜單的ID號(hào),此時(shí)工具欄按鈕就可以和菜單命令就有相應(yīng)的功能了。同時(shí)可以利用繪圖工具設(shè)計(jì)工具按鈕的形象化圖標(biāo)。圖9.15 Toolbar Button Properties對(duì)話框提示:如果讀者看不到這兩個(gè)面板,可以在Developer Studio的工具條的空白處右擊,并在隨之彈出的快捷菜單中選中Graphics和Colors兩項(xiàng)。2新建工具欄有時(shí)需要設(shè)計(jì)新的工具欄以完成較為復(fù)雜的工具欄按鈕。這時(shí)可以稱之為工具條,它一般完成一類操作。例如Word文檔里面的工具欄包含多個(gè)工具條。在資源編輯環(huán)境中添加工具條

32、的步驟如下所述。在項(xiàng)目工作區(qū)中,單擊Resource View面板,然后右擊“Toolbar”小圖標(biāo),選擇Insert Toolbar命令,在工作區(qū)彈出新建的工具條資源。程序員可以設(shè)計(jì)必要的工具欄按鈕的圖形來說明具體操作的意義。具體的設(shè)計(jì)內(nèi)容在此不再介紹。9.3.2 工具欄相關(guān)類在MFC中,類CToolBar是工具條類,它是從CControlBar類派生出來的,而CControlBar是可以接受命令輸入并向用戶顯示狀態(tài)消息的類,它稱為控制條類。CToolBar封裝了對(duì)工具條的大部分操作,同時(shí)也封裝了對(duì)工具按鈕的操作。工具欄類的常用成員如表9.2所示。表9.2 CToolBar的成員在MFC中利

33、用工具欄控制類來控制工具欄,類CToolBarCtrl封裝了控制工具欄的基本操作,其主要成員如表9.3所示。函函 數(shù)數(shù)說說 明明BOOL Create( CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP, UINT nID = AFX_IDW_TOOLBAR );創(chuàng)建工具條創(chuàng)建工具條void SetSizes( SIZE sizeButton, SIZE sizeImage );設(shè)置按鈕及位圖的大小設(shè)置按鈕及位圖的大小void SetHeight( int cyHeight );設(shè)置工具欄的高度設(shè)置工具欄的高度

34、BOOL LoadToolBar( LPCTSTR lpszResourceName );BOOL LoadToolBar( UINT nIDResource );加載工具欄資源加載工具欄資源BOOL SetBitmap( HBITMAP hbmImageWell );設(shè)置為圖像設(shè)置為圖像BOOL SetButtons( const UINT* lpIDArray, int nIDCount );設(shè)置按鈕,并使按鈕與圖像關(guān)聯(lián)設(shè)置按鈕,并使按鈕與圖像關(guān)聯(lián)void SetButtonStyle( int nIndex, UINT nStyle );設(shè)置按鈕風(fēng)格設(shè)置按鈕風(fēng)格void SetButto

35、nInfo( int nIndex, UINT nID, UINT nStyle, int iImage );設(shè)置按鈕的設(shè)置按鈕的ID、風(fēng)格、圖像號(hào)、風(fēng)格、圖像號(hào)BOOL SetButtonText( int nIndex, LPCTSTR lpszText );設(shè)置按鈕的提示文本設(shè)置按鈕的提示文本表9.3 CToolBarCtrl的成員在應(yīng)用程序中,創(chuàng)建了工具欄資源文件以后,需要調(diào)用相應(yīng)的函數(shù)進(jìn)行顯示,并且設(shè)置其風(fēng)格。函函 數(shù)數(shù)說說 明明BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParent Wnd, UINT nID

36、);創(chuàng)建一個(gè)工具條,需與資源綁定創(chuàng)建一個(gè)工具條,需與資源綁定BOOL SetState( int nID, UINT nState );設(shè)置按鈕的狀態(tài)設(shè)置按鈕的狀態(tài)int AddStrings( LPCTSTR lpszStrings );添加按鈕文字添加按鈕文字BOOL AddButtons( int nNumButtons, LPTBBUTTON lpButtons );添加按鈕添加按鈕BOOL InsertButton( int nIndex, LPTBBUTTON lpButton );插入按鈕插入按鈕void SetStyle( DWORD dwStyle );設(shè)置樣式設(shè)置樣式BOO

37、L SetButtonSize( CSize size );設(shè)置按鈕大小設(shè)置按鈕大小BOOL HideButton( int nID, BOOL bHide = TRUE );隱藏按鈕隱藏按鈕9.3.3 響應(yīng)工具欄的命令通過上面的步驟,可以方便地創(chuàng)建工具欄,然后利用工具欄類和工具欄控制類對(duì)工具欄進(jìn)行顯示,利用工具欄控制類可以進(jìn)一步設(shè)置工具欄的樣式和風(fēng)格等。工具欄的命令一般是單擊響應(yīng),由于工具欄一般是菜單的快捷命令形式,只需要把工具按鈕的ID設(shè)置成相應(yīng)的菜單的ID號(hào)就可以實(shí)現(xiàn)其與菜單一致的消息響應(yīng)。同時(shí)也可以利用類向?qū)砑酉鄳?yīng)的消息響應(yīng)函數(shù),實(shí)現(xiàn)單擊工具欄按鈕的功能。 9.3.4 使用工具欄上面

38、介紹了工具欄的設(shè)計(jì)方法和工具欄及工具欄控制類。下面通過具體實(shí)例講解創(chuàng)建工具欄和工具欄的使用?!臼纠?.4】 在單文檔應(yīng)用程序中添加工具欄,工具欄中放置兩個(gè)按鈕,實(shí)現(xiàn)單擊工具欄按鈕彈出一個(gè)消息框。具體的操作步驟如下所述。(1)創(chuàng)建一個(gè)基于單文檔的應(yīng)用程序Test。(2)利用資源編輯器添加工具欄,并放置按鈕。設(shè)計(jì)的按鈕如圖9.16所示。圖9.16 新建工具條提示:如果覺得按鈕太小,可以用鼠標(biāo)拖動(dòng)圍繞按鈕放大位圖的虛框的右下角,把按鈕放 大些。注意工具條內(nèi)的所有按鈕都將被放大。(3)在CMainFrame類中添加成員CToolBar m_toolbar,在OnCreate()函數(shù)中顯示工具欄,添加代

39、碼如下:0102if (!m_toolbar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE |03 CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | 04CBRS_FLYBY | CBRS_SIZE_DYNAMIC) |05!m_toolbar.LoadToolBar(IDR_TOOLBAR1)/創(chuàng)建工具欄0607TRACE0(Failed to create toolbarn);08return -1; / fail to create09上面的代碼加載了工具欄資源,但此時(shí)顯示是不正常的,需要再添加下面代

40、碼:m_toolbar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_toolbar);這樣可以使工具條在應(yīng)用程序的頂部顯示,此時(shí)可以有多個(gè)工具條。(4)在CMainFrame類中添加變量BOOL cir和BOOL rect,并且進(jìn)行初始化值為false。(5)添加單擊工具欄的消息映射。利用類向?qū)砑庸ぞ邫诎粹o的消息映射。此時(shí)需要在其消息響應(yīng)函數(shù)里處理單擊的標(biāo)志變量,以實(shí)現(xiàn)按鈕按下的狀態(tài)。分析:上面的代碼是根據(jù)當(dāng)前工具欄按鈕的狀態(tài)進(jìn)行消息響應(yīng)。在單擊了按鈕以后,程序會(huì)產(chǎn)生UPD

41、ATE_COMMAND_UI消息??梢栽诖讼⒌南⒂成渲刑幚戆粹o的狀態(tài)。(6)添加UPDATE_COMMAND_UI的消息映射,實(shí)現(xiàn)按鈕狀態(tài)的變化。代碼如下:此時(shí),按鈕狀態(tài)已經(jīng)處理完了,當(dāng)單擊工具欄按鈕時(shí)按鈕呈現(xiàn)按下狀態(tài),再次單擊,按鈕彈起。(7)編譯、連接,運(yùn)行結(jié)果如圖9.17和圖9.18所示。圖9.17 單擊矩形按鈕圖9.18 單擊圓形按鈕上面的代碼是添加了工具欄的例子,在實(shí)際應(yīng)用中,利用工具欄類可以方便地實(shí)現(xiàn)各種功能。同時(shí)工具欄作為一種窗口,可以利用函數(shù)移動(dòng)它在父窗口的位置。實(shí)際應(yīng)用中經(jīng)常利用工具欄按鈕顯示一些常用的命令。實(shí)際上工具欄不僅僅在文檔中使用,而且可以在對(duì)話框等應(yīng)用程序中管理

42、對(duì)話框資源,并進(jìn)行顯示。同時(shí)可以利用工具欄進(jìn)行操作。下面介紹一個(gè)具體實(shí)例?!臼纠?.5】 在對(duì)話框應(yīng)用程序中創(chuàng)建一個(gè)工具條,并且在對(duì)話框的下端顯示出來,同時(shí)響應(yīng)單擊工具欄按鈕。具體步驟如下所述。(1)新建一個(gè)基于對(duì)話框的應(yīng)用程序。(2)利用資源編輯器添加工具欄,并放置按鈕。設(shè)計(jì)的按鈕如圖9.19所示。圖9.19 設(shè)計(jì)工具條設(shè)置上面工具條的ID為IDR_TOOLBAR1,各個(gè)按鈕從左到右的ID依次為ID_BUTTON1、ID_BUTTON2、ID_BUTTON3和ID_BUTTON4。(3)在類CTestDlg中添加變量CToolBar m_toolbar,用來實(shí)現(xiàn)加載工具條資源,并進(jìn)行顯示。在

43、OnInitDialog()函數(shù)中添加代碼實(shí)現(xiàn)工具條的顯示。分析:上面的代碼是實(shí)現(xiàn)工具欄在對(duì)話框最下端的顯示工作。說明:讀者可能很難記憶上面各個(gè)樣式的代碼,但是可以參看單文檔中的工具欄加載部分的代碼。(4)利用類向?qū)砑訂螕艄ぞ邫诎粹o的消息映射。下面僅僅為了測(cè)試消息響應(yīng),彈出一個(gè)消息框。這類消息與單擊對(duì)話框上的一般控件的消息基本上是一致的。代碼如下:(5)編譯、連接,運(yùn)行后單擊工具欄上的工具欄按鈕,運(yùn)行結(jié)果如圖9.20所示。圖9.20 運(yùn)行結(jié)果上面介紹了在對(duì)話框應(yīng)用程序中工具欄的使用方法。由于工具欄可大可小,同時(shí)可以利用資源編輯工具繪制工具欄的圖標(biāo),這樣使得工具欄的使用比按鈕更加方便。在實(shí)際應(yīng)

44、用中,工具欄按鈕與普通按鈕控件的作用基本是一樣的。9.4 狀態(tài)欄在Windows應(yīng)用程序中經(jīng)常使用狀態(tài)欄顯示當(dāng)前系統(tǒng)的狀態(tài),例如當(dāng)前鍵盤特殊鍵的狀態(tài)。鼠標(biāo)的位置等。在Visual C+中可以進(jìn)行狀態(tài)欄的設(shè)計(jì),同時(shí)可以動(dòng)態(tài)改變其顯示的內(nèi)容。本節(jié)介紹狀態(tài)欄的設(shè)計(jì)和使用方法。9.4.1 狀態(tài)欄狀態(tài)欄一般位于窗口的最下端,用來顯示一些鍵盤的特殊鍵的狀態(tài),或者顯示菜單、工具欄按鈕的一些說明。在MFC中,CStatusBar類封裝了對(duì)狀態(tài)欄的操作。在單文檔應(yīng)用程序的CMainFrame中可以看到一個(gè)CStatusBar對(duì)象,在OnCreate()中創(chuàng)建了狀態(tài)欄。狀態(tài)欄的創(chuàng)建是利用CStatusBar類的C

45、reate()函數(shù)進(jìn)行的,創(chuàng)建了狀態(tài)欄以后,狀態(tài)欄并沒有任何作用,因?yàn)閮H僅創(chuàng)建了一個(gè)狀態(tài)欄,上面沒有任何東西。因此它調(diào)用了CStatusBar:SetIndicators()函數(shù)分配窗格,并將狀態(tài)欄的每一個(gè)窗格與一個(gè)字符串ID相聯(lián)系。SetIndicators函數(shù)的第一個(gè)參數(shù)indicators是一個(gè)ID數(shù)組,在CMainFrame類所在的CPP文件的開頭部分可以找到該數(shù)組,代碼如下:static UINT indicators =ID_SEPARATOR, / status line indicatorID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICAT

46、OR_SCRL,;indicator數(shù)組是存儲(chǔ)了狀態(tài)欄窗格的分配信息。程序員可以在該數(shù)組中添加字符串資源的ID號(hào),然后在應(yīng)用程序中分配響應(yīng)的顯示位置。這樣應(yīng)用程序就可以在應(yīng)用程序界面上顯示狀態(tài)欄信息。在實(shí)際的應(yīng)用中,可以在String Table字符串資源中添加一項(xiàng),并且在indicator數(shù)組中添加相應(yīng)的ID,這樣就可以在狀態(tài)欄中添加新的一欄。通常情況下需要?jiǎng)討B(tài)地處理狀態(tài)欄,這時(shí)只需要利用函數(shù)得到指向狀態(tài)欄的指針,就可以很方便地調(diào)用函數(shù)實(shí)現(xiàn)狀態(tài)欄的顯示。說明:狀態(tài)欄某一項(xiàng)顯示的字符長(zhǎng)度,是程序初始化時(shí)根據(jù)indicators數(shù)組對(duì)應(yīng)的默認(rèn)字符串進(jìn)行分配的。9.4.2 狀態(tài)欄操作實(shí)例通過前面的介紹了解了狀態(tài)欄的基本知識(shí),本小節(jié)結(jié)合實(shí)例講解添加狀態(tài)欄并且動(dòng)態(tài)處理狀態(tài)欄顯示的問題?!臼纠?.6】 在狀態(tài)欄中添加一項(xiàng),顯示鼠標(biāo)的坐標(biāo)。具體操作步驟如下所述。(1)創(chuàng)建一個(gè)基于單文檔的應(yīng)用程序。(2)在項(xiàng)目工作區(qū)中,單擊Resource View面板,然后單擊String Table圖標(biāo)的加號(hào),在其展開項(xiàng)中雙擊主工具欄的圖標(biāo),在代碼編輯區(qū)彈出String Table,如圖9.21所示。程序員可以方便地添加或者刪除其中的某項(xiàng)。圖9.21 String

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論