首页 > 技术文章 > CTreeCtrl中,右键点击并没有选中节点

vipwtl 2016-11-21 16:45 原文

直接上代码,响应右键点击,并弹出菜单

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。

 

推荐阅读