void CMytreeDlg::OnNMRclickTree1(NMHDR *pNMHDR, LRESULT *pResult)函数
{ this
CPoint point(GetMessagePos()); spa
unsigned int nFlags = 0; 调试
m_tree.ScreenToClient(&point); orm
HTREEITEM hItem = m_tree.HitTest(point,&nFlags); ci
if ((nFlags& TVHT_ONITEM) &&(hItem!=NULL))资源
{ it
m_tree.SetFocus(); io
m_tree.SelectItem( hItem ); ast
CMenu MyMenu;
MyMenu.LoadMenu(IDR_MENU1);//加载菜单资源
CMenu* popup=MyMenu.GetSubMenu(0);
GetCursorPos(&point);//获取当前光标的位置,以便使得菜单能够跟随光标这里也能够用m_tree.ClientToScreen(&point);
popup->TrackPopupMenu(TPM_LEFTBUTTON|TPM_LEFTALIGN,point.x,point.y,this);
}
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
}
须要注意的是客户与屏幕坐标的转换问题,注意 GetCursorPos返回屏幕坐标,HitTest使用的是客户坐标。这里的GetCursorPos也可换成GetmessagePos 除了用法稍有不一样我没发现实际调试后有什么不一样之处MSDN里是这样描述其不一样之处的:要获得光标的当前位置而不是上一个消息发生时的位置,调用函数GetCursorPos。