VS2010 MFC如何添加菜单栏与弹出式菜单

83 篇文章 4 订阅

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;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

txwtech笛克特科

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值