弹出菜单的命令路由






4.79/5 (27投票s)
使用熟悉的 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
调用来处理菜单命令时才能工作。