TreeView: Icons werden für alle Einträge übernommen
-
Hallo!
Um den Code in der Main-Datei übersichtlicher zu gestalten, habe ich ein paar Prozeduren zur Erstellung eines TreeViews in eine andere Datei ausgelagert. Soweit funktioniert alles ganz OK, wenn ich allerdings für einen Eintrag ein Icon angebe, wird das Icon auf alle anderen Einträge übernommen./*** w_treeview.h ***/ #ifndef __W_TREEVIEW_H__ #define __W_TREEVIEW_H__ #define WTV_IGNORE -1 #ifdef _INC_COMMCTRL #define WTreeView_Expand(hWnd,hItem,iFlags) TreeView_Expand(hWnd,hItem,iFlags); #else #error CommCtrl.h wurde nicht inkludiert! #endif HWND WTreeView_Create ( HWND hWnd, //Parent-Fenster HINSTANCE hInstance, //Instance des Hauptprogramms DWORD dwStyle = IGNORE //Zusätzliche Styles ); HTREEITEM WTreeView_Add ( HWND hTree, LPWSTR pszText, //Text des Eintrags HTREEITEM hParent = TVI_ROOT, //Handle zum Parent-Eintrag (standardmäßig die Wurzel) HTREEITEM hAfter = TVI_FIRST, //Handle zum Eintrag, nach dem der neue Eintrag hinzugefügt werden soll (standardmäßig das erste Element) ULONG ulIcon = WTV_IGNORE //Icon (Konstante zu einem in der RC inkludierten Icon, standardmäßig kein Icon) ); #endif/*** w_treeview.cpp ***/ #include "w_treeview.h" #include "stdafx.h" static HINSTANCE hInst = NULL; static HIMAGELIST hIml = NULL; HWND WTreeView_Create ( HWND hWnd, HINSTANCE hInstance, DWORD dwStyle ) { hInst = hInstance; HWND hTree = CreateWindowEx ( NULL, WC_TREEVIEW, NULL, WS_CHILD|WS_VISIBLE|WS_BORDER|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|TVS_DISABLEDRAGDROP|dwStyle, 0,48,200,374, hWnd, NULL, hInst, NULL ); hIml = ImageList_Create ( 16, 16, ILC_COLOR32|ILC_MASK, 0, 10 ); //Neue ImageList für eigene Icons TreeView_SetImageList ( hTree, hIml, TVSIL_NORMAL ); //hIml als ImageList für das Treeview einstellen return hTree; } HTREEITEM WTreeView_Add ( HWND hTree, LPWSTR pszText, HTREEITEM hParent, HTREEITEM hAfter, ULONG ulIcon ) { TVITEM tvi; TVINSERTSTRUCT tvins; HTREEITEM htiItem; tvi.mask = TVIF_TEXT; tvi.pszText = pszText; tvi.cchTextMax = lstrlen(pszText); tvins.item = tvi; tvins.hParent = hParent; tvins.hInsertAfter = hAfter; if ( ulIcon != WTV_IGNORE ) { HICON hicon = LoadIcon ( hInst, MAKEINTRESOURCE(ulIcon) ); //Das angegebene Icon aus der Ressource laden tvi.iImage = ImageList_AddIcon ( hIml, hicon ); //Hinzufügen (Rückgabewert = Index des hinzugefügten Icons) DestroyIcon(hicon); //Icon zerstören } htiItem = (HTREEITEM) SendMessage ( hTree, TVM_INSERTITEM, NULL, (LPARAM)&tvins ); // tvins hinzufügen return htiItem; }/*** main.cpp ***/ //includes [...] int APIENTRY _tWinMain ( HINSTANCE hInstance, HINSTANCE prevInstance, LPTSTR cmdLine, int cmdShow) { //Fenster registrieren und erstellen [...] HWND hTree = WTreeView_Create ( hMain, hInstance ); HTREEITEM ht = WTreeView_Add ( hTree, L"Text", NULL, NULL, WTV_IGNORE ); //Wurzelelement "Text", ohne Icon einfügen WTreeView_Add ( hTree, L"SubText", ht, NULL, IDI_SMALL ); //Child-Element "SubText" mit dem Icon IDI_SMALL einfügen // Führt man den Code aus, so besitzen beide Einträge das IDI_SMALL Icon }In der MSDN habe ich auch nichts weiterführendes gefunden.
Gruß, aVoX.
-
Kann eigentlich gar nicht sein.
TVIF_IMAGE ist nicht gesetzt. Also müsste das Icon ignoriert werden.
-
Martin Richter schrieb:
TVIF_IMAGE ist nicht gesetzt. Also müsste das Icon ignoriert werden.
Es funktioniert trotzdem

wenn ich allerdings
tvi.mask = TVIF_TEXT;
zu
tvi.mask = TVIF_TEXT | TVIF_IMAGE;
ändere, werden keine Icons angezeigt.
-
Dein Code stimmt irgendwie nicht:
WTreeView_Create nimmt 3 Parameter. Dein Beispielcodezeigt aber nur 2. Was ist der erweiterte Stil?
-
Martin Richter schrieb:
WTreeView_Create nimmt 3 Parameter. Dein Beispielcodezeigt aber nur 2. Was ist der erweiterte Stil?
Der 3. Parameter ist optional und standardmäßig auf IGNORE gesetzt (siehe Header). Das Feld dwStyle soll dem Benutzer erlauben, weitere TVS_* oder WS_* Styles anzugeben. Der 3. Parameter wurde in der main.cpp weggelassen, weil alle Styles, die ich benutzen will bereits an CreateWindowEx übergeben werden.
-
Und was ist IGNORE? Ich hoffe doch 0!
-
IGNORE sollte in WinBase.h mit dem Wert 0 definiert sein.