許多開發者嘗試用 CMenu::EnableMenuItem 動態啟用/禁用主選單項,卻發現無效。原因在於 MFC 採用完全不同的機制:命令 UI 更新(ON_UPDATE_COMMAND_UI)。
WM_INITMENUPOPUP。CCmdUI 物件,對每個選單項初始化並分派。ON_UPDATE_COMMAND_UI(ID_FOO, OnUpdateFoo) 調用處理函數。pCmdUI->Enable(條件)。void CMainFrame::OnUpdateFoo(CCmdUI* pCmdUI)
{
// 假設文檔提供 GetReadOnly() 狀態
pCmdUI->Enable(!m_pDocument->GetReadOnly());
}
// 複雜條件亦可
pCmdUI->Enable(m_bFoo && (GetStatusX() || GetStatusY()));
CCmdUI::Enable 為虛函數,對選單項最終映射為 ::EnableMenuItem;同樣機制支援工具列按鈕、狀態列、組合框等。ON_UPDATE_COMMAND_UI,MFC 預設規則:有 ON_COMMAND 處理器則啟用,否則禁用。可設 m_bAutoMenuEnable = FALSE 強制全啟用。處理函數可置於 CMainFrame、CView、CDocument、CWinApp 或任何 CCmdTarget 衍生類,命令透過 OnCmdMsg 路由。
切勿在 MFC 中直接呼叫 EnableMenuItem,請改用 ON_UPDATE_COMMAND_UI 處理器,實現集中、可維護的 UI 狀態管理。