-Поиск по дневнику

Поиск сообщений в rss_forum_sources_ru

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 29.07.2007
Записей:
Комментариев:
Написано: 80


TreeView

Суббота, 18 Июля 2020 г. 18:11 + в цитатник
E.A.: Здравствуйте, уважаемые

Вопрос по Treeview
Есть некоторая база данных по значениям которой создается Treeview
    namespace e
    {
    extern int linktreelevel[2][500]; // уровень
    extern char linktreestr[2][500][256]; // название (256 символов)
    extern int linktreetype[2][500]; // тип рисунка
    }
    strcpy(e::linktreestr[0][0], "Structure");
    e::linktreelevel[0][0] = 0;
    e::linktreetype[0][0] = 12;
    strcpy(e::linktreestr[0][1], "Assembly");
    e::linktreelevel[0][1] = 1;
    e::linktreetype[0][1] = 0;
    strcpy(e::linktreestr[0][2], "Shaft 1");
    e::linktreelevel[0][2] = 2;
    e::linktreetype[0][2] = 2;
    strcpy(e::linktreestr[0][3], "Bearing 11");
    e::linktreelevel[0][3] = 3;
    e::linktreetype[0][3] = 5;
    strcpy(e::linktreestr[0][4], "Gear 1");
    e::linktreelevel[0][4] = 3;
    e::linktreetype[0][4] = 6;
    strcpy(e::linktreestr[0][5], "Bearing 12");
    e::linktreelevel[0][5] = 3;
    e::linktreetype[0][5] = 5;
    strcpy(e::linktreestr[0][6], "Shaft 2");
    e::linktreelevel[0][6] = 2;
    e::linktreetype[0][6] = 2;
    strcpy(e::linktreestr[0][7], "Bearing 21");
    e::linktreelevel[0][7] = 3;
    e::linktreetype[0][7] = 5;
    strcpy(e::linktreestr[0][8], "Gear 2");
    e::linktreelevel[0][8] = 3;
    e::linktreetype[0][8] = 6;
    strcpy(e::linktreestr[0][9], "Bearing 22");
    e::linktreelevel[0][9] = 3;
    e::linktreetype[0][9] = 5;

Создание Treeview
    dwstytreeview = WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS;
    e::linkhwnd[1] = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, NULL, dwstytreeview, 0, 0, 0, 0, hdlg, (HMENU) 1001, hinstance, NULL);

Заполнение Treeview по данным (максимум для 3 уровней вложенности, для моей задачи достаточно):
    void LinkTreeviewCreate(HWND hwndtreeview, int param)
    {
    int i, n;
    TVINSERTSTRUCT tvins;
    TVITEM tvi;
    HINSTANCE hdll;
    HIMAGELIST himl;
    HBITMAP hbmp;
    HTREEITEM hti[4];
    n = 25;
    himl = ImageList_Create(18, 18, FALSE, 0, 0);
    TreeView_SetImageList(hwndtreeview, himl, TVSIL_NORMAL);
    hdll = LoadLibrary("Stnpic.dll");
    memset(&tvins, 0, sizeof(tvins));
    tvins.hInsertAfter = TVI_LAST;
    tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
    for (i=0; idiv>
    {
    tvi.pszText = e::linktreestr[param][i];
    if (hdll)
    {
    dll::linkdll2 DllLoadBitmap = (dll::linkdll2) GetProcAddress(hdll, "DllLoadBitmap");
    hbmp = DllLoadBitmap(hdll, e::linktreetype[param][i]);
    n = ImageList_Add(himl, hbmp, NULL);
    }
    tvi.iImage = n;
    tvi.iSelectedImage = n;
    tvins.item = tvi;
    tvins.hParent = TVI_ROOT;
    switch (e::linktreelevel[param][i])
    {
    case 0:
    tvins.hParent = TVI_ROOT;
    hti[0] = TreeView_InsertItem(hwndtreeview, &tvins);
    TreeView_Expand(hwndtreeview, hti[0], TVE_EXPAND);
    TreeView_SelectItem(hwndtreeview, hti[0]);
    break;
    case 1:
    tvins.hParent = hti[0];
    hti[1] = TreeView_InsertItem(hwndtreeview, &tvins);
    TreeView_Expand(hwndtreeview, hti[1], TVE_EXPAND);
    TreeView_SelectItem(hwndtreeview, hti[1]);
    break;
    case 2:
    tvins.hParent = hti[1];
    hti[2] = TreeView_InsertItem(hwndtreeview, &tvins);
    TreeView_Expand(hwndtreeview, hti[2], TVE_EXPAND);
    TreeView_SelectItem(hwndtreeview, hti[2]);
    break;
    case 3:
    tvins.hParent = hti[2];
    hti[3] = TreeView_InsertItem(hwndtreeview, &tvins);
    TreeView_Expand(hwndtreeview, hti[3], TVE_EXPAND);
    TreeView_SelectItem(hwndtreeview, hti[3]);
    break;
    }
    }
    if (hdll)
    {
    FreeLibrary(hdll);
    }
    TreeView_SelectItem(hwndtreeview, hti[0]);
    }

Обработка сообщений
    //...
    case WM_NOTIFY:
    switch (LOWORD(wparam))
    {
    case 1001:
    if(((LPNMHDR)lparam)->code == NM_CLICK)
    {
    LinkTreeviewClick(GetParent(e::linkhwnd[1]));
    }
    break;
    }
    return 0;
    //...
    void LinkTreeviewClick(HWND hwnd)
    {
    char str[256];
    TVITEM tvi;
    HTREEITEM Selected;
    memset(&tvi, 0, sizeof(tvi));
    Selected = (HTREEITEM) SendDlgItemMessage(hwnd, 1001, TVM_GETNEXTITEM, TVGN_CARET, (LPARAM)Selected);
    TreeView_EnsureVisible(hwnd,Selected);
    SendDlgItemMessage(hwnd, 1001, TVM_SELECTITEM, TVGN_CARET, (LPARAM)Selected);
    tvi.mask = TVIF_TEXT;
    wsprintf(str, " LinkTreeviewClick = %d", Selected);
    SetWindowText(hwnd, str);
    }

pic_001.GIF (, : 9)
Вопрос как определить по какому конкретно узлу был произведен клик мыши ?

Хотелось бы получить номер по порядку узла по которому кликнули.

https://forum.sources.ru/index.php?showtopic=419174&view=findpost&p=3834551

Метки:  

 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку