TreeView Control + Item farbe
-
Hey @all,
ist es möglich pro Item eine andere Farbe zu verwenden? und wenn ja wie bewerkstellige ich das?
Hier mal der Code den ich bisher habe:
HTREEITEM AddItemToTree(HWND hwndTV, LPSTR lpszItem, HTREEITEM parent, HTREEITEM brother, int image = 1) { TVITEM tvi; TVINSERTSTRUCT tvins; HTREEITEM hItem; tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; tvi.pszText = lpszItem; tvi.cchTextMax = lstrlen(lpszItem); tvi.iImage = image; tvi.iSelectedImage = image; // 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; }Die Reference speichere ich mir dann in einer std::map<HTREEITEM, ItemInfo>
struct ItemInfo { int level; };nun möchte ich die komplette map durchgehen und die Items je nach "level" eine Farbe zuweisen.
Wäre sehr dankbar wenn mir diesbezüglich jemand helfen könnte
Lg _freeze_
-
Man kann dies in der MessageProc des Fensters beim Zeichnen des Listviews steuern. Eventuell ist es bei Treeviews ja ähnlich. Habe es selber noch nicht probiert. NMTVCUSTOMDRAW müsste da hilfreich sein.
Folgende Codeschnipsel könnten hilfreich sein. Es wird jede zweite Zeile blau eingefärbt. Die Bedingung kann man dabei selber bestimmen, da custom.dwItemSpec den Index des Listviewelements enthält. Ansonsten in der MSDN mal nach den Strukturen NMHDR, NMCUSTOMDRAW und LPNMLVCUSTOMDRAW bzw. dann NMTVCUSTOMDRAW suchen.
NMHDR notify; NMCUSTOMDRAW custom; LPNMLVCUSTOMDRAW lvcustom;case WM_NOTIFY: lvcustom = (LPNMLVCUSTOMDRAW) lParam; custom = lvcustom->nmcd; notify = custom.hdr; if( (notify.idFrom == IDC_LISTV) &&(notify.code == NM_CUSTOMDRAW) ) { switch(custom.dwDrawStage) { case CDDS_PREPAINT: SetWindowLong(hDlg, DWL_MSGRESULT, CDRF_NOTIFYITEMDRAW); return CDRF_NOTIFYITEMDRAW; case CDDS_ITEMPREPAINT: SetWindowLong(hDlg, DWL_MSGRESULT, CDRF_NOTIFYSUBITEMDRAW); return CDRF_NOTIFYSUBITEMDRAW; case CDDS_ITEMPREPAINT|CDDS_SUBITEM: if(custom.dwItemSpec % 2 == 0) { lvcustom->clrTextBk = RGB(187, 233, 255); } break; } } break;