Добавление элементов представления дерева
Вы добавляете элемент в элемент управления "Дерево", отправляя 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;
}
См. также