Windows Programmierung: Baumdiagramm |
Einführende Informationen über die Programmierung von Kontrollelementen werden hier vorausgesetzt.
#include "commctrl.h" InitCommonControls(); hTree = CreateWindowEx(0, WC_TREEVIEW , "Tree", WS_VISIBLE|WS_CHILD|WS_BORDER| TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS, 1, 1, 300, 100, // Positionen auf dem Elternfenster hWnd, (HMENU)ID_TREE, hInst, 0); |
Im Dialog wird sie einfach in der Ressource definiert.
Kommt es zu nicht aufgelösten Externals, sollte man prüfen, ob die Library für die Common Controls (comctl32.lib) eingebunden wird.
HTREEITEM AddItemToTree(HWND hwndTV, LPSTR lpszItem, HTREEITEM parent, HTREEITEM brother) { TVITEM tvi; TVINSERTSTRUCT tvins; HTREEITEM hItem; tvi.mask = TVIF_TEXT; tvi.pszText = lpszItem; tvi.cchTextMax = lstrlen(lpszItem); // die Insert-Struktur wird vorbereitet tvins.item = tvi; if (brother) { tvins.hInsertAfter = brother; } else { tvins.hInsertAfter = TVI_FIRST; } if (parent==0) { tvins.hParent = TVI_ROOT; } else { tvins.hParent = parent; } // Nachricht zum Einbinden an das Kontrollelement versenden hItem = (HTREEITEM)SendMessage(hwndTV, TVM_INSERTITEM, 0, (LPARAM)&tvins); return hItem; } . . . HTREEITEM opa,papa,onkel,bruder, ich; opa = AddItemToTree(hTree, "Opa", 0,0); papa = AddItemToTree(hTree, "Papa", opa,0); onkel = AddItemToTree(hTree, "Onkel", opa, papa); bruder = AddItemToTree(hTree, "Bruder", papa, 0); ich = AddItemToTree(hTree, "ich", papa, 0); |
Zwei Parameter bestimmen die Position des neuen Element. Das Elternelement und der direkte Nachbar, hier als brother bezeichnet. Beides wird in der Insert-Struktur festgelegt.
static HWND hTree=0; static int g_fDragging = FALSE; POINTS Pos; static HTREEITEM hItem; HTREEITEM htiTarget; // handle to target item TVHITTESTINFO tvht; // hit test information . . . case WM_NOTIFY: switch (((LPNMHDR) lParam)->code) { case TVN_BEGINDRAG: // lParam wird auf LPNMTREEVIEW gecastet und weiterverarbeitet LPNMTREEVIEW lpnmtv = (LPNMTREEVIEW) lParam; hTree = lpnmtv->hdr.hwndFrom; HIMAGELIST himl; RECT rcItem; himl = TreeView_CreateDragImage(hTree, lpnmtv->itemNew.hItem); TreeView_GetItemRect(hTree, lpnmtv->itemNew.hItem, &rcItem, TRUE); ImageList_BeginDrag(himl, 0, 0, 0); ShowCursor(FALSE); SetCapture(GetParent(lpnmtv->hdr.hwndFrom)); g_fDragging = TRUE; break; } break; case WM_MOUSEMOVE: if (g_fDragging) { Pos = MAKEPOINTS(lParam); ImageList_DragMove(Pos.x, Pos.y); tvht.pt.x = Pos.x; tvht.pt.y = Pos.y; if ((htiTarget = TreeView_HitTest(hTree, &tvht)) != NULL) { TreeView_SelectDropTarget(hTree, htiTarget); } } break; case WM_LBUTTONUP: if (g_fDragging) { ImageList_EndDrag(); ReleaseCapture(); ShowCursor(TRUE); g_fDragging = FALSE; } break; |
case WM_NOTIFY: switch (((LPNMHDR) lParam)->code) { case TVN_ENDLABELEDIT: pItem = (LPNMTVDISPINFO) lParam; MessageBox(hWnd, pItem->item.pszText, "entry", MB_OK); return TRUE; |
Wurde das Editieren abgebrochen, wird das pszText-Element 0 sein.
Das Element pItem->item ist nicht das Original TV_ITEM des Baumes, aber die Elemente hItem, lParam und pszText stimmen mit dem Original überein. Für das normale Editieren des Titels reicht das normalerweise auch. Wird aber beispielsweise das Image in Abhängigkeit des Textes verändert, müsste man das Element explizit mit TreeView_GetItem holen.
Soll das Editieren komplett verhindert werden, wird die Nachricht TVN_BEGINLABELEDIT gefangen und TRUE zurückgegeben. Auch hier kann über lParam in gleicher Weise auf das Item zugegriffen werden und so beispielsweise eine bestimmte Itemgruppe ausgegrenzt werden.
Nachricht | Beschreibung |
---|---|
TVN_BEGINDRAG | Start einer Drag-And-Drop Aktion |
TVN_BEGINRDRAG | Start einer Drag-And-Drop Aktion über rechte Maustaste |
TVN_BEGINLABELEDIT | Start Editieren eines Labels |
TVN_ENDLABELEDIT | Ende Editieren eines Labels |
TVN_DELETEITEM | Item wird gelöscht |
TVN_GETDISPINFO | Das Kontrollelement erfragt Informationen zur Darstellung vom Elternfenster |
TVN_SETDISPINFO | Die Information des Elternfensters für das Item muß erneuert werden |
TVN_ITEMEXPANDED | Eine Liste von Kind-Items ist auseinandergezogen oder zusammengeklappt worden |
TVN_ITEMEXPANDING | Eine Liste von Kind-Items ist kurz davor, auseinandergezogen oder zusammengeklappt zu werden |
TVN_KEYDOWN | Taste wurde gedrückt |
TVN_SELCHANGED | Selektion zwischen den Items hat gewechselt |
TVN_SELCHANGING | Selektion zwischen den Items vor dem Wechsel |
Homepage - Windows-API-Programmierung | (C) Copyright 1999 Arnold Willemer |