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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

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

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

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

8、計了菜單,但是可以看到運行時具體的菜單命令是灰色的。這是因為應用程序沒有對菜單命令進行任何響應,即此時菜單是沒有用處的。在9.2.2節(jié)將會利用類向導添加菜單的響應命令,即使得菜單可用。說明:設計菜單時,如果需要添加菜單項,只要在已設計的菜單項下一個空白菜單中右擊就可以進行設計。9.2.2 響應菜單項命令前面介紹了在Visual C+ 6.0的資源編輯器中設計菜單資源的一般方法。但是程序運行時,菜單選項都是灰色的,這是因為對菜單命令沒有進行映射,即菜單只是一個擺設,還沒有具體功能。下面介紹菜單的命令處理,在類向導中,MFC封裝了對菜單項的兩類消息映射,一是COMMAND消息,另一個是UPDATE

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

10、映射。如圖9.5所示。圖9.5 添加消息映射(3)編寫消息映射函數的函數體,代碼如下:01void CMainFrame:OnMenu2() 0203/ TODO: Add your command handler code here04AfxMessageBox(單擊了下拉菜單2命令);/彈出消息框05其功能是彈出一個消息框,提示用戶單擊了菜單。(4)編譯、鏈接,運行程序,選擇“主菜單”|“下拉菜單2”命令,結果如圖9.6所示??梢娚厦娲a響應的單擊菜單命令的消息,彈出了一個對話框。2UPDATE_COMMAND_UI消息的響應UPDATE_COMMAND_UI消息是在窗口繪制菜單項時產生的

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

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

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

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

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

16、royMenu();釋放菜單釋放菜單BOOL AppendMenu ( UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );添加新項添加新項UINT EnableMenuItem ( UINT nIDEnableItem, UINT nEnable );激活或禁止菜單項激活或禁止菜單項UINT GetMenuItemCount() const;獲取菜單項數獲取菜單項數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 彈出式菜單彈出式菜單是在應用程序中經常用到的一類菜單,又稱為快捷菜單。例如在Word文檔的工作區(qū)里右擊,會彈出一個快捷菜單。在應用程序中經常需要設計一個右擊的快捷菜單。下面結合實例進行介紹。【示例9.2】 在SDI應用程序中設

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

20、 add construction code here04menu.LoadMenu(IDR_MENU1);/加載菜單資源050607CTestView:CTestView()0809menu.DestroyMenu();/銷毀菜單10(4)向導中添加右擊時的消息響應函數。編寫函數體,代碼如下: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);/客戶坐標轉換為屏幕坐標06menupop-TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);07/彈出菜單08CView:OnRButtonDown(nFlags, point);09分析:上面的代碼首先獲得了子菜單,然后進行顯示。需要注意的是,中間需要由客戶坐標轉換為屏幕坐標,這是因為所使用的兩個坐標系是不相同的,關于此處將在第10章進行介紹。在快捷菜單中,子菜單項的獲取需要利用主菜單的GetSubMenu()函數,這樣在實際應用中就可以根據需要動態(tài)地加載某個子菜單。

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

23、g Properties對話框,如圖9.10所示。在Menu下拉列表框中選擇IDR_MENU1選項。圖9.10 Dialog Properties對話框說明:在Menu下拉列表框中會列出本工程中所有的菜單資源,如果沒有菜單資源,那么下拉列表框中是空白的。(3)利用上面的步驟,可以將菜單與對話框綁定在一起。此時的菜單顯示在對話框的標題欄的下面。利用類向導為單擊菜單命令添加消息映射。下面僅僅實驗菜單命令的消息映射。實際應用中可以設計具體的功能代碼。01void CTestDlg:OnMenu11() 0203/ TODO: Add your command handler code here04A

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

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

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

27、在使用時可以直接復制代碼,而不要自己編寫代碼。利用上面的代碼就實現了菜單的更新操作,此時菜單就可以響應WM_INITMENUPOPUP消息。說明:如果讀者十分清楚添加消息映射的概念,可以手動添加消息映射,而不需要利用類向導去添加。(6)利用類向導添加“主菜單1”|“下拉菜單11”的UPDATE_COMMAND_UI的消息映射,編寫代碼如下:01void CTestDlg:OnUpdateMenu11(CCmdUI* pCmdUI) 0203/ TODO: Add your command update UI handler code here04pCmdUI-SetCheck(flag1);/

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

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

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

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

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

33、用工具欄控制類來控制工具欄,類CToolBarCtrl封裝了控制工具欄的基本操作,其主要成員如表9.3所示。函函 數數說說 明明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 );設置按鈕及位圖的大小設置按鈕及位圖的大小void SetHeight( int cyHeight );設置工具欄的高度設置工具欄的高度

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

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

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

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

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

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上面的代碼加載了工具欄資源,但此時顯示是不正常的,需要再添加下面代

40、碼:m_toolbar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_toolbar);這樣可以使工具條在應用程序的頂部顯示,此時可以有多個工具條。(4)在CMainFrame類中添加變量BOOL cir和BOOL rect,并且進行初始化值為false。(5)添加單擊工具欄的消息映射。利用類向導添加工具欄按鈕的消息映射。此時需要在其消息響應函數里處理單擊的標志變量,以實現按鈕按下的狀態(tài)。分析:上面的代碼是根據當前工具欄按鈕的狀態(tài)進行消息響應。在單擊了按鈕以后,程序會產生UPD

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

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論