首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

这么奇怪,右键菜单灰显不了?解决办法

2012-01-15 
这么奇怪,右键菜单灰显不了??Create出的CListView继承类视图上的右键菜单不能通过UPDATE_COMMOND_UI控制灰

这么奇怪,右键菜单灰显不了??
Create出的CListView继承类视图上的右键菜单不能通过UPDATE_COMMOND_UI控制灰亮显吗

我在程序中Create出的CListView继承类视图上的右键菜单的UPDATE_COMMOND_UI控制灰亮显不起作用,虽然跟时走了pCmdUI-> Enable(FALSE)但对应的菜单还是亮显,亮显的点了又不起作用,请问各位怎么处理?

[解决办法]
1:
Class CDlgColor : public CDialog
{
afx_msg void OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu);
}

2:
BEGIN_MESSAGE_MAP(CDlgColor, CDialog)
ON_WM_INITMENUPOPUP()
END_MESSAGE_MAP()

3:
/**
* 得到右键菜单
*/
LRESULT CDlgColor::OnGetMenu(WPARAM wParam,LPARAM lParam)
{
CPoint ptMenu;
GetCursorPos(&ptMenu);
CMenuEx menu;
menu.LoadMenu(IDR_MENU_POP);
if(menu.GetSubMenu(7))
{
menu.GetSubMenu(7)-> TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,ptMenu.x,ptMenu.y,this,NULL);
}
return TRUE;
}

4:
/**
* 菜单弹出前消息响应
*/
void CDlgColor::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
CDialog::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
if (bSysMenu)
{
return;
}
pPopupMenu-> EnableMenuItem(ID_MENU_ID, MF_BYCOMMAND | MF_GRAYED);
}
[解决办法]
补充一下:
如果你非要觉得像MFC那样用UPDATE_COMMOND_UI消息的话
第四步改为:
/**
* 菜单弹出前消息响应
*/
void CDlgColor::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
CDialog::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
if (bSysMenu)
{
return;
}
CPublicFunction::InitMenuPopupDoUpdate(pPopupMenu,this);
}

void CPublicFunction::InitMenuPopupDoUpdate(CMenu* pMenu,CWnd *pWnd)
{
ASSERT(pMenu && pWnd);
/**
* 设置菜单
*/
CCmdUI state;
state.m_pMenu = pMenu;
ASSERT(state.m_pOther == NULL);
ASSERT(state.m_pParentMenu == NULL);

/**
* 设置父菜单
*/
HMENU hParentMenu;
if (AfxGetThreadState()-> m_hTrackingMenu == pMenu-> m_hMenu)
{
state.m_pParentMenu = pMenu;
}
else if ((hParentMenu = ::GetMenu(pWnd-> m_hWnd)) != NULL)
{
CWnd* pParent = pWnd-> GetTopLevelParent();
if (pParent != NULL && (hParentMenu = ::GetMenu(pParent-> m_hWnd)) != NULL)
{
int nIndexMax = ::GetMenuItemCount(hParentMenu);
for (int nIndex = 0; nIndex < nIndexMax; nIndex++)
{
if (::GetSubMenu(hParentMenu, nIndex) == pMenu-> m_hMenu)
{
state.m_pParentMenu = CMenu::FromHandle(hParentMenu);
break;
}
}
}
}

state.m_nIndexMax = pMenu-> GetMenuItemCount();
for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax;state.m_nIndex++)
{
state.m_nID = pMenu-> GetMenuItemID(state.m_nIndex);
if (state.m_nID == 0)
{
continue;
}

ASSERT(state.m_pOther == NULL);
ASSERT(state.m_pMenu != NULL);

/**
* 弹出菜单
*/
if (state.m_nID == (UINT)-1)
{
state.m_pSubMenu = pMenu-> GetSubMenu(state.m_nIndex);
if (state.m_pSubMenu == NULL ||
(state.m_nID = state.m_pSubMenu-> GetMenuItemID(0)) == 0 ||
state.m_nID == (UINT)-1)
{
continue;
}
state.DoUpdate(pWnd, FALSE);
}
else
{
/**
* 普通菜单
*/
state.m_pSubMenu = NULL;
state.DoUpdate(pWnd, false);
}

//调整菜单的最大,因为在此期间可能新增,删除菜单
UINT nCount = pMenu-> GetMenuItemCount();
if (nCount < state.m_nIndexMax)


{
state.m_nIndex -= (state.m_nIndexMax - nCount);
while (state.m_nIndex < nCount && pMenu-> GetMenuItemID(state.m_nIndex) == state.m_nID)
{
state.m_nIndex++;
}
}
state.m_nIndexMax = nCount;
}
}

然后你就可以用ON_UPDATE_COMMAND_UI进行消息映射编程了。

MFC也是这样做的。

热点排行