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

            SendDlgItemMessage(hWnd, IDC_PROGRESS1, PBM_SETPOS, 100-nTekV, 0);

                                               }

break;

5. ОКНО ДЕРЕВЬЕВ ЭЛЕМЕНТОВ

Вставляем на форму окно деревьев элементов

Has buttons

Добавит кнопочки +  -

Has lines

Добавить линии между дочерними ветками

Lines at root

Добавить линии между родительскими ветками

Edit labels

Названия элементов списка могут быть изменены

Disable drag drop

Запрещает операции drag –drop с элементами списка

Border

Дерево заключить в рамку

Show selection always

Выбранные элементы остаются таковыми после потери фокуса

Управление деревом идет из программы:

//добавим описание структур, на которых держится дерево.

//описание структур см. MSDN

TV_INSERTSTRUCT  TV_InsertStruct;

TV_ITEM  TV_Item;

int i, j;

HIMAGELIST  himl ;

HBITMAP hbmImage;

//добавим в ресурсы два битмапа с изображениями, которые должны появляться в дереве:

Для инициализации списка придется потрудиться:

switch (wMsg)

{

case WM_INITDIALOG:

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

//Инициализация дерева просмотра

//сначала получим хендел дерева

hList1 = GetDlgItem (hWnd,IDC_TREE1);

//начнем заполнение структур. Новая ветка ставиться последней при добавлении

TV_InsertStruct.hInsertAfter = TVI_LAST;

//информация списка содержится в полях: pszText, cchTextMax

//а так же в поле iImage

// а так же в поле lParam

// а так же в поле сСhildren

// а так же в поле iSelectedItem

TV_Item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_PARAM | TVIF_CHILDREN| TVIF_SELECTEDIMAGE;

//корневые ветки заполним значениями десятков от 0 до 100

for(i=0;i<100;i+=10)

{          //это корневая ветка

TV_InsertStruct.hParent=TVI_ROOT;

//внесем надпись ветки

TV_Item.pszText=itoa(i,cBuffer,10);

//рисунок к ней приставляется с индексом 0 из списка рисунков

TV_Item.iImage=0;

//при выборе этой ветки ей приставляется тот же рисунок

TV_Item.iSelectedImage=0;

//эта ветка имеет детей

TV_Item.cChildren = 1;

//присоединить ветку к дереву

TV_InsertStruct.item = TV_Item;

//вставить заготовку новой ветки

TV_InsertStruct.hParent = TreeView_InsertItem(hList1, &TV_InsertStruct);

//веточки-дети с данными единиц десятков

for (j=1;j<10;j++)

{          //внесем надпись ветки

TV_Item.pszText=itoa(i+j,cBuffer,10);

//рисунок к ней приставляется с индексом 1 из списка рисунков

TV_Item.iImage=1;

//а при выборе этой ветки – присоединяется рисунок с индексом 2

TV_Item.iSelectedImage=2;

//детей у этой ветки нет

TV_Item.cChildren = 0;

//вставить ветку в дерево

TV_InsertStruct.item = TV_Item;

TreeView_InsertItem(hList1, &TV_InsertStruct);

}

}

// Создание  image list  (листа с рисунками)

himl = ImageList_LoadBitmap (ghInstance,

MAKEINTRESOURCE (IDB_BITMAP1), //получение указателя на bitmap

16, //размер рисунка по ширине (в пикселях)

0, //последний индекс рисунков в загружаемом bitmap-е

CLR_NONE  // хендел на bitmap, выступающий в роли маски

) ;

//Загрузка дополнительных рисунков (если это надо)

hbmImage=LoadBitmap(ghInstance, MAKEINTRESOURCE (IDB_BITMAP2));

//добавление загруженных рисунков к существующему image list 

ImageList_Add(himl,

hbmImage ,

0 // хендел на bitmap, выступающий в роли маски

);

//установка связи между листом рисунков и деревом элементов

TreeView_SetImageList (hList1, himl, TVSIL_NORMAL ) ;

После компиляции и запуска программы имеем следующее:

Обработка нотификационных сообщений от дерева происходит по сценарию: