VS2010 MFC如何添加菜单栏与弹出式菜单
右键弹出式菜单代码:
void CVs2010_MenuDlg::OnRButtonDown(UINT nFlags, CPoint point) //右键点击屏幕弹出菜单
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
/*POINT screenPoint=point;
ClientToScreen(&screenPoint);
CMenu menu;
VERIFY(menu.LoadMenu(IDR_MENU_RightButton));
CMenu* pPopup=menu.GetSubMenu(0);
ASSERT(pPopup!=NULL);
pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,screenPoint.x,screenPoint.y,AfxGetMainWnd());*/
CMenu m_Menu;
CMenu* pMenu;
CRect rect;
ClientToScreen(&point);//坐标转换
m_Menu.LoadMenu(IDR_MENU_RightButton);//加载菜单资源
pMenu=m_Menu.GetSubMenu(0);//获取菜单句柄
rect.top=point.x;
rect.left=point.y;
pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,rect.top,rect.left,this,&rect);//显示弹出菜单
CDialogEx::OnRButtonDown(nFlags, point);//调用基类的方法
}
效果:
相关报错代码:
Vs2010_Menu.exe 中的 0x78ec643e (mfc100d.dll) 处有未经处理的异常: 0xC0000005: 读取位置 0x00000004 时发生访问冲突
BOOL CMenu::TrackPopupMenu(UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect) { ASSERT(m_hMenu != NULL);//菜单的下级无内容,就会报错
_AFX_THREAD_STATE* pThreadState = AfxGetThreadState(); HWND hWndOld = pThreadState->m_hTrackingWindow; HMENU hMenuOld = pThreadState->m_hTrackingMenu; pThreadState->m_hTrackingWindow = pWnd->GetSafeHwnd(); pThreadState->m_hTrackingMenu = m_hMenu; BOOL bOK = ::TrackPopupMenu(m_hMenu, nFlags, x, y, 0, pThreadState->m_hTrackingWindow, lpRect); pThreadState->m_hTrackingWindow = hWndOld; pThreadState->m_hTrackingMenu = hMenuOld;
return bOK; }