首先说一下添加菜单事件:
1.资源视图添加Menu 菜单,添加菜单按钮,更改按钮ID ==》ID_LOGOUTDEV;
2.绑定消息响应函数
ON_COMMAND(ID_LOGOUTDEV, &CThermometryDlg::OnLogoutDev)
3.OnLogoutDev() 函数实现。
4.在需要弹出菜单的地方加入如下代码:
CPoint pt;
//pt = GetCurrentMessage()->pt; //获取当前鼠标点击消息的坐标点
GetCursorPos(&pt);
m_Devtree.ScreenToClient(&pt); //将鼠标的屏幕坐标,转换成树形控件的客户区坐标
UINT uFlags = 0;
HTREEITEM hItem = m_Devtree.HitTest(pt, &uFlags); //然后做点击测试
if ((hItem != NULL) && (TVHT_ONITEM & uFlags)) //如果点击的位置是在节点位置上面
{
m_Devtree.Select(hItem,TVGN_CARET);//设置点击节点为当前选中节点
CMenu menu;
menu.LoadMenu(IDR_DELMENU);
CMenu* pMenu=menu.GetSubMenu(0);
CPoint pos;
GetCursorPos(&pos);
SetForegroundWindow();
pMen->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,AfxGetMainWnd());
PostMessage(WM_NULL,0,0);
DestroyMenu(menu);
}
即可完成菜单显示;
现在说一下问题:
如此这般完事,点击菜单按钮,却发现按钮事件不响应,断点也进不了。
原因就在于AfxGetMainWnd();这句获取的窗口响应句柄有问题,并不是我们上边写的CThermometryDlg的句柄,所以映射的消息跑到主界面去了,这里改成这样:pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,this);即可。