Как сформировать полный путь к каталогу из путей к его родительским каталогам

288
26 ноября 2016, 19:05

Здравствуйте! Использую VS15 без mfc. Вот разобрался как пользоваться tree view элементом, как winpai средствами перебирать файлы в директории и записывать их в дерево, но не понял как записывать элемент на 3 уровне, т.е. я раскрываю C:\ элемент там нажимаю на windows элемент, но узнать что в этой папке находится не могу так как пути нету, только имя.

                //Здесь вывожу все диски в root и во второй уровень записываю файлы и директории находящиеся 
                // в этих дисках на уровень ниже
                int typeLogicalDrives = 0;
                for (std::list<char*>::reverse_iterator i = m_logicalDrivesList.rbegin(); i != m_logicalDrivesList.rend(); i++)
                {
                    typeLogicalDrives = GetDriveType(*i);
                    if (typeLogicalDrives == DRIVE_REMOVABLE || typeLogicalDrives == DRIVE_FIXED)
                    {
                        Root = NULL;
                        Before = NULL;
                        Parent = NULL;
                        tvinsert.hParent = NULL;
                        tvinsert.hInsertAfter = TVI_ROOT;
                        tvinsert.item.pszText = *i;
                        tvinsert.item.iImage = 0;
                        tvinsert.item.iSelectedImage = 1;
                        Parent = (HTREEITEM)SendMessage(treeView, TVM_INSERTITEM, 0, (LPARAM)&tvinsert);
                        WIN32_FIND_DATA file;
                        HANDLE f;
                        char nameDir[256];
                        strcpy_s(nameDir, *i);
                        strcat_s(nameDir, "*");
                        f = FindFirstFile(nameDir, &file);
                        if (f != INVALID_HANDLE_VALUE)
                        {
                            Root = Parent;
                            Before = Parent;                   // handle of the before root
                            tvinsert.hParent = Parent;         // handle of the above data
                            tvinsert.hInsertAfter = TVI_LAST;  // below parent
                            tvinsert.item.iImage = 0;
                            tvinsert.item.iSelectedImage = 1;
                            do
                            {
                                tvinsert.item.pszText = file.cFileName;
                                Parent = (HTREEITEM)SendMessage(treeView, TVM_INSERTITEM, 0, (LPARAM)&tvinsert);
                            } while (FindNextFile(f, &file));
                        }
                        FindClose(f);

                    }
                }
 .........
 // При нажатии на элемент добавляется item
 case WM_NOTIFY:
{
    if (((LPNMHDR)lParam)->code == NM_DBLCLK) // if code == NM_CLICK - Single click on an item
    {
        char Text[256] = "";
        memset(&tvi, 0, sizeof(tvi));
        Selected = (HTREEITEM)SendMessage(treeView, TVM_GETNEXTITEM, TVGN_CARET, (LPARAM)Selected);
        if (Selected == NULL)
        {
            MessageBox(window, "No Items in TreeView", "Error", MB_OK | MB_ICONINFORMATION);
            break;
        }
        TreeView_EnsureVisible(treeView, Selected);
        SendMessage(treeView, TVM_SELECTITEM, TVGN_CARET, (LPARAM)Selected);
        tvi.mask = TVIF_TEXT;
        tvi.pszText = Text;
        tvi.cchTextMax = 256;
        tvi.hItem = Selected;
        if (SendMessage(treeView, TVM_GETITEM, TVGN_CARET, (LPARAM)&tvi))
        {
            if (CheckFilesInDirectory(tvi.pszText) == true)
            {
                MessageBox(0, "Press OK", (LPCSTR)Selected, MB_OK | MB_ICONINFORMATION);

                tvinsert.hParent = Selected;        
                tvinsert.hInsertAfter = TVI_LAST; 
                tvinsert.item.pszText = "Child Added";
                Parent = (HTREEITEM)SendMessage(treeView, TVM_INSERTITEM, 0, (LPARAM)&tvinsert);
            }
        }
    }
}
break;

В обработчике событий есть такая функция CheckFilesInDirectory(tvi.pszText) == true она не работает так как вместо имени элемента должен указываться путь. Как сделать этот путь?

Answer 1

В структуре TVITEM есть поле lparam. Туда Вы можете записать любой указатель на свои структуры. Например, это может быть индекс элемента в Вашем массиве или указатель на какие-то данные. Только, если Вы будете выделять память, не забывайте ее освобождать

READ ALSO
Запись и чтение QVector &lt;object&gt; [закрыто]

Запись и чтение QVector <object> [закрыто]

Имеется QVector <data> objКак лучше реализовать бинарный файловый ввод-вывод?

133
Каст к enum class

Каст к enum class

Законен ли каст значения типа underlying type к типу моего enum class? Те

260
Помогите разобраться с Nearest neighbor search [закрыто]

Помогите разобраться с Nearest neighbor search [закрыто]

Разбираюсь с поиском соседних частиц в программе fluidv3, не мог бы кто-то пояснить как происходит

154