Solved

Retrieving CTreeCtrl Item HTREEITEMs  (not RootItem)

Posted on 1998-07-21
2
1,611 Views
Last Modified: 2008-02-01
I am using a TreeCtrl from within a CTreeView derived class and have called GetTreeCtrl() method to retrieve a reference. All fine there.

I would like to get a handle to one of the TVITEMs using GetItem() and passing a TV_ITEM structure reference.

Using this method I can retrieve the item text using HTREEITEM and TVIF_TEXT|TVIF_HANDLE masks.

What I would like to do however, is fill the structure with a string (.pszText) and get the control to return the item reference.

I have tried:

TV_ITEM tvi;
tvi.pszText=(LPSTR)(LPCTSTR)strItem;   //previously filled item string
tvi.mask=TVIF_TEXT|TVIF_HANDLE;

pctl->GetItem(&tvi);

What happens, if you look at the debug window is the .state to value 8a8b (or something like that) reference changes, and so does the .pszText (this is filled with what looks like invalid memory).  I have assumed therefore that the call is trying to return the text value by using the HTREEITEM .hitem, which is not what I want.

How can I retrieve the HTREEITEM of the item i want?

REgards

Oscar
0
Comment
Question by:ossentoo
2 Comments
 
LVL 1

Accepted Solution

by:
fkurucz earned 70 total points
ID: 1168188
The HTREEITEM datatype is just an handle to an item.
The GetItem() function receives the associated data to the hItem handle.

To find an item by name, the tree has to be traversed.
This can be done recursiveley, starting from the root.

The following code is untested, but should work.


HTREEITEM hti = RecFindTreeItem("ThisOneToSearch", &MyTree);
// hti is now an handle to the searched item.
if (hti)
{
   // get data from hti
   DWORD dwData = MyTree.GetItemData(hti);
   ...
}


HTREEITEM RecFindTreeItem(
   const char *szCompare,
   CTreeCtrl *pTree,
   HTREEITEM hti = TVI_ROOT)
{
   HTREEITEM htiFound, htiNext, htiSub;
   char *szBuffer = new char[MAX_LEN];

   // test this item
   pTree->GetItemText(hti, szBuffer, MAX_LEN);
   if (strcmp(szBuffer, szCompare) == 0)
      return hti;

   // test items children
   htiSub = pTree->GetChildItem(hti);
   while (htiSub)
   {
      htiFound = RecursiveFindTreeItem(szCompare, pTree, htiSub);
      if (htiFound)
         return htiFound;
      htiSub = pTree->GetNextSiblingItem(htiSub);
   }
   return 0;
}


that should work.
If you exchange TEXT-data via the GetItem() funtion you always have to set the stringsize limmit in the cchTextMax field.

Hope it works,
  feri
0
 

Author Comment

by:ossentoo
ID: 1168189
Adjusted points to 75
0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Errors will happen. It is a fact of life for the programmer. How and when errors are detected have a great impact on quality and cost of a product. It is better to detect errors at compile time, when possible and practical. Errors that make their wa…
Written by John Humphreys C++ Threading and the POSIX Library This article will cover the basic information that you need to know in order to make use of the POSIX threading library available for C and C++ on UNIX and most Linux systems.   [s…
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.

829 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question