Поделиться через


Добавление элементов представления дерева

Вы добавляете элемент в элемент управления "Дерево", отправляя TVM_INSERTITEM сообщение в элемент управления. Сообщение содержит адрес структуры TVINSERTSTRUCT, указав родительский элемент, элемент, после которого вставляется новый элемент, и структура TVITEM, определяющая атрибуты элемента. Атрибуты включают метку элемента, выбранные и неизбираемые изображения, а также 32-разрядное значение, определенное приложением.

Это важно знать

Технологии

Необходимые компоненты

  • C/C++
  • Программирование пользовательского интерфейса Windows

Instructions

Добавление элементов в представление дерева

В этом разделе показано, как создать оглавление на основе сведений о заголовке документа, предоставляемых в массиве, определяемом приложением. Каждый элемент массива состоит из строки заголовка и целого числа, указывающего уровень заголовка. В этом примере поддерживаются три уровня заголовка (1, 2 и 3).

В этом примере есть две функции. Первая функция извлекает каждый заголовок и сопутствующий уровень заголовка, а затем передает их второй функции.

Вторая функция добавляет элемент в элемент управления "Представление дерева". Он использует текст заголовка в качестве метки элемента и использует уровень заголовка для определения родительского элемента для нового элемента. Уровень один заголовок добавляется в корень элемента управления "Представление дерева", в качестве дочернего элемента предыдущего уровня одного элемента и т. д. Функция назначает изображение элементу в зависимости от того, имеет ли он дочерние элементы. Если элемент содержит дочерние элементы, он получает изображение, представляющее закрытую папку. В противном случае он получает изображение, представляющее документ. Элемент использует один и тот же образ для выбранных и неизбираемых состояний.

// Adds items to a tree-view control. 
// Returns the handle to the newly added item. 
// hwndTV - handle to the tree-view control. 
// lpszItem - text of the item to add. 
// nLevel - level at which to add the item. 
//
// g_nClosed, and g_nDocument - global indexes of the images.

HTREEITEM AddItemToTree(HWND hwndTV, LPTSTR lpszItem, int nLevel)
{ 
    TVITEM tvi; 
    TVINSERTSTRUCT tvins; 
    static HTREEITEM hPrev = (HTREEITEM)TVI_FIRST; 
    static HTREEITEM hPrevRootItem = NULL; 
    static HTREEITEM hPrevLev2Item = NULL; 
    HTREEITEM hti; 

    tvi.mask = TVIF_TEXT | TVIF_IMAGE 
               | TVIF_SELECTEDIMAGE | TVIF_PARAM; 

    // Set the text of the item. 
    tvi.pszText = lpszItem; 
    tvi.cchTextMax = sizeof(tvi.pszText)/sizeof(tvi.pszText[0]); 

    // Assume the item is not a parent item, so give it a 
    // document image. 
    tvi.iImage = g_nDocument; 
    tvi.iSelectedImage = g_nDocument; 

    // Save the heading level in the item's application-defined 
    // data area. 
    tvi.lParam = (LPARAM)nLevel; 
    tvins.item = tvi; 
    tvins.hInsertAfter = hPrev; 

    // Set the parent item based on the specified level. 
    if (nLevel == 1) 
        tvins.hParent = TVI_ROOT; 
    else if (nLevel == 2) 
        tvins.hParent = hPrevRootItem; 
    else 
        tvins.hParent = hPrevLev2Item; 

    // Add the item to the tree-view control. 
    hPrev = (HTREEITEM)SendMessage(hwndTV, TVM_INSERTITEM, 
        0, (LPARAM)(LPTVINSERTSTRUCT)&tvins); 

    if (hPrev == NULL)
        return NULL;

    // Save the handle to the item. 
    if (nLevel == 1) 
        hPrevRootItem = hPrev; 
    else if (nLevel == 2) 
        hPrevLev2Item = hPrev; 

    // The new item is a child item. Give the parent item a 
    // closed folder bitmap to indicate it now has child items. 
    if (nLevel > 1)
    { 
        hti = TreeView_GetParent(hwndTV, hPrev); 
        tvi.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE; 
        tvi.hItem = hti; 
        tvi.iImage = g_nClosed; 
        tvi.iSelectedImage = g_nClosed; 
        TreeView_SetItem(hwndTV, &tvi); 
    } 

    return hPrev; 
} 

// Extracts heading text and heading levels from a global 
// array and passes them to a function that adds them as
// parent and child items to a tree-view control. 
// Returns TRUE if successful, or FALSE otherwise. 
// hwndTV - handle to the tree-view control. 

BOOL InitTreeViewItems(HWND hwndTV)
{ 
    HTREEITEM hti;

    // g_rgDocHeadings is an application-defined global array of 
    // the following structures: 
    //     typedef struct 
    //       { 
    //         TCHAR tchHeading[MAX_HEADING_LEN]; 
    //         int tchLevel; 
    //     } Heading; 
    for (int i = 0; i < ARRAYSIZE(g_rgDocHeadings); i++) 
    { 
        // Add the item to the tree-view control. 
        hti = AddItemToTree(hwndTV, g_rgDocHeadings[i].tchHeading, 
            g_rgDocHeadings[i].tchLevel); 

        if (hti == NULL)
            return FALSE;
    } 
           
    return TRUE; 
}

Использование элементов управления "Дерево- представление"

Пример CustDTv иллюстрирует настраиваемое рисование в элементе управления "Представление дерева"