CTreeCtrl中,右键点击并没有选中节点
直接上代码,响应右键点击,并弹出菜单
void CMytreeDlg::OnNMRclickTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
CPoint point(GetMessagePos());
unsigned int nFlags = 0;
m_tree.ScreenToClient(&point);
HTREEITEM hItem = m_tree.HitTest(point,&nFlags);
if ((nFlags& TVHT_ONITEM) &&(hItem!=NULL))
{
m_tree.SetFocus();
m_tree.SelectItem( hItem );
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。