Solved

Retrieving CTreeCtrl Item HTREEITEMs  (not RootItem)

Posted on 1998-07-21
2
1,596 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

Netscaler Common Configuration How To guides

If you use NetScaler you will want to see these guides. The NetScaler How To Guides show administrators how to get NetScaler up and configured by providing instructions for common scenarios and some not so common ones.

Question has a verified solution.

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

Often, when implementing a feature, you won't know how certain events should be handled at the point where they occur and you'd rather defer to the user of your function or class. For example, a XML parser will extract a tag from the source code, wh…
C++ Properties One feature missing from standard C++ that you will find in many other Object Oriented Programming languages is something called a Property (http://www.experts-exchange.com/Programming/Languages/CPP/A_3912-Object-Properties-in-C.ht…
The goal of the video will be to teach the user the difference and consequence of passing data by value vs passing data by reference in C++. An example of passing data by value as well as an example of passing data by reference will be be given. Bot…
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.

770 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