С ++ Microsoft MFC TreeView Иконки - PullRequest
2 голосов
/ 24 марта 2019

Я написал код элемента управления TreeView в статье блога.Я пытаюсь добавить значки в элементы списка.Но иконки не отображаются.У меня есть следующий код:

void CLeftView::OnInitialUpdate()
{
    CTreeView::OnInitialUpdate();

    // TODO: Add items by GetTreeCtrl().

    HICON hi = NULL;
    hi = AfxGetApp()->LoadIcon(MAKEINTRESOURCE(IDI_ICON1));
    if (hi != NULL)
    {
        MessageBox(NULL, L"resource1");
    }
    else MessageBox(NULL, L"Not resource1");
    HICON lo = NULL;
    lo = AfxGetApp()->LoadIcon(MAKEINTRESOURCE(IDI_ICON2));
    if (lo != NULL)
    {
        MessageBox(NULL, L"resource2");
    }
    else MessageBox(NULL, L"Not resource2");

    CImageList m_tree_imglist;
    CTreeCtrl & tc = CTreeView::GetTreeCtrl();

    m_tree_imglist.Create(16, 16, ILC_COLOR32 | ILC_MASK, 0, 2);

    m_tree_imglist.Add(hi);
    m_tree_imglist.Add(lo);


    tc.SetImageList(&m_tree_imglist, TVSIL_NORMAL);

    HTREEITEM hItem;
    hItem = tc.InsertItem(L"Fonts", 0, 0, TVI_ROOT);
    tc.InsertItem(L"Arial", 0, 0, hItem);
    tc.InsertItem(L"Times", 0, 0, hItem);
    tc.Expand(hItem, TVE_EXPAND);
}

Иконки добавлены в файлы ресурса.Там у меня есть ошибка?У меня есть сообщения со следующим текстом: "resource1", "resource2".

1 Ответ

4 голосов
/ 24 марта 2019

m_tree_imglist объявлено в стеке, этот список изображений уничтожается после выхода OnInitialUpdate, поэтому CTreeCtrl больше не имеет списка изображений.

Список изображений должен быть объявлен как член класса, так что он остается действительным, пока CTreeCtrl нуждается в нем. Обратите внимание, что префикс m_ обычно используется в MFC для обозначения «члена класса».

class CLeftView : public CTreeView
{
    CImageList m_tree_imglist;
    ...
};

void CLeftView::OnInitialUpdate()
{
    ...
    //CImageList m_tree_imglist; <- remove
    tc.SetImageList(&m_tree_imglist, TVSIL_NORMAL);
}
...