//首先做好自动更新宏
ON_UPDATE_COMMAND_UI_RANGE(ID_POPUPMENU_FIRST, ID_POPUPMENU_LAST, OnUpdatePopupMenuCmd)
//再声明更新消息函数
afx_msg void OnUpdatePopupMenuCmd(CCmdUI* pCmdUI);
//再做好函数
void CYourView::OnUpdatePopupMenuCmd(CCmdUI* pCmdUI)
{
BOOL bEnable = FALSE;
switch (pCmdUI->m_nID)
{
case ID_POPUPMENU_FIRST:
if (....)
{
bEnable = TRUE;
}
break;
case //........
case ID_POPUPMENU_LAST:
if (....)
{
bEnable = TRUE;
}
break;
}
pCmdUI->Enable(bEnable);
}
//在WM_CONTEXTMENU消息中做好弹出代码,或把代码放到WM_RBUTTONUP消息中
void CYourView::OnContextMenu(CWnd* pWnd, CPoint point)
{
HMENU hMenu = ::LoadMenu(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDR_POPUP));//弹出菜单资源
HMENU hPopup = GetSubMenu(hMenu, 0);//第0个子菜单
POINT pt = {point.x, point.y};
::ClientToScreen(m_hWnd, &pt);
::TrackPopupMenu(hPopup, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_VERTICAL, pt.x, pt.y, 0, m_hWnd, NULL);//弹出它
}
ON_UPDATE_COMMAND_UI_RANGE(ID_POPUPMENU_FIRST, ID_POPUPMENU_LAST, OnUpdatePopupMenuCmd)
//再声明更新消息函数
afx_msg void OnUpdatePopupMenuCmd(CCmdUI* pCmdUI);
//再做好函数
void CYourView::OnUpdatePopupMenuCmd(CCmdUI* pCmdUI)
{
BOOL bEnable = FALSE;
switch (pCmdUI->m_nID)
{
case ID_POPUPMENU_FIRST:
if (....)
{
bEnable = TRUE;
}
break;
case //........
case ID_POPUPMENU_LAST:
if (....)
{
bEnable = TRUE;
}
break;
}
pCmdUI->Enable(bEnable);
}
//在WM_CONTEXTMENU消息中做好弹出代码,或把代码放到WM_RBUTTONUP消息中
void CYourView::OnContextMenu(CWnd* pWnd, CPoint point)
{
HMENU hMenu = ::LoadMenu(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDR_POPUP));//弹出菜单资源
HMENU hPopup = GetSubMenu(hMenu, 0);//第0个子菜单
POINT pt = {point.x, point.y};
::ClientToScreen(m_hWnd, &pt);
::TrackPopupMenu(hPopup, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_VERTICAL, pt.x, pt.y, 0, m_hWnd, NULL);//弹出它
}
你运行时会发现,你的弹出的菜单不会响应自动更新.跟踪一下,你会发现,你的自动更新函数没有被执行.如何做才能让左键弹出菜单响应自动更新呢?其实很简单:
//添加WM_INITMENUPOPUP消息响应函数
void CYourView::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
CScrollView::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
int nCount = pPopupMenu->GetMenuItemCount();
CCmdUI cmd;//创建自动更新类
cmd.m_pMenu = pPopupMenu;
cmd.m_nIndexMax = nCount;//MSDN上未介绍的成员变量
for (int i = 0; i < nCount; i ++)
{
UINT nID = pPopupMenu->GetMenuItemID(i);
if (nID != 0)//如果不是分隔符
{
cmd.m_nIndex = i;
cmd.m_nID = nID;
cmd.DoUpdate(this, TRUE);//MSDN上未介绍的成员函数,可以找到自动更新宏,传入CCmdUI指针,来执行自动更新
}
}
}
这样就可以了,以上代码测试通过...void CYourView::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
CScrollView::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
int nCount = pPopupMenu->GetMenuItemCount();
CCmdUI cmd;//创建自动更新类
cmd.m_pMenu = pPopupMenu;
cmd.m_nIndexMax = nCount;//MSDN上未介绍的成员变量
for (int i = 0; i < nCount; i ++)
{
UINT nID = pPopupMenu->GetMenuItemID(i);
if (nID != 0)//如果不是分隔符
{
cmd.m_nIndex = i;
cmd.m_nID = nID;
cmd.DoUpdate(this, TRUE);//MSDN上未介绍的成员函数,可以找到自动更新宏,传入CCmdUI指针,来执行自动更新
}
}
}