Finding an item (matching any member of TV_ITEM) | CodeGuru

Finding an item (matching any member of TV_ITEM)

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 […]

Written By
CodeGuru Staff
CodeGuru Staff
Apr 24, 1999
1 minute read
CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More

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);
}

Date Last Updated: April 24, 1999

CodeGuru Logo

CodeGuru covers topics related to Microsoft-related software development, mobile development, database management, and web application programming. In addition to tutorials and how-tos that teach programmers how to code in Microsoft-related languages and frameworks like C# and .Net, we also publish articles on software development tools, the latest in developer news, and advice for project managers. Cloud services such as Microsoft Azure and database options including SQL Server and MSSQL are also frequently covered.

Property of TechnologyAdvice. © 2026 TechnologyAdvice. All Rights Reserved

Advertiser Disclosure: Some of the products that appear on this site are from companies from which TechnologyAdvice receives compensation. This compensation may impact how and where products appear on this site including, for example, the order in which they appear. TechnologyAdvice does not include all companies or all types of products available in the marketplace.