我想在一棵树里查找等于某一字符串的节点,只想到了自己遍历该树,一个一个的取值比较,有没有简单点的方法。
还有,还要把该点设置为选中,怎么设置啊?

解决方案 »

  1.   

    哦,刚刚看到,选中好像slelect()可以实现
      

  2.   

    用GetItem();设置TVITEM结构体中的一些参数就可以得到一个结点的HTREEITEM了.然后用SELECT()选中该结点即可.
      

  3.   

    楼主,我说错了,GetItem()不能返回一个结点的HTREEITEM.可能只有遍历整个树了才能找到了
      

  4.   

    FindNextItem traverses a tree searching for an item matching all the item attributes set in a TV_ITEM structure. In the TV_ITEM structure, the mask member specifies which attributes make up the search criteria. If a match is found, the function returns the handle otherwise NULL. This function uses the function GetNextItem, seen previously. The function only searches in one direction (down) and if hItem is NULL starts from the root of the tree. HTREEITEM CTreeCtrlEx::FindNextItem(TV_ITEM* pItem, HTREEITEM hItem)
    {
       ASSERT(::IsWindow(m_hWnd));   TV_ITEM hNextItem;   //Clear Item data
       ZeroMemory(&hNextItem, sizeof(hNextItem));   //The mask is used to retrieve the data to compare
       hNextItem.mask = pItem->mask;
       hNextItem.hItem = (hItem) ? GetNextItem(hItem) : GetRootItem();   //Prepare to compare pszText
       //Testing pItem->pszText protects the code from a client setting the
       //TVIF_TEXT bit but passing in a NULL pointer.
       if((pItem->mask & TVIF_TEXT) && pItem->pszText)
       {
          hNextItem.cchTextMax = strlen(pItem->pszText);      if(hNextItem.cchTextMax)
             hNextItem.pszText = new char[++hNextItem.cchTextMax];
       }   while(hNextItem.hItem)
       {
          if(Compare(pItem, hNextItem))
          {
             //Copy all the information into pItem and return
             memcpy(pItem, &hNextItem, sizeof(TV_ITEM));         //Free resources
             if(hNextItem.pszText)
                delete hNextItem.pszText;         return pItem->hItem;
          }      //The mask is used to retrieve the data to compare and must be
          //reset before calling Compare
          hNextItem.mask = pItem->mask;
          hNextItem.hItem = GetNextItem(hNextItem.hItem);
       }   //Set hItem in pItem
       pItem->hItem = NULL;   //Free resources
       if(hNextItem.pszText)
          delete hNextItem.pszText;   return NULL;
    }BOOL CTreeCtrlEx::Compare(TV_ITEM* pItem, TV_ITEM& tvTempItem)
    {
       //This call uses the .mask setting to just retrieve the values
       //that the client wants to compare.
       //Get all the data passed in by pItem
       GetItem(&tvTempItem);   //Reset the mask so I can keep track of the matching attributes
       tvTempItem.mask = 0;   if((pItem->mask & TVIF_STATE) &&
          (pItem->state == tvTempItem.state))
          tvTempItem.mask |= TVIF_STATE;   if((pItem->mask & TVIF_IMAGE) &&
          (pItem->iImage == tvTempItem.iImage))
          tvTempItem.mask |= TVIF_IMAGE;   if((pItem->mask & TVIF_PARAM) &&
          (pItem->lParam == tvTempItem.lParam))
          tvTempItem.mask |= TVIF_PARAM;   if((pItem->mask & TVIF_TEXT) &&
          pItem->pszText && tvTempItem.pszText && //Don't compare if either is NULL
          !strcmp(pItem->pszText, tvTempItem.pszText))
          tvTempItem.mask |= TVIF_TEXT;   if((pItem->mask & TVIF_CHILDREN) &&
          (pItem->cChildren == tvTempItem.cChildren))
          tvTempItem.mask |= TVIF_CHILDREN;   if((pItem->mask & TVIF_SELECTEDIMAGE) &&
          (pItem->iSelectedImage == tvTempItem.iSelectedImage))
          tvTempItem.mask |= TVIF_SELECTEDIMAGE;   //If by this point these two values are the same.
       //tvTempItem.hItem is the desired item
       return (pItem->mask == tvTempItem.mask);
    }
    //这是从codeguru上找到的,你看看合不合适