在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後的效果如下: