本人遇到一个小问题,希望大侠们给个解决方法,非常感谢我想实现对“树”的一个节点选择,然后弹出相应对话框的功能。
我发现当我选择一个节点后,该节点得到焦点,窗口可以弹出;但是当我关掉弹出窗口,再一次选择该节点后,就没有反应!我的初衷是当我再次选择该节点的时候应该再一次弹出对应窗口,不知道有什么解决办法么?在线等待中!附上代码:void CUSBoperateDlg::OnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult) 
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
HTREEITEM hItem=pNMTreeView->itemNew.hItem;
if(hItem == NULL) 
return;
CString strItemText=m_tree.GetItemText(hItem); if(strItemText.CompareNoCase(_T("本机配置"))==0)
{
CLocalSet lsdlg;
lsdlg.DoModal();
return;
}
         *pResult = 0;
}

解决方案 »

  1.   

    你用change消息肯定是不合适了。选中的节点再选中,不会产生change事件。
      

  2.   

    我尝试过了,也许方法不对,或者是我还不会用NM_CLICK消息,反正是没有成功,能给个实际例子么?
      

  3.   

    简单的写了一下,这样可以得到选中哪个节点。
    void CAboutDlg::OnClickTree1(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; 
    CPoint pt;
    GetCursorPos(&pt);
    ScreenToClient(&pt);
    CRect rc;
    m_Tree1.GetWindowRect(rc);
    ScreenToClient(rc);
    pt.x -= rc.left;
    pt.y -= rc.top;
    HTREEITEM hItem = m_Tree1.HitTest(pt);
    CString sInfo = m_Tree1.GetItemText(hItem);
    AfxMessageBox(sInfo);
    *pResult = 0;
    }
    当然,可以优化。
      

  4.   

    那使用了这个OnClickTree1消息响应,还需要用change这个响应么?
      

  5.   

    不需要了啊。用当前鼠标位置进行判断选中了哪个节点。和change就没有关系了。
      

  6.   

    把你OnClickTree1的代码贴来看看
      

  7.   


    void CUSBoperateDlg::OnClickTree1(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; 
        CPoint pt;
        GetCursorPos(&pt);
        ScreenToClient(&pt);
        CRect rc;
        m_tree.GetWindowRect(rc);
        ScreenToClient(rc);
        pt.x -= rc.left;
        pt.y -= rc.top; HTREEITEM hItem=pNMTreeView->itemNew.hItem;
    if(hItem == NULL) 
    return;
    CString strItemText=m_tree.GetItemText(hItem);
    AfxMessageBox(strItemText);
    *pResult = 0;
    }我去吃饭了,呵呵,多谢你的关注!
      

  8.   

    我说兄弟啊,你眼神怎么啦。没看到我的代码中用HitTest么??????????????????????????
    你怎么还用HTREEITEM hItem=pNMTreeView->itemNew.hItem;不是见鬼了么。
      

  9.   

    兄弟,给你我开发的例子,用于双击树控件,然后将选择的文件显示在edit中:
    void CReadXmlDlg::OnDblclkTree1(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    // TODO: Add your control notification handler code here
    CFileFind filefd;
    HTREEITEM parent;
    HTREEITEM item = m_Tree.GetSelectedItem();
    if(m_Tree.GetChildItem(item))return;
    parent = item;
    CString rootstr = m_Tree.GetItemText(item);
        
    CString temp;
    CString tempPath;
    CString lstr;
    CString XmlPath;
    if(rootstr.Find("\\") == 2)
    {
    lstr.Format("%s*.*",rootstr);
    }
    else
    {

    CString strparent;
    while(1)
    {
    parent = m_Tree.GetParentItem(parent);
    strparent = m_Tree.GetItemText(parent);
    if(strparent.Find("\\") == 2)
    goto end;
    temp += strparent;
        tempPath=strparent+tempPath; temp += "\\";
    tempPath ="\\"+tempPath;
    }
    end:
    CString root = m_Tree.GetItemText(parent);
    //MessageBox("root:"+root+"tempPath:"+tempPath+"rootstr:"+rootstr);
    lstr.Format("%s%s%s\\*.*",root,temp,rootstr);
    XmlPath.Format("%s%s\\%s",root,tempPath,rootstr);
    //MessageBox("root:"+root+"tmp:"+temp+"rootstr:"+rootstr);
    }
    BOOL bfinded = filefd.FindFile(lstr);
    while(bfinded)
    {
    bfinded = filefd.FindNextFile();
    CString filepath;
    //if(filefd.IsDirectory()&&!filefd.IsDots())
    if(!filefd.IsDots())
    {
    SHGetFileInfo(filefd.GetFilePath(),0,&fileinfo,sizeof(fileinfo),
    SHGFI_ICON);
    imindex = m_ImageList.Add(fileinfo.hIcon);
    m_Tree.InsertItem(filefd.GetFileName(),imindex,imindex,item);
    }
    }
    //XmlPath=XmlPath+"\\";
    m_EditXMLpath.SetWindowText(XmlPath);

    *pResult = 0;
    }
      

  10.   

    其中
    XmlPath.Format("%s%s\\%s",root,tempPath,rootstr); 
    就是获取当前XML文件的完全路径,实际上什么文件都一样获取完全路径,只是我把它用于XML读写,才命名为XmlPath.