Avatar billede justask Nybegynder
20. oktober 2004 - 14:17 Der er 7 kommentarer og
1 løsning

kan man få et TVITEM ud af et TreeView?

Hej

Man kan indsætte et TVITEM i en TVINSERTSTRUCT som så kan indsættes i et TreeView via ::TreeView_InsertItem(...), denne returnerer så et handle; HTREEITEM. Men hvordan kommer man tilbage igen, fra HTREEITEM til et TVITEM??

Pointen er, at jeg holder en pointer i TVITEM.lParam til en klasse som jeg gerne vil til tilgå. På diverse eventhandlere (ex. OnTvnSelchanged) får man får man leveret en LPNMTREEVIEW hvor man via ->itemNew.lParam kan få fat i det relevante TVITEM.lParam. Men når jeg udenfor en eventhandler gerne vil cykle igennem TreeView'et via bla. ::TreeView_GetNextSibling(...) får jeg kun fat i HTREEITEMS som jeg ikke ved hvordan man konverterer til noget brugbart.

Håber I kan hjælpe mig.....
Avatar billede jpk Nybegynder
20. oktober 2004 - 14:58 #1
LParam værdien i en TVN_SELCHANGED notification indeholder en pointer til en NMTREEVIEW. Så du kan:

LPNMTREEVIEW pnmtv = (LPNMTREEVIEW)lParam;
TVITEM* ptvItem = pnmtv->itemNew; // Nyt valgt item
// ptvItem->lParam er den værdi du vil have fat i...
Avatar billede justask Nybegynder
20. oktober 2004 - 15:15 #2
Ja, precis.

Men hvis jeg ikke er notificeret, bare vil cykle igennem alle noderne i træet (via ::TreeView_GetNextSibling(...)), hvordan får da fat i min lParam??
Avatar billede jpk Nybegynder
20. oktober 2004 - 15:43 #3
Brug TreeView_GetItem makroen.

Dens signatur ser sådan ud:

BOOL TreeView_GetItem(
  HWND hwndTV,
  LPTVITEM pitem
  );

Sæt pitem members:
mask = TVIF_HANDLE
hItem = det handle der returneres fra fx TreeView_GetNextSibling
Avatar billede justask Nybegynder
21. oktober 2004 - 09:24 #4
Hej jpk og tak for dit svar. Det lyder som den rigtige løsning, dog kan jeg ikke få det til at virke  :(  Min kode ser ud som følger:

m_tree = GetDlgItem(IDC_TREE_VIEW);
TVITEMEX hitem;
hitem.mask = TVIF_HANDLE | TVIF_PARAM;
hitem.hItem = 0;

ITreeItem* info;
_bstr_t tmp = "";
BOOL success = FALSE;
HTREEITEM current = TreeView_GetRoot ( m_tree.m_hWnd );
current = TreeView_GetNextSibling ( m_tree.m_hWnd, current );

while ( current!=0 )
{
    success = TreeView_GetItem ( m_tree.m_hWnd, &hitem );
    if ( success==TRUE )
    {
        info = (ITreeItem*) hitem.lParam;
        /* do stuff w info */
    }
    current = TreeView_GetNextSibling ( m_tree.m_hWnd, current );
}

ITreeItem er min egen klasse som jeg vil ha' fat i og jeg kan fint få fat i den via LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); i mine notifikationshandlere.

Problemet i koden herover er at "success = TreeView_GetItem ( m_tree.m_hWnd, &hitem );" altid bliver 0.
Avatar billede jpk Nybegynder
21. oktober 2004 - 10:13 #5
Som jeg skrev:

Sæt pitem members:
mask = TVIF_HANDLE
hItem = det handle der returneres fra fx TreeView_GetNextSibling
Avatar billede jpk Nybegynder
21. oktober 2004 - 10:15 #6
Fx:

TVITEMEX hitem;
hitem.mask = TVIF_HANDLE;
hitem.hItem = TreeView_GetRoot(hTreeWnd);
BOOL success = TreeView_GetItem(hTreeWnd, &hitem);
Avatar billede justask Nybegynder
21. oktober 2004 - 10:57 #7
ahh - fandt endelig fejlen  :)  hitem.hItem skal jo ikke sættes til 0...

hitem.hItem = TreeView_GetRoot ( m_tree.m_hWnd );

Tak for hjælpen.


hmm ... Hvordan giver jeg point..?
Avatar billede jpk Nybegynder
21. oktober 2004 - 11:14 #8
Jeg ligger et svar og du accepterer det...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis