树形控件想实现 单击其中节点做出针对性的反应(比如AfxMessageBox(点击节点的文字内容))
但用下面代码中未注释部分 每次提示都是上次点击的节点
用注释掉的部分(在CSDN找到的解答) 提示的内容为空(其实hItem为空)
请问到底应该怎么编写这个响应函数?谢谢!(我是在VS2005中做的程序)
void myCarRecordDlg::OnNMClickTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
//TODO: 在此添加控件通知处理程序代码

NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
TVITEM item = pNMTreeView-> itemNew;
HTREEITEM   CurItem=myTreeCtrl.GetSelectedItem(); 

AfxMessageBox(myTreeCtrl.GetItemText(CurItem/*item.hItem*/)); //CPoint point;
//ScreenToClient(&point);
////   Get   the   HTREEITEM   of   the   drop   target   and   exit   now   if   it's   NULL.   
//UINT nFlags;
//HTREEITEM hItem = myTreeCtrl.HitTest (point,&nFlags);
////if   (hItem   ==   NULL)
//// return;
//AfxMessageBox(myTreeCtrl.GetItemText(hItem));
*pResult = 0;
}

解决方案 »

  1.   

    CPoint point; 
    ::ScreenToClient(myTreeCtrl->hWnd,&point);   
    ////  Get  the  HTREEITEM  of  the  drop  target  and  exit  now  if  it's  NULL.  
    UINT nFlags; 
    HTREEITEM hItem = myTreeCtrl.HitTest (point,&nFlags); 
      

  2.   

    响应 TVN_SELCHANGED 比较好~NM_CLICK在 TreeView 上任何地方(不仅仅是item上,包括空白的地方)单击都会被触发void CtttreeDlg::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult)
    {
        LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);    AfxMessageBox(myTreeCtrl.GetItemText(pNMTreeView->itemNew.hItem));    *pResult = 0;
    }
      

  3.   

    CPoint point; 
    GetCursorPos(&point); 获取鼠标点击的位置...
    ScreenToClient(&point); 
    UINT nFlags; 
    HTREEITEM hItem = myTreeCtrl.HitTest(point,&nFlags); 
    if (hItem  ==  NULL) 
     return; AfxMessageBox(myTreeCtrl.GetItemText(hItem)); 
      

  4.   

    CPoint point; 
    GetCursorPos(&point); 获取鼠标点击的位置... 
    myTreeCtrl.ScreenToClient(&point); 转换为树控件位置...
    UINT nFlags; 
    HTREEITEM hItem = myTreeCtrl.HitTest(point,&nFlags); 
    if (hItem  ==  NULL) 
    return; AfxMessageBox(myTreeCtrl.GetItemText(hItem)); 
      

  5.   

    需要从屏幕坐标转换成Tree控件的坐标
      

  6.   

    myTreeCtrl->hWnderror C2039: 'hWnd' : is not a member of 'CTreeCtrl'myTreeCtrl.GetSafeHwnd() 用这个代替不知道 对不对 运行点击后 hItem为空 没有提示
      

  7.   

    太帅了 好使了
    下步改成 TVN 的谢谢各位了 一会给分
    可用代码:
    CPoint point;
    GetCursorPos(&point);
    myTreeCtrl.ScreenToClient(&point);   
    //   Get   the   HTREEITEM   of   the   drop   target   and   exit   now   if   it's   NULL.   
    UINT nFlags;
    HTREEITEM hItem = myTreeCtrl.HitTest (point,&nFlags);
    if   (hItem   ==   NULL)
    return;
    AfxMessageBox(myTreeCtrl.GetItemText(hItem));
    *pResult = 0;