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.


  • Mod

    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.


  • Mod

    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.


  • Mod

    Und was ist IGNORE? Ich hoffe doch 0!



  • IGNORE sollte in WinBase.h mit dem Wert 0 definiert sein.


Anmelden zum Antworten