UPDATE_COMMAND_UI函数执行成功后,点击该菜单项已经没有响应了,可是为什么此菜单项没有变灰,这是为什么呢?

解决方案 »

  1.   

    void CTestV1View::OnUpdateFileSave(CCmdUI* pCmdUI) 
    {
    // TODO: Add your command update UI handler code here
    //
    ......
    pCmdUI->Enable(FALSE);
    }
      

  2.   

    1>可能是需要刷新,用UpDateWindow(hwnd)
    2>你的OnUpdateCommandUI() { //空也要有  };
    这个函数体要有。
      

  3.   

    to Phourm() :是对话框的菜单,是模式的。要怎么改呢?
      

  4.   

    Handle WM_INITMENUPOPUP and
    Add following code to your dialog.
    void CYouDialog::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) 
    {
    CDialog::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);

    // TODO: Add your message handler code here
    ASSERT(pPopupMenu != NULL);
    // check the enabled state of various menu items CCmdUI state;
    state.m_pMenu = pPopupMenu;
    ASSERT(state.m_pOther == NULL);
    ASSERT(state.m_pParentMenu == NULL); // determine if menu is popup in top-level menu and set m_pOther to
    //  it if so (m_pParentMenu == NULL indicates that it is secondary popup)
    HMENU hParentMenu;
    if (AfxGetThreadState()->m_hTrackingMenu == pPopupMenu->m_hMenu)
    state.m_pParentMenu = pPopupMenu;    // parent == child for tracking popup
    else if ((hParentMenu = ::GetMenu(m_hWnd)) != NULL)
    {
    CWnd* pParent = GetTopLevelParent();
    // child windows don't have menus -- need to go to the top!
    if (pParent != NULL &&
    (hParentMenu = ::GetMenu(pParent->m_hWnd)) != NULL)
    {
    int nIndexMax = ::GetMenuItemCount(hParentMenu);
    for (int nIndex = 0; nIndex < nIndexMax; nIndex++)
    {
    if (::GetSubMenu(hParentMenu, nIndex) == pPopupMenu->m_hMenu)
    {
    // when popup is found, m_pParentMenu is containing menu
    state.m_pParentMenu = CMenu::FromHandle(hParentMenu);
    break;
    }
    }
    }
    } state.m_nIndexMax = pPopupMenu->GetMenuItemCount();
    for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax;
      state.m_nIndex++)
    {
    state.m_nID = pPopupMenu->GetMenuItemID(state.m_nIndex);
    if (state.m_nID == 0)
    continue; // menu separator or invalid cmd - ignore it ASSERT(state.m_pOther == NULL);
    ASSERT(state.m_pMenu != NULL);
    if (state.m_nID == (UINT)-1)
    {
    // possibly a popup menu, route to first item of that popup
    state.m_pSubMenu = pPopupMenu->GetSubMenu(state.m_nIndex);
    if (state.m_pSubMenu == NULL ||
    (state.m_nID = state.m_pSubMenu->GetMenuItemID(0)) == 0 ||
    state.m_nID == (UINT)-1)
    {
    continue;       // first item of popup can't be routed to
    }
    state.DoUpdate(this, FALSE);    // popups are never auto disabled
    }
    else
    {
    // normal menu item
    // Auto enable/disable if frame window has 'm_bAutoMenuEnable'
    //    set and command is _not_ a system command.
    state.m_pSubMenu = NULL;
    state.DoUpdate(this, /*m_bAutoMenuEnable &&*/state.m_nID < 0xF000);
    } // adjust for menu deletions and additions
    UINT nCount = pPopupMenu->GetMenuItemCount();
    if (nCount < state.m_nIndexMax)
    {
    state.m_nIndex -= (state.m_nIndexMax - nCount);
    while (state.m_nIndex < nCount &&
    pPopupMenu->GetMenuItemID(state.m_nIndex) == state.m_nID)
    {
    state.m_nIndex++;
    }
    }
    state.m_nIndexMax = nCount;
    }
    }