|
工具欄的顯示和隱藏的快捷方式實現(xiàn)
在圖12中,關(guān)閉浮動的"格式"工具欄后,若再顯示該工具欄則無法進行,為此我們需要添加相關(guān)的控制代碼。這里我們先來介紹菜單命令的控制方式,然后再說明其他的快捷方式。
1. 菜單命令方式
所謂菜單命令方式,即使用菜單命令來顯示和隱藏指定工具欄。需要解決的問題有兩個,一是顯示和隱藏指定工具欄的函數(shù)是什么?二是如何實現(xiàn)菜單項前面的顯示狀態(tài)的更新。所謂顯示狀態(tài),即當(dāng)工具欄顯示時,該菜單項前面有一個"a",否則什么都沒有。
對于第一個問題,我們可以使用CFrameWnd類的成員函數(shù)ShowControlBar()來進行,它的原型如下:
void ShowControlBar( CControlBar* PBar, BOOL bShow, BOOL bDelay );
其中,pBar用來指定要操作的控制條指針,bShow為TRUE時表示顯示,否則表示隱藏,bDelay表示是否延遲顯示或隱藏,當(dāng)為FALSE時表示立即顯示或隱藏。
對于第二個問題,可以通過映射宏ON_UPDATE_COMMAND_UI來實現(xiàn)菜單項和工具欄按鈕狀態(tài)的改變。下面就來實現(xiàn)。
(1) 在"視圖"菜單中添加一個菜單項"格式工具欄(&F)",ID為ID_VIEW_FORMAT。如圖13所示。

圖13 在"視圖"中添加的菜單項
(2) 在CMainFrame類中添加一個成員變量m_bViewFormat,變量類型為BOOL。該變量用來決定新添加的"格式"工具欄是否顯示。
(3) 在CMainFrame類的構(gòu)造函數(shù)處,將m_bViewFormat的初值由原來的FALSE改為TRUE。
(4) 在CMainFrame類中分別添加菜單項ID_VIEW_FORMAT的COMMAND和UPDATE_COMMAND_UI事件映射,并在映射函數(shù)添加如圖14所示的代碼。

圖14 添加的代碼
程序說明:
?、?CCmdUI類是專門用于交互對象的更新操作,其成員函數(shù)Enable()用來使交互對象有效(參數(shù)為TRUE)或無效(參數(shù)為FALSE),若不指定參數(shù),使用默認(rèn)的參數(shù)值TRUE。
?、?CCmdUI::SetCheck()用來設(shè)置交互對象狀態(tài)是"選中"(參數(shù)為TRUE)還是"未選中"(參數(shù)為FALSE)。當(dāng)"選中"時,SetCheck()在菜單項文本前面加上"a"。
(5) 運行程序。
2. 快捷鍵方式
快捷鍵用于那些反復(fù)使用的菜單命令或工具按鈕命令,當(dāng)用戶執(zhí)行命令時只要接相應(yīng)的快捷鍵即可。下面來添加并使用快捷鍵。
(1) 將解決方案資源管理器窗口切換到"資源視圖",展開Accelerator,雙擊IDR_MAINFRAME,出現(xiàn)如圖15所示的快捷鍵資源內(nèi)容。

圖15 快捷鍵資源
需要說明的是,在Visual C ++ .net中,每一個快捷鍵除了ID外,還有三個屬性:修飾符、鍵和類型。"修飾符"屬性用來設(shè)置的快捷鍵是與Alt、Ctrl和Shift的哪一個或幾個控制鍵組合。"鍵"屬性用來設(shè)置使用的鍵。"類型"屬性是用來確定鍵是解釋為虛擬鍵(VIRTKEY)還是解釋為ASCII/ANSI。
(2) 單擊最下端的空白方框,出現(xiàn)默認(rèn)的快捷鍵資源,如圖16所示。

圖16 添加的默認(rèn)快捷鍵資源
(3) 單擊ID_ACCELERATOR32776后,該ID字段變成了一個組合框。在這里,我們既可以自己定義一個資源標(biāo)識,也可以單擊右側(cè)的下拉按鈕,從中選擇一個已有的資源標(biāo)識。一旦指定了標(biāo)識,快捷鍵就與該標(biāo)識關(guān)聯(lián)起來,這樣當(dāng)按快捷鍵時就會執(zhí)行與標(biāo)識相對應(yīng)的命令。我們選擇前面的菜單標(biāo)識ID_VIEW_FORMAT。
(4) 單擊Ctrl,從中選擇可以使用的控制鍵,單擊"鍵"字段可以選擇相應(yīng)的虛擬鍵,或直接輸入字符,表示相應(yīng)的字符鍵。按圖17來設(shè)置。

圖17 設(shè)置的快捷鍵
(5) 程序運行后,先按住Ctrl,然后再按1鍵,就可以顯示或隱藏格式工具欄了。
需要說明的是,為了使用戶能看到各菜單項所對應(yīng)的快捷鍵,我們應(yīng)該在各菜單項的文本后加上快捷鍵的內(nèi)容。例如,在將菜單項ID_VIEW_FORMAT的文本內(nèi)容改成"格式工具欄(&F)\t Ctrl+1",其中的"Ctrl+1"表示該菜單項的快捷鍵,"\t"用來將其后面的內(nèi)容在下一個水平制表位置中顯示。
3. 快捷菜單方式
工具欄的顯示和隱藏的快捷方式最常用的是使用快捷菜單。所謂快捷菜單,它是一種浮動的彈出式菜單,當(dāng)用戶右擊鼠標(biāo)時,就會相應(yīng)地彈出一個浮動菜單,其中提供了幾個與當(dāng)前選擇內(nèi)容相關(guān)的菜單命令。
(1) 在CMainFrame類的屬性窗口中,單擊"消息"按鈕,在列表框中找到并添加WM_CONTEXTMENU消息的映射。如圖18所示。

圖18 添加WM_CONTEXTMENU消息映射
(2) 在映射函數(shù)OnContextMenu()中添加代碼,如圖19所示的加框部分。

圖19 在OnContextMenu()中添加的代碼
需要說明的是:
?、?在MFC中,AFX_IDW_DOCKBAR_TOP和AFX_IDW_DOCKBAR_FLOAT之間的值用來標(biāo)識工具欄的??亢透拥拇翱?,而AFX_IDW_PANE_FIRST是標(biāo)識第一個視圖窗口,由于單文檔的視圖只有一個,因此它的標(biāo)識就是該值。
?、?GetMenu是用來獲取指定菜單下的彈出子菜單,參數(shù)的值表示子菜單在主菜單中的位置序號,0時表示第1個子菜單,1時表示第2個子菜單,以此類推。
③ TrackPopupMenu()用來彈出一個快捷菜單,第一個參數(shù)用來表示菜單在屏幕顯示的位置以及鼠標(biāo)按鈕標(biāo)志,當(dāng)為TPM_LEFTALIGN時表示菜單的左邊位置由第二個參數(shù)確定,TPM_RIGHTBUTTON表示用戶單擊鼠標(biāo)右鍵時彈出菜單,最后一個參數(shù)表示彈出菜單的父窗口。this是當(dāng)前對象指針,每個類對象均有這個指針。
(3) 運行程序。圖20是兩次不同位置右擊時彈出的快捷菜單。


圖20 快捷方式運行結(jié)果
|