Операционная система Windows 95 для программиста

  d8ef8794     

Вставка элементов дерева


Вставка элементов в дерево выполняется при помощи макрокоманды TreeView_InsertItem , которая посылает органу управления Tree View сообщение TVM_INSERTITEM :

HTREEITEM TreeView_InsertItem( HWND hwnd, // идентификатор окна органа Tree View TV_INSERTSTRUCT lpis); // указатель на структуру TV_INSERTSTRUCT

Через параметр hwnd Этой макрокоманде необходимо передать идентификатор созданного органа управления Tree View, а через параметр lpis - адрес структуры типа TV_INSERTSTRUCT . Эта структура и указатель на нее определены так:

typedef struct _TV_INSERTSTRUCT { HTREEITEM hParent; // идентификатор родительского элемента HTREEITEM hInsertAfter; // идентификатор элемента, после // которого будет выполнена вставка TV_ITEM item; // информация о вставляемом элементе } TV_INSERTSTRUCT, FAR *LPTV_INSERTSTRUCT;

Если вставляется корневой элемент, поле hParent должно содержать значение TVI_ROOT или NULL. Если же вставляется вложенный элемент, в это поле необходимо записать идентификатор родительского элемента (т. е. элемента, расположенного выше по иерархии).

В поле hInsertAfter следует записать идентификатор элемента, после которого будет вставлен данный элемент или одно из следующих значений:



Значение Расположение вставляемого элемента
TVI_FIRST В начале списка
TVI_LAST В конце списка
TVI_SORT По алфавитному порядку

Структура item содержит информацию о вставляемом элементе. Соответствующий тип TV_ITEM определен следующим образом:

typedef struct _TV_ITEM { UINT mask // маска использования полей структуры TV_ITEM HTREEITEM hItem; // номер элемента UINT state; // текущее состояние элемента UINT stateMask; // маска состояния элемента LPSTR pszText; // адрес текстового буфера int cchTextMax; // размер текстового буфера int iImage; // номер изображения невыбранного элемента int iSelectedImage;// номер изображения выбранного элемента int cChildren; // флаг дочерних элементов LPARAM lParam;// 32-битное значение, связанное с элементом } TV_ITEM, FAR *LPTV_ITEM;

Назначение большинства полей такое же, как и одноименных полей структуры LV_ITEM.


Поле маски mask определяет, какие из полей структуры TV_ITEM будут использованы при добавлении элементов. Возможны следующие значения масок (их можно объединять при помощи логической операции ИЛИ):

Маска Заполненное поле структуры TV_ITEM
TVIF_TEXT pszText
TVIF_IMAGE iImage
TVIF_SELECTEDIMAGE iSelectedImage
TVIF_PARAM lParam
TVIF_CHILDREN cChildren
TVIF_HANDLE hItem
TVIF_STATE state
В поля iImage и iSelectedImage следует записать номера изображений из списка, которые будут использованы для элемента, соответственно, в выбранном и невыбранном состоянии.

Поле cChildren содержит флаг, который показывает, есть ли у данного элемента связанные с ним дочерние элементы. Если есть, то в этом поле должно быть записано значение 1, в противном случае - 0. Если же в поле cChildren записать значение I_CHILDRENCALLBACK, приложение должно обрабатывать извещения TVN_GETDISPINFO и TVN_SETDISPINFO (аналогичные извещениям LVN_GETDISPINFO и LVN_SETDISPINFO, которые посылаются органу управления List View).

Для удобства в приложении Some Books мы добавляем элементы дерева при помощи функции InsTreeItem, исходный текст которой приведен ниже:

HTREEITEM InsTreeItem(HTREEITEM hParent, LPSTR szText, HTREEITEM hAfter, int iImage, int iSelectedImage) { TV_INSERTSTRUCT tvins; HTREEITEM hItem;

memset(&tvins, 0, sizeof(tvins)); tvins.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; tvins.item.pszText = szText; tvins.item.cchTextMax = lstrlen(szText); tvins.item.iImage = iImage; tvins.item.iSelectedImage = iSelectedImage; tvins.hInsertAfter = hAfter; tvins.hParent = hParent;

hItem = TreeView_InsertItem(hwndTree, &tvins); return hItem; }

Процедура заполнения дерева в приложении Some Books выглядит следующим образом.

Вначале мы вставляем корневой элемент, которому соответствует строка szBooks ("Книги издательства АО 'Диалог-МИФИ'"):

hItem = InsTreeItem((HTREEITEM)TVI_ROOT, szBooks, (HTREEITEM)TVI_FIRST, idxBooks, idxBooks);



Этот элемент является корневым, поэтому параметр hParent имеет значение TVI_ROOT. Вставляемый элемент будет расположен первым по порядку, так как для параметра hAfter задано значение TVI_FIRST.

Далее мы вставляем два элемента, расположенные ниже по иерархии (первый уровень вложенности). Это текстовые строки szBSPSeries ("Библиотека системного программиста, (C) Фролов А.В., Фролов Г.В., 1991-1995 г.") и szStepSeries ("Персональный компьютер. Шаг за шагом, (C) Фролов А.В., Фролов Г.В., 1994-1995 г."):

hBSPItem = InsTreeItem(hItem, szBSPSeries, (HTREEITEM)TVI_SORT, idxBooks, idxBooks); hStepItem = InsTreeItem(hItem, szStepSeries, (HTREEITEM)TVI_SORT, idxBooks, idxBooks);

Затем для каждого элемента первого уровня вставляем по два элемента второго уровня:

InsTreeItem(hBSPItem, rgSPLBookInfo[0].szBookName, (HTREEITEM)TVI_SORT, idxBookClosed, idxBookOpened); InsTreeItem(hBSPItem, rgSPLBookInfo[1].szBookName, (HTREEITEM)TVI_SORT, idxBookClosed, idxBookOpened);

InsTreeItem(hStepItem, rgStepBookInfo[0].szBookName, (HTREEITEM)TVI_SORT, idxBookClosed, idxBookOpened); InsTreeItem(hStepItem, rgStepBookInfo[1].szBookName, (HTREEITEM)TVI_SORT, idxBookClosed, idxBookOpened);

Так как в параметре hAfter указана константа TVI_SORT, все добавленные элементы будут отображаться в алфавитном порядке.


Содержание раздела