天天看點

MFC應用程式中enable或disable菜單項

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

MFC應用程式中enable或disable菜單項