case WM_NOTIFY:
//создадим переменную для обработки первой структуры нотификационного сообщения
//описание примененной структуры см. ниже
NMHDR* nmptr = (LPNMHDR) lParam;
switch (nmptr->code)
{
case TVN_SELCHANGED:
//обработка сообщения от окна дерева
//получаем хендел окна, приславшего сообщение
hList1=nmptr->hwndFrom;
//готовим структуру TV_Item для получения данных от дерева, для чего сначала обнулим
//буфер, который будем использовать для принятия текстовой строки
strnset(cBuffer,0,11);
// и занесем его адрес в структуру
TV_Item.pszText=cBuffer;
//укажем, что буфер может принять не более 11 символов
TV_Item.cchTextMax=11;
//установим код маски, поясняющий, что мы ожидаем заполнение текстового буфера
TV_Item.mask=TVIF_TEXT;
//установим хендел выбранной ветки в дереве (его возьмем из пришедшего сообщения)
//описание примененной структуры см.ниже
TV_Item.hItem=((LPNM_TREEVIEW)nmptr)->itemNew.hItem;
//пошлем сообщение окну с деревом с просьбой заполнить указанную структуру
rez=TreeView_GetItem(hList1, &TV_Item );
//результат, принятый в тексовом буфере выведем на экран
MessageBox(hWnd, TV_Item.pszText, "ДЕРЕВО", MB_OK );
//Участок программы, демонстрирующий проход по дереву от текущего узла к корню
//строится текстовая строка с полным путем до выбранного узла
//очистка буфера для составления строки
strnset(szListText,0,256);
//занос в буфер имени выбранного узла
strcpy (szListText,TV_Item.pszText);
//поскольку заполнение строки пойдет с зада наперед, перевернем ее
strrev(szListText);
//получение хендела родителя выбранного узла
hitem=TreeView_GetParent(hList1, ((LPNM_TREEVIEW)nmptr)->itemNew.hItem);
//цикл – движение от текущего узла к корню
while (hitem) {
//подготовить структуру TV_Item к приему данных
strnset(cBuffer,0,11);
TV_Item.pszText=cBuffer;
TV_Item.cchTextMax=11;
TV_Item.mask=TVIF_TEXT;
TV_Item.hItem= hitem;
//получить данные от окна деревьев
TreeView_GetItem(hList1, &TV_Item );
//занести данные в строку, но поскольку движение идет с зада наперед
//по и строку надо заполнять с использованием реверсивных функций
strcat(szListText,"\\");
strrev(TV_Item.pszText);
strcat(szListText,TV_Item.pszText);
//получить хендел родителя более низкого уровня
hitem=TreeView_GetParent(hList1, hitem);
}
//перевернем строку в нормальное положение
strrev(szListText);
//вывести полученную в результате строку на экран
MessageBox(hWnd, szListText, "Полный путь", MB_OK );
break;
}
break;
Здесь следует объяснить, что нотификационные сообщения (WM_NOTIFY) от в своем параметре lParam приносят указатель на структуру NMHDR, которая, для сообщений от окон деревьев, расширена до структуры NM_TREEVIEW. Обе структуры хорошо описаны в MSDN:
typedef struct _NM_TREEVIEW {
NMHDR hdr;
UINT action;
TV_ITEM itemOld;
TV_ITEM itemNew;
POINT ptDrag;
} NM_TREEVIEW;
typedef NM_TREEVIEW FAR *LPNM_TREEVIEW;
Состав полей структуры:
hdr – указатель еще на одну структуру:
typedef struct tagNMHDR {
HWND hwndFrom;
UINT idFrom;
UINT code;
} NMHDR;
в которой первое полеhwndFrom – это хендел того окна, от которого пришло сообщение; второе поле idFrom – идентификатор окна от которого пришло сообщение;
третье поле code – код сообщения.
action - флаг нотификационного сообщения;
itemOld - TV_ITEM структура, содержащая старое состояние ветки (до щелчка) или 0, если не используется.
itemNew - TV_ITEM - структура, содержащая новое состояние ветки (после щелчка) или 0, если не используется.
ptDrag - POINT структура, содержащая информацию по координатам мыши в момент, когда сообщение было отправлено.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.