在MFC應用程式中需要enable或disable菜單項時,在主菜單中調用 CMenu::EnableMenuItem不起作用......如何disable菜單項?
根據以往的經驗,要解決這種問題,似乎應該有一個象EnableMenuItem之類的API函數,它的功能就是enable或disable菜單項。Windows中确實有這樣的函數-但不是在MFC的應用中(經測試不能達到想要的效果)。實際上,在MFC裡enable或disable菜單項是通過使用ON_ UPDATE_COMMAND_UI實作的。
一般情況下,使用者界面的狀态指的是按鈕,菜單項等任何反映程式狀态的東西。例如,如果剪貼闆沒有内容(一種狀态),那麼菜單中的粘貼(Paste)指令應該是disable的。是以說通常的使用者界面(UI)指的就是程式表現的狀态,同時,程式狀态的改變應該在程式的菜單中反映出來。
MFC提供一個UI更新機制來實作這種狀态的改變,其基本思路為:當使用者調用一個菜單的時候,Windows發送一個WM_INITMENUPOPUP消息。MFC建立一個暫時的CCmdUI對象處理這個消息,為每一個菜單項做連續初始化并将它傳遞到應用程式中的對象。MFC為此調用ON_UPDATE_COMMAND_UI消息處理器更新使用者界面:
ON_UPDATE_COMMAND_UI(ID_FOO, OnUpdateFoo) ;
隻要使用者進入包含Foo的菜單項,MFC就會調用OnUpdateFoo函數。典型的處理方法如下:
void CMainFrame::OnUpdateFoo(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(1); //1為enable, 0為disable;
}
3DView菜單的子菜單項disable後的效果如下: