Хочу использовать в собственной программе Explorer bar "Folders".
Возможно это из Shell'a, т.к. используется и в NT Explore'e и в IE.
Возможно и в Outlook Express он же используется, только pidlRoot другой. Беда в том, что понятия не имею как эта штуковина грамотно называется. По-ламерски: нужна функциональность SHBrowseForFolder, но не в отдельном диалоге, а так как в IE см. View->Explorer bar->Folders
Название интерфейса к Explorer bar "Folders"?
Модераторы: Duncon, Hawk, Romeo, Eugie
Даже самый дурацкий замысел можно воплотить мастерски
Если я правильно все понял, то есть 2 предложения:
1. Использовать мой собственный ActiveX контрол, который является функциональной заменой SHBrowseForFolder() (более мощной). Загрузить можно с моего сайта http://shell-controls.narod.ru . Там же про него написано более подробно (автоматизация, connection points). Компонент пока тестируется и поэтому бесплатный.
2. Писать все самому. Писать придется много, но зато можно сделать по-своему. Все перечислять очень долго, но самые основные моменты выделю:
1. Использовать мой собственный ActiveX контрол, который является функциональной заменой SHBrowseForFolder() (более мощной). Загрузить можно с моего сайта http://shell-controls.narod.ru . Там же про него написано более подробно (автоматизация, connection points). Компонент пока тестируется и поэтому бесплатный.
2. Писать все самому. Писать придется много, но зато можно сделать по-своему. Все перечислять очень долго, но самые основные моменты выделю:
- Установить для дерева Shell Image List
- Инициализировать дерево с pidl Desktop'a (например). Получить его можно API SHGetSpecialFolderLocation() (CLSID == CSIDL_DESKTOP)
- Отобразить в дереве все десктоповские дочерние элементы с помощью методов IShellFolder::EnumObjects и Enum'a.
- При раскрытии какого-либо итема повторять предыдущий пункт
Первый способ не годится. Есть много на то причин и первая из них заключается в твоём "пока"
Второй способ конечно хорош, но
а) я запарился с извлечением иконок и
б) EnumObjects выдаёт папки вперемешку с файлами. А это не есть хорошо. А сортировать вручную неохота.
в) Это дерево - не самоцель, хотя и был бы весьма удобен в проекте.
Т.е. я этот способ отбросил, после того как понял, что, скажем, за неделю по вечерам его написать и оттестировать на _разных_ платформах не получится. Поэтому очень хочется третий способ - заюзать родной для системы элемент.
Второй способ конечно хорош, но
а) я запарился с извлечением иконок и
б) EnumObjects выдаёт папки вперемешку с файлами. А это не есть хорошо. А сортировать вручную неохота.
в) Это дерево - не самоцель, хотя и был бы весьма удобен в проекте.
Т.е. я этот способ отбросил, после того как понял, что, скажем, за неделю по вечерам его написать и оттестировать на _разных_ платформах не получится. Поэтому очень хочется третий способ - заюзать родной для системы элемент.
Даже самый дурацкий замысел можно воплотить мастерски
Дело в том, что Windows применяет именно 2-ой способ . По крайней мере в Проводнике все заполняется таким способом. Так что легких путей нет.
Все! Теперь картинки установлены.
Вообще повторюсь про вышеуказанную статью - лучше ее нет.
Если не гемороиться, то остается только использовать чью-то ActiveX. Кроме моей есть несколько таких разработок - но у них куча недостатков (размер ~500кБ, так как написаны на Delphi, высокая цена и проч.)
Это самое простое. Привожу пример из кода своего ActiveX компонента.а) я запарился с извлечением иконок
Код: Выделить всё
SHFILEINFO sfi;
LPITEMIDLIST pidlDesktop;
// get desktop's PIDL
SHGetSpecialFolderLocation(NULL,CSIDL_DESKTOP,&pidlDesktop);
// get imagelist & set images
m_hShellImageList = (HIMAGELIST)SHGetFileInfo((LPTSTR)pidlDesktop,
0,&sfi,sizeof(SHFILEINFO),SHGFI_PIDL | SHGFI_SMALLICON
| SHGFI_SYSICONINDEX);
TreeView_SetImageList(m_hShellTree,m_hShellImageList,TVSIL_NORMAL);
Используй там константу SHCONTF_FOLDERS.EnumObjects выдаёт папки вперемешку с файлами. А это не есть хорошо.
Вообще повторюсь про вышеуказанную статью - лучше ее нет.
Если не гемороиться, то остается только использовать чью-то ActiveX. Кроме моей есть несколько таких разработок - но у них куча недостатков (размер ~500кБ, так как написаны на Delphi, высокая цена и проч.)
Терзают меня смутные сомнения, что уже в IE применяется 3-й способДело в том, что Windows применяет именно 2-ой способ . По крайней мере в Проводнике все заполняется таким способом
Я немного криво выразился. Мне нужны и файлы и папки. Но сгруппированные: сначала папки, потом файлы. У меня они почему-то идут вперемешку, тупо отсортированные по алфавиту.Используй там константу SHCONTF_FOLDERS.
Не годидзе. Я тогда уж SHBrowseForFolder обойдусьЕсли не гемороиться, то остается только использовать чью-то ActiveX
Даже самый дурацкий замысел можно воплотить мастерски
Если это так, то в любом случае он недокументирован, к сожалению. ListView - да он реализован. IShellFolder::CreateViewObject и т.д.Терзают меня смутные сомнения, что уже в IE применяется 3-й способ
Да, сортировку надо делать самому...У меня они почему-то идут вперемешку, тупо отсортированные по алфавиту.
Если не нужна дополнительная функциональность - хороший вариантЯ тогда уж SHBrowseForFolder обойдусь
<offtopic>
Почему-то уведомления об ответах не приходят, хотя вроде всё настроил...
</offtopic>
Ну, GUID уже установил, попробую что-нибудь нарыть...Если это так, то в любом случае он недокументирован, к сожалению
Может в Минске цензура не успевает проворачиваться? Если всё настроил - должныПочему-то уведомления об ответах не приходят, хотя вроде всё настроил
ходить. По крайней мере ты первый, кто жалуется.
Даже самый дурацкий замысел можно воплотить мастерски
Если что найдешь - сообщай (хотябы тот же самый GUID). Это дело интересноеНу, GUID уже установил, попробую что-нибудь нарыть...
Это как раз просто. Вот этот код вызовет папку Folders в эксплорере:хотябы тот же самый GUID
Код: Выделить всё
<html>
<body>
<object id="WebBrowser1" classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2" height="0" width="0"></object>
<script>
WebBrowser1.ShowBrowserbar("{EFA24E64-B078-11d0-89E4-00C04FC9E26E}", true);
</script>
</body>
</html>
Даже самый дурацкий замысел можно воплотить мастерски
По моему тут вы все усложняете =) начиная от дисков FindFirstFile, FindNextFile и SHGetFileInfo практически все что надо делают. Для отделения файлов от папок проще сделать два прохода - в первом добавить все файлы у который атрибуты - папка, а во втором наоборот.