2016-11-03 5 views
0

Ich erstellte einen Dialog mit einem Tree-Steuerelement, das Daten an ein Listensteuerelement abruft, wenn auf einen bestimmten Knoten des Treecontrol geklickt wird. So habe ich versucht Knoten einzufügen.Get lparam Wert aus dem htreeitem C++

CString *sCommonAppkey = new CString(_szApp + sIsPath); 

HTREEITEM hrCommon = m_cTreeCtrl.InsertItem(TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM, _T("Common"), icoPlanit, icoPlanit, 0, 0, (LPARAM)(LPCTSTR)sCommonAppkey, NULL, NULL); 

Wenn an einem Knoten angeklickt es an den Ereignishandler wird gerichtet „OnTvnSelchangedExample“ und die Daten abgerufen aus dem Pfad in „lparam“ Parameter in der Methode des InsertItem HTREEITEM angegeben.

void **CExample**::OnTvnSelchangedExample(NMHDR *pNMHDR, LRESULT *pResult) 
{ 
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); 

LPARAM lp = pNMTreeView->itemNew.lParam; 

    CString *sTempKey = (CString *)lp; 
    CString path = sTempKey->GetBuffer(); 
} 

Ich kann den Lparam-Wert nur im Event-Handler zugreifen.

Jetzt möchte ich Suchfunktionalität für die gesamten Baumdaten implementieren.

Also brauche ich den Lparam-Wert aller Tree-Handles der Reihe nach durch Iterieren, so dass ich nach dem bestimmten Text in der Struktur suchen kann. Also, ohne auf einen Knoten des Baumes zu klicken, gibt es irgendeine Möglichkeit, den lparam-Wert von Tree handle (HTREEITEM)

Antwort

0

zu erhalten Sie können den Baum von der Wurzel mit TreeView_GetChild durchlaufen, dort ist das Handle das Baum-Handle. Rufen Sie TreeView_GetItem auf, um das Handle abzurufen.

TVITEMEX item; 
item.mask = TVIF_PARAM; 
item.hItem = hrCommon; 

TreeView_GetItem(handle_, &item); 
CString* text = (CString*)item.lParam; 
+0

es tut mir leid, wenn ich Sie eine dumme Frage stelle. Aber TreeView_GetItem() übernimmt HWND-Handle und wie kann ich ein Tree-Handle darin übergeben – user3655089

0

Der Baum-Traversal ist einfach mit Rekursion implementieren:

void CMyTreeCtrl::Iterate(HTREEITEM hItem) 
{ 
    if (hItem) 
    { 
     // Use the tree node corresponding to hItem 
     // ..... 
     // End of using hItem 
     hItem = GetNextItem(hItem, TVGN_CHILD); 
     while (hItem) 
     { 
      Iterate(hItem); 
      hItem = GetNextItem(hItem, TVGN_NEXT); 
     } 
    } 
    else 
    { 
     HTREEITEM hItem = GetNextItem(NULL, TVGN_ROOT); 
     while (hItem) 
     { 
      Iterate(hItem); 
      hItem = GetNextItem(hItem, TVGN_NEXT); 
     } 
    } 
} 

Wenn Sie die Artikeldaten müssen Sie einfach lernen wollen GetItemData(hItem) nennen. Es gibt DWORD_PTR zurück. In Ihrem Fall müssen Sie es in CString* umwandeln. Das ist es.

WICHTIG: In diesem Beispiel ist CMyTreeCtrl von CTreeCtrl abgeleitet.