UPDATE_COMMAND_UI
處理菜單對應的用戶界面
COMMAND
處理該菜單對應的功能
傳統SDK程序;要改變選單命令項狀態,可以呼叫EnableMenuItem或是
CheckMenuItem, 但這使得程序雜亂無章,因爲你沒有;個固定的位置和固定的原則處理命令項狀態。MFC提供;種直覺並且仍舊依賴訊息觀念的方式,解決這個問題,這就是 UPDATE_COMMAND_UI訊息。其設計理念是,每當選單被拉;並尚未顯示之前,其命令項(以及對應之工具欄按鈕)都會收到 UPDATE_COMMAND_UI訊息,這個訊息和WM_COMMAND有㆒樣的繞行路線,我們(程序員)只要在適當的類別;放 置其處理函式,並在函式;做某些判斷,便可決定如何顯示命令項。
這種方法的最大好處是,不但把問題的解決方式統化,更因爲 Framework傳給UPDATE_COMMAND_UI處理程序的參數是個「指向CCmdUI對象的指針」,而CCmdUI對象就代表着對應的選單命 令項,因此你只需呼叫 CCmdUI 所準備的,專門用來處理命令項外觀的函式(如Enable或SetCheck)即可。我們的工作量大爲減輕。
(選摘自《深入淺出MFC》第9章)
UPDATE_COMMAND_UI
處理菜單對應的用戶界面
COMMAND
處理該菜單對應的功能
說得很好:)
如果要使菜單變灰、或者在菜單項裏面打勾
用那個UPDATE_COMMAND_UI,否則用command
例子:
void CMainFrame::OnUpdateSelectBlue(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(true);//把菜單選中
}
3.7.1用戶接口更新原理
爲了理解用戶接口更新機制,我們來看一下應用框架是如何實現用戶接口更新的。當我們選擇Edit菜單時,將產生一條WM_INITMENUPOPUP消息。框架的更新機制將在菜單拉下之前集體更新所有的項,然後再顯示該菜單。
爲了更新所有的菜單項,應用框架按標準的命令發送路線把該彈出式菜單中的所有菜單項的更新命令都發送出去。通過匹配命令和適當的消息映射條目(形式爲 ON_UPDATE_COMMAND_UI),並調用相應的更新處理器函數,就可以更新任何菜單項。比如,Edit菜單下有Undo、Cut、Copy、 Paste等四個菜單項,就要發送四條用戶接口更新命令。如果菜單項的命令ID有一個更新處理器,它就會被調用進行更新;如果不存在,則框架檢查該命令 ID的處理函數是否存在,並根據需要使菜單有效或無效。
如果在命令發送期間找不到對應於該命令的ON_UPDATE_COMMAND_UI 項,那麼框架就檢查是否存在一個命令的ON_COMMAND項,如果存在,則使該菜單有效,否則就使該菜單無效(灰化)。這種更新機制僅適用於彈出式菜 單,對於頂層菜單象File和Edit菜單,就不能使用這種更新機制。
按鈕的命令更新機制與菜單的命令接口更新機制類似,只是工具條按鈕的命令接口更新在空閒循環時完成。有關工具條按鈕的接口更新機制,我們將在下一章“工具條和狀態欄”中作詳細介紹。
3.7.2 用戶接口更新機制編程
當框架給處理函數發送更新命令時,它給處理函數傳遞一個指向CCmdUI對象的 指針。這個對象包含了相應的菜單項或工具條按鈕的指針。更新處理函數利用該指針調用菜單項或工具條的命令接口函數來更新用戶接口對象(包括灰化,使,使 能,選中菜單項和工具條按鈕等)。下面我們使用前面的例子演示如何使用用戶接口更新機制:
1.按Ctrl+W激活ClassWizard,選擇Message Map選項頁。
2. 在Object IDs列表中選擇 ID_SELECT_RED,在Messages列表中雙擊ON_UPDATE _COMMAND_UI條目,彈出Add Member Function對話框,缺省函數名爲OnUpdateSelect Red,按OK按鈕接收此函數名。OnUpdateSelectRed成員函數名就出現在Member Functions列表中。依次給ID_SELECT_BLUE、ID_SELECT_YELLOW增加OnUpdateSelectBlue和 OnUpdateSelectYellow命令接口更新成員函數。
3.現在手工編輯剛纔生成的成員函數,修改後形式如清單3.5所示:
清單3.5
void CMainFrame::OnUpdateSelectBlue(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_nColor==BLUE);
}
void CMainFrame::OnUpdateSelectRed(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_nColor==RED);
}
void CMainFrame::OnUpdateSelectYellow(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_nColor==YELLOW);
}
現在編譯運行Hello程序。當我們打開Test菜單時,如圖3-14所示,在 Red菜單項前已經有了一個對號。因爲前面在CMainFrame構造函數中,我們已經將顏色初始化爲RED。如果選擇Blue,下次打開Test菜單 時,在Blue菜單前就會有一個對號,而Red前面的對號則沒有了。
圖3-14
類似的,要根據某個狀態開關菜單,也可以爲菜單生成命令接口更新成員函數。比如,在Edit菜單中,如果當前剪貼板沒有內容,Paste(粘貼)菜單應當設爲無效,程序可以這麼寫:
void CMainFrame::OnUpdateEditPaste(CCmdUI* pCmdUI)
{
pCmdUI->Enable(!IsClipboardEmpty());
}