65.9K
CodeProject 正在变化。 阅读更多。
Home

弹出菜单的命令路由

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.79/5 (27投票s)

2000年8月23日

CPOL
viewsIcon

196818

使用熟悉的 OnUpdate 接口处理灰色/禁用/选中菜单项

引言

在使用弹出菜单时,我需要一种方法将它们连接到标准的 CCmdUI MFC OnUpdate 接口。以下代码块可以做到这一点

void CmdRouteMenu(CWnd* pWnd,CMenu* pPopupMenu)
{
    CCmdUI state;
    state.m_pMenu = pPopupMenu;
    state.m_pParentMenu = pPopupMenu;
    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);

        // menu separator or invalid cmd - ignore it
        if (state.m_nID == 0) continue; 

        if (state.m_nID == (UINT)-1)
        {
            // possibly a popup menu, route to child menu if so
            CMenu* pSub=pPopupMenu->GetSubMenu(state.m_nIndex);
            if(pSub) CmdRouteMenu(pWnd,pSub);
        }
        else 
        {
            // normal menu item, Auto disable if command is 
            // _not_ a system command.
            state.m_pSubMenu = NULL;
            state.DoUpdate(pWnd, FALSE);
        }
    }
}

使用示例

CmdRouteMenu(pWnd,pSubMenu);
pSubMenu->TrackPopupMenu(TPM_LEFTBUTTON | TPM_RIGHTBUTTON | 
                         TPM_LEFTALIGN,point.x,point.y,pWnd,NULL);

只需在弹出菜单之前,使用 TrackMenu(...) 调用,传入要处理 OnUpdate 消息的窗口(通常是您的主窗口)和要操作的菜单即可。 这也适用于 CodeProject 上找到的 BMP 菜单和渐变菜单。

当然,上面的代码只有在你编写了 OnUpdate 调用来处理菜单命令时才能工作。

© . All rights reserved.