如何实现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。

转载于:https://my.oschina.net/u/164131/blog/28451

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值