Использование элемента SPIN, страница 4

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 структура, содержащая информацию по координатам мыши в момент, когда сообщение было отправлено.