// check the enabled state of various menu items CCmdUI state; state.m_pMenu = pPopupMenu; ASSERT(state.m_pOther == NULL);
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 command is _not_ a system command state.m_pSubMenu = NULL; state.DoUpdate(this, state.m_nID < 0xF000); } } } }
UINT EnableMenuItem( UINT nIDEnableItem, UINT nEnable );
void CSView::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
. . .
CMenu menu;
menu.CreatePopupMenu();
menu.LoadMenu(IDR_ListCtrlMenu);//
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON|TPM_RIGHTBUTTON, _point.x, _point.y, this); //获取第一个弹出菜单,所以第一个菜单必须有子菜单
menu.EnableMenuItem(ID_RM_InsertEnd,MF_DISABLED|MF_BYCOMMAND|MF_GRAYED);这个问题困扰我很久了,,我也不清楚为什么不行,,
menu.CreatePopupMenu();
menu.LoadMenu(IDR_ListCtrlMenu);//
menu.EnableMenuItem(ID_RM_InsertEnd,MF_DISABLED|MF_BYCOMMAND|MF_GRAYED);
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON|TPM_RIGHTBUTTON, _point.x, _point.y, this); //获取第一个弹出菜单,所以第一个菜单必须有子菜单
submenu = menu.GetSubMenu(0);
for(int i =0; i < cnt; i++)
menu.EnableMenuItem(...);
for(int i =0; i < cnt; i++)
submenu .EnableMenuItem(...);
{
. . .
CMenu menu;
menu.CreatePopupMenu();
menu.LoadMenu(IDR_ListCtrlMenu);//
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON|TPM_RIGHTBUTTON, _point.x, _point.y, this); //获取第一个弹出菜单,所以第一个菜单必须有子菜单
menu.GetSubMenu(0)->EnableMenuItem(ID_RM_InsertEnd,MF_DISABLED|MF_BYCOMMAND|MF_GRAYED);
subMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, 100, 100, this);
subMenu->EnableMenuItem(ID_RM_InsertEnd, MF_DISABLED | MF_BYCOMMAND | MF_GRAYED);
CMenu* subMenu = menu.GetSubMenu(0);
subMenu->EnableMenuItem(ID_RM_InsertEnd, MF_DISABLED | MF_BYCOMMAND | MF_GRAYED);
subMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, 100, 100, this);
真的不行,我都试过了,难道哪里还需要设置的
吗?或者你们用的vc版本不同,我用6.0的,,
晕
发给我看看[email protected]
是不是你没有获得正确的指针
被莫名的改成了ID_MENUITEM32782,
真是奇怪,,好好地ID_RM_InsertEnd
怎么就被系统偷梁换柱了呢
void CMainFrm::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
if (!bSysMenu)
{
ASSERT(pPopupMenu != NULL);
// check the enabled state of various menu items
CCmdUI state;
state.m_pMenu = pPopupMenu;
ASSERT(state.m_pOther == NULL);
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 command is _not_ a system command
state.m_pSubMenu = NULL;
state.DoUpdate(this, state.m_nID < 0xF000);
}
}
}
}