Не могу получить информацию об элементе TrеeView

Тема в разделе "WASM.BEGINNERS", создана пользователем _220, 2 май 2008.

  1. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    Создается все нормально, но при посылке сообщения TVM_GETITEM ничего не проиходит. Вообще я хотел сделать, чтобы отображалось дерево каталогов, а директории подгружались по мере кликов. Для этого начал делать функцию LoadDirectory. При щелчке на элемент дерева она вызывается, должна получать инфу о себе (текст), а потом о всех родительских вплоть до корня, собирая по кусочка путь,потом получать список файлов и заполнять кликнутый элемент. Работа остановилась на получении информации об элементе, пытаюсь получить текст.
    вот код:

    tree = GetDlgItem(hDlg,IDC_FILETREE);
    imagelist = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_IMAGELIST));
    hIList = ImageList_Create(18,18,ILC_COLOR8,4,1);
    ImageList_Add(hIList,imagelist,0); SendMessage(tree,TVM_SETIMAGELIST,TVSIL_NORMAL,(long)hIList);


    TV_INSERTSTRUCT t;
    memset(&t,0,sizeof(t));
    t.hParent = TVI_ROOT;
    t.hInsertAfter = TVI_SORT;
    t.item.mask = TVIF_TEXT | TVIF_IMAGE;
    int dr = GetLogicalDrives();
    for(int x=0;x<26;x++) {
    int n = ((dr>>x)&1);
    if(n){
    char sym[4] = {(65 + x),':','\\',0};
    t.item.pszText = sym;
    HTREEITEM tmp = (HTREEITEM) SendMessage(tree,TVM_INSERTITEM,0,(long)&t);
    LoadDirectory(tmp);
    }
    }
    Я получаю список дисков и хочу сразу заполнить первый уровень дикекторий ф-ей LoadDirectory.
    вот она

    void LoadDirectory(HTREEITEM hitem){
    TV_ITEM t;
    memset(&t,0,sizeof(t));
    t.mask = TVIF_TEXT;
    t.hItem = hitem;
    SendMessage(tree,TVM_GETITEM,0,(long)&t);

    //здесь в t.pszText лежит ноль, причинц не нашел

    }
    подскажите где ошибка

    если не задтруднит, скажите как в TabControl запихать страницы, я искал, но нашел кучу примеров с PropertySheet, а из этого новый диалог получается я мне нужно, чтобы Tab рядом с TreeView был и еще кучей элементов
     
  2. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    TVIF_TEXT обязывает заполнить также pszText и cchTextMax. Первый - указатель на существующий буфер, второй - его длина в символах.
    memset() наверное не нужен - только задержит код. Если это не сработает, тогда добавить ещё маску TVIF_HANDLE.
     
  3. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Касательно Tab Control: единственное что Tab Control делает - это рисование своих элементов и посылание сообщений родителю при переключении элементов. Страницы все делаются вручную. Страница - это диалог без бордюра (child dialog), созданный как modeless. Когда Tab Control посылает TCN_SELCHANGE - надо скрыть активный диалог-страницу и показать следующую. Не забудь про IsDialogMessage() - без этого modeless диалоги не будут работать как положено. Если твой Tab Control изменяет размер (resizable) - обрати внимание на сообщение TCM_ADJUSTRECT - оно рассчитывает размер окна (диалог-страницы), которое точно подпадает под размер Tab Control.
     
  4. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    _220
    По-моему, ты не понимаешь что такое TreeView. Это дерево для просмотра инфы, которую ты туда положишь. Чтобы там были каталоги ты должен извлечь их имена в текстовом виде и занести.
    Оттого, что ты назвал узел "c:\" он не стал диском с. Это просто узел с такой надписью.
    Есть готовый компонент на закладке samples - shelltreeview, там все сделано уже.
    С TabControl тоже просто : идешь в Tabs -> TStrings и заполняешь имена закладок.
    Появятся закладки и к каждой страница. Теперь можешь бросать контролы.
    На разные страницы переходишь меняя поле TabIndex 0,1 ....
     
  5. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    c TreeView все ясно, я назвал узел c:\ и хочу получить назад название узла, чтобы из них составить путь к директории. У вас в коде кажется делфями попахивает, а я пишу ни vc++6

    отметка handle'а не помогает, вообще нет разницы до SendMessage и после, быть может это от того, что я в диалоге работаю с TreeView?

    А про TabControl можно поподробнее, в общих чертах я понял, а где можно в деталях узнать, что писать (вообще что делать после того, как я в редакторе ресурсов нарисовал TabControl).
    В msdn сам черт ногу сломит, там все на MFC держится, а мне нужен голый API.
     
  6. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    яхз где ты там делфи нашёл,
    вот это делфи:
    Код (Text):
    1.     strct:xTV_ITEM;
    2.     sText: array[0..1023] of Char; //char sText[1 kb];
    3. ...
    4.      strct.hItem:=SendDlgItemMessage(hwnd,1110,TVM_GETNEXTITEM, TVGN_CARET,hwndFrom);
    5.      strct.pszText:=@sText;
    6.      strct.cchTextMax:=sizeof(sText);
    7.      strct.imask:=TVIF_TEXT or TVIF_STATE;
    8.      Zero(@Stext);
    9.      SendDlgItemMessage(hwnd,1110,TVM_GETITEM, 0, dword(@strct));
    уж извини, я тогда на делфи писал(чуть не сказал "играл" гыгы)
     
  7. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    _220
    Я с работы пишу, т.ч. завтра посмотрю. Сейчас ухожу. Мне в Вижуале не понравилось, что нет дефолтного метода - в Дельфи клик по умолчанию зашит, в С++ я должен сам знать название метода и выбрать из десятка. А уж на API писать - это для меня темный лес. Я пару раз готовые исходники правил и несколько раз трассировал обработчик мессаджей(sendMessage в смысле).
     
  8. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    нашел в msdn про таб, сделал сам таб с закладками и диалоги к нему, пока не получилось вывести вкладку, DialogBox выходит с -1, наверное это из-за неправильной функции обрпботки, у меня в коде нету никакой isDlgMessage(), куда ее вставить?
     
  9. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    _220
    Для меня это все темный лес, т.ч. я уступаю место знающим. По поводу GetItem - из дельфийского текста видно что сначала надо TVM_GETNEXTITEM Вот это же на С++:
    http://bbs.vbstreets.ru/viewtopic.php?p=143617&sid=c357ad5f5d57fe4ef595af666969a079
    Может там и про табсы найдешь.
     
  10. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    да я специально не стал на си переписывать, ибо был уверен что проблем с переводом такого текста не возникнет..
     
  11. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    С переводом проблем-то не возникло, я увидел, что не заполнил поле размера, и почему-то думал, что где-то в глубинах SendMessage память под текст выделится сама :).
    В общем TreeView работает, пока.

    Осталось дождаться доброго человека, который объяснит,как работать с табом.
     
  12. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    _220
    Смелее пользуйся поиском и ждать будут тебя, а не ты :)
     
  13. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
  14. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    Путем проб и ошибок сделал таб, на очереди еще один крутой вопрос, ана этот раз с ListView траблы,
    хочу сделать табличку, но не могу вставить элемент никуда кроме первой колонки. В win32.hlp написано, что сабитемы нельзя вставлять LVM_INSERTITEM, а как их вставлять тогда?

    Не, ну не понимаю я код в мсдн, каким раком у них вставляется 3 итема, у каждого по 3 сабитема?

    вот кот оттуда

    // This code example adds three items, each with three subitems, to
    // a list-view control.

    // hWndListView - handle to the list-view control.
    // PETINFO - an application-specific structure.

    typedef struct tagPETINFO
    {
    TCHAR szKind[10];
    TCHAR szBreed[50];
    TCHAR szPrice[20];
    }PETINFO;

    // A PETINFO variable is declared and initialized as follows:

    PETINFO rgPetInfo[ ] =
    {
    {TEXT("Dog"), TEXT("Poodle"), TEXT("$300.00")},
    {TEXT("Cat"), TEXT("Siamese"), TEXT("$100.00")},
    {TEXT("Fish"), TEXT("Angel Fish"), TEXT("$10.00")},
    };
    .
    .
    .
    // Some code to create the list-view control.
    // Initialize LVITEM members that are common to all items.
    lvI.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
    lvI.state = 0;
    lvI.stateMask = 0;

    // Initialize LVITEM members that are different for each item.
    for (index = 0; index < 3; index++)
    {
    lvI.iItem = index;
    lvI.iImage = index;
    lvI.iSubItem = 0;
    lvI.lParam = (LPARAM) &rgPetInfo[index];
    lvI.pszText = LPSTR_TEXTCALLBACK; // sends an LVN_GETDISP message.
    ListView_InsertItem(hWndListView, &lvI) == -1);
    }
    .
    .
    .
    // The following case statement is in the message handler for the window that hosts
    // the control.

    case WM_NOTIFY:
    switch (((LPNMHDR) lParam)->code)
    {
    case LVN_GETDISPINFO:
    NMLVDISPINFO* plvdi = (NMLVDISPINFO*)lParam;
    switch (plvdi->item.iSubItem)
    {
    case 0:
    plvdi->item.pszText = rgPetInfo[plvdi->item.iItem].szKind;
    break;

    case 1:
    plvdi->item.pszText = rgPetInfo[plvdi->item.iItem].szBreed;
    break;

    case 2:
    plvdi->item.pszText = rgPetInfo[plvdi->item.iItem].szPrice;
    break;

    default:
    break;
    }
    return 0;
    }

    // NOTE: in addition to setting pszText to point to the item text, you could
    // copy the item text into pszText using StringCchCopy. For example:

    // StringCchCopy(rgPetInfo[plvdi->item.iItem].szKind,
    // sizeof(rgPetInfo[plvdi->item.iItem].szKind),
    // plvdi->item.pszText);


    ну Ё-моё, ну три же итема вставляют, откуда 9 берется?
    Про поле Subitem вообще ни строчки, как это работает, разъясните плз.

    каюсь, что превратил тему в распрос про всю виндозную гую
     
  15. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Этот пример не используй - там слишком много деталей про GETDISPINFO. Вставить первую колонку через LVM_INSERTITEM, а следующие - через LVM_SETITEMTEXT.
     
  16. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    уже поздно и не имеет значения, но в следующий раз обязательно так и сделаю