Создается все нормально, но при посылке сообщения 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 был и еще кучей элементов
TVIF_TEXT обязывает заполнить также pszText и cchTextMax. Первый - указатель на существующий буфер, второй - его длина в символах. memset() наверное не нужен - только задержит код. Если это не сработает, тогда добавить ещё маску TVIF_HANDLE.
Касательно Tab Control: единственное что Tab Control делает - это рисование своих элементов и посылание сообщений родителю при переключении элементов. Страницы все делаются вручную. Страница - это диалог без бордюра (child dialog), созданный как modeless. Когда Tab Control посылает TCN_SELCHANGE - надо скрыть активный диалог-страницу и показать следующую. Не забудь про IsDialogMessage() - без этого modeless диалоги не будут работать как положено. Если твой Tab Control изменяет размер (resizable) - обрати внимание на сообщение TCM_ADJUSTRECT - оно рассчитывает размер окна (диалог-страницы), которое точно подпадает под размер Tab Control.
_220 По-моему, ты не понимаешь что такое TreeView. Это дерево для просмотра инфы, которую ты туда положишь. Чтобы там были каталоги ты должен извлечь их имена в текстовом виде и занести. Оттого, что ты назвал узел "c:\" он не стал диском с. Это просто узел с такой надписью. Есть готовый компонент на закладке samples - shelltreeview, там все сделано уже. С TabControl тоже просто : идешь в Tabs -> TStrings и заполняешь имена закладок. Появятся закладки и к каждой страница. Теперь можешь бросать контролы. На разные страницы переходишь меняя поле TabIndex 0,1 ....
c TreeView все ясно, я назвал узел c:\ и хочу получить назад название узла, чтобы из них составить путь к директории. У вас в коде кажется делфями попахивает, а я пишу ни vc++6 отметка handle'а не помогает, вообще нет разницы до SendMessage и после, быть может это от того, что я в диалоге работаю с TreeView? А про TabControl можно поподробнее, в общих чертах я понял, а где можно в деталях узнать, что писать (вообще что делать после того, как я в редакторе ресурсов нарисовал TabControl). В msdn сам черт ногу сломит, там все на MFC держится, а мне нужен голый API.
яхз где ты там делфи нашёл, вот это делфи: Код (Text): strct:xTV_ITEM; sText: array[0..1023] of Char; //char sText[1 kb]; ... strct.hItem:=SendDlgItemMessage(hwnd,1110,TVM_GETNEXTITEM, TVGN_CARET,hwndFrom); strct.pszText:=@sText; strct.cchTextMax:=sizeof(sText); strct.imask:=TVIF_TEXT or TVIF_STATE; Zero(@Stext); SendDlgItemMessage(hwnd,1110,TVM_GETITEM, 0, dword(@strct)); уж извини, я тогда на делфи писал(чуть не сказал "играл" гыгы)
_220 Я с работы пишу, т.ч. завтра посмотрю. Сейчас ухожу. Мне в Вижуале не понравилось, что нет дефолтного метода - в Дельфи клик по умолчанию зашит, в С++ я должен сам знать название метода и выбрать из десятка. А уж на API писать - это для меня темный лес. Я пару раз готовые исходники правил и несколько раз трассировал обработчик мессаджей(sendMessage в смысле).
нашел в msdn про таб, сделал сам таб с закладками и диалоги к нему, пока не получилось вывести вкладку, DialogBox выходит с -1, наверное это из-за неправильной функции обрпботки, у меня в коде нету никакой isDlgMessage(), куда ее вставить?
_220 Для меня это все темный лес, т.ч. я уступаю место знающим. По поводу GetItem - из дельфийского текста видно что сначала надо TVM_GETNEXTITEM Вот это же на С++: http://bbs.vbstreets.ru/viewtopic.php?p=143617&sid=c357ad5f5d57fe4ef595af666969a079 Может там и про табсы найдешь.
да я специально не стал на си переписывать, ибо был уверен что проблем с переводом такого текста не возникнет..
С переводом проблем-то не возникло, я увидел, что не заполнил поле размера, и почему-то думал, что где-то в глубинах SendMessage память под текст выделится сама . В общем TreeView работает, пока. Осталось дождаться доброго человека, который объяснит,как работать с табом.
Путем проб и ошибок сделал таб, на очереди еще один крутой вопрос, ана этот раз с 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 вообще ни строчки, как это работает, разъясните плз. каюсь, что превратил тему в распрос про всю виндозную гую
Этот пример не используй - там слишком много деталей про GETDISPINFO. Вставить первую колонку через LVM_INSERTITEM, а следующие - через LVM_SETITEMTEXT.