MFC程序创建右键菜单关于复选标记的问题

我在VS2008下用MFC创建了一个单文档的程序,新建了一个菜单资源,在VIEW类的RBUTTONDOWN消息下加载此右键菜单,定义了每个菜单项的COMMAND消息和UP... 我在VS2008下用MFC创建了一个单文档的程序,新建了一个菜单资源,在VIEW类的RBUTTONDOWN消息下加载此右键菜单,定义了每个菜单项的COMMAND消息和UPDATE_COMMAND_UI消息,运行时基本正常,就是当点击一个菜单项时,我的预期是它应该被标记为复选的,可结果菜单项始终没有任何变化.请问问题出在哪? 展开
 我来答
花花浪客
2013-11-18 · TA获得超过2069个赞
知道小有建树答主
回答量:792
采纳率:100%
帮助的人:717万
展开全部

Popup menu在创建的时候不会有UPDATE_COMMAND_UI消息,所以需要额外的代码来辅助这一功能。

你需要再为你的CTestView响应WM_INITMENUPOPUP消息,然后添加如下代码(类名改成你自己的类名):

void CtestmfcView::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
    CView::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);

    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 = this;  
        // 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, TRUE);   // 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, FALSE);  
        }  
  
        // 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;  
    }  
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式