其实这个弹出式菜单就是SDI文档的IDR_MAINFRAM菜单的一个下拉菜单,
但是
pSubMenu = ::AfxGetMainWnd()->GetMenu()->GetSubMenu(nPos);
pSubMenu->TrackPopupMenu(TPM_RIGHTBUTTON | TPM_LEFTALIGN,....
弹出来的菜单却无法收到ON_UPDATE_COMMAND_UI。应该怎么办呢?

解决方案 »

  1.   

    ON_UPDATE_COMMAND_UI
    这个宏不就是用来判断相应的菜单是否可用么
    她可以作出响应不就是判断相应的菜单是否可用么
    可以有其他的命令响应么?
      

  2.   

    在OnUpdate...()函数中我已经处理了菜单的有效性,我不希望在弹出同样的菜单时再处理一次。
      

  3.   

    生成一个CCmdUI对象,如下:(下面代码经过实验,证明有效)CCmdUI ui;
    ui.m_pMenu     = pSubMenu;
    ui.m_nIndexMax = pSubMenu->GetMenuItemCount();
    CCmdTarget *pTarget = static_cast< CCmdTarget* >( ::AfxGetMainWnd() );for( long i = pSubMenu->GetMenuItemCount(); i; --i )
    {
        ui.m_nIndex = i - 1;
        ui.m_nID    = pSubMenu->GetMenuItemID( ui.m_nIndex );    ui.DoUpdate( pTarget, TRUE );
    }
      

  4.   

    是不是TrackPopupMenu的目标窗口设置的问题啊
      

  5.   

    弹出式菜单不要用那个自己搞就行了:
    CMenu menu;
    menu.LoadMenu(IDR_MENU_POPUP);
    CMenu* pPopupMenu = menu.GetSubMenu(1);
    if (pPopupMenu)
    {
    if (...)//enable
    {
    pPopupMenu->DeleteMenu(0, MF_BYPOSITION);
    //pPopupMenu->EnableMenuItem(ID_FILE_NEW, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
    pPopupMenu->InsertMenu(0, MF_BYPOSITION | MF_STRING, ID_POPUP_ITEM_OPEN, _T("Open"));
    pPopupMenu->SetDefaultItem(ID_POPUP_ITEM_OPEN);
    }
    else
    {
    pPopupMenu->EnableMenuItem(ID_POPUP_ITEM_REMOVE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
    pPopupMenu->EnableMenuItem(ID_POPUP_ITEM_SYNC, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
    pPopupMenu->EnableMenuItem(ID_POPUP_ITEM_PROPERTIES, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
    } CPoint pt;
    GetCursorPos(&pt);
    pPopupMenu->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON, pt.x, pt.y, this);
    }
      

  6.   

    是的,因为弹出式菜单不支持UI,所以你得用一个变量来保存状态,并在TrackPopupMenu之前这个变量来设置菜单的状态。