Страница 1 из 2
Название интерфейса к Explorer bar "Folders"?
Добавлено: 17 мар 2004, 23:51
AiK
Хочу использовать в собственной программе Explorer bar "Folders".
Возможно это из Shell'a, т.к. используется и в NT Explore'e и в IE.
Возможно и в Outlook Express он же используется, только pidlRoot другой. Беда в том, что понятия не имею как эта штуковина грамотно называется. По-ламерски: нужна функциональность SHBrowseForFolder, но не в отдельном диалоге, а так как в IE см. View->Explorer bar->Folders
Добавлено: 18 мар 2004, 00:53
Andy
Если я правильно все понял, то есть 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.
- При раскрытии какого-либо итема повторять предыдущий пункт
Если нужен второй способ, то посоветую статью Леона Финкера на
http://www.codeproject.com (раздел Shell Programming). Очень рекомендую! Там правда на WTL (но лучше её
нет).
Добавлено: 18 мар 2004, 01:36
AiK
Первый способ не годится. Есть много на то причин и первая из них заключается в твоём "пока"
Второй способ конечно хорош, но
а) я запарился с извлечением иконок и
б) EnumObjects выдаёт папки вперемешку с файлами. А это не есть хорошо. А сортировать вручную неохота.
в) Это дерево - не самоцель, хотя и был бы весьма удобен в проекте.
Т.е. я этот способ отбросил, после того как понял, что, скажем, за неделю по вечерам его написать и оттестировать на _разных_ платформах не получится. Поэтому очень хочется третий способ - заюзать родной для системы элемент.
Добавлено: 18 мар 2004, 10:46
Andy
Дело в том, что Windows применяет именно 2-ой способ
. По крайней мере в Проводнике все заполняется таким способом. Так что легких путей нет.
а) я запарился с извлечением иконок
Это самое простое. Привожу пример из кода своего 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);
Все! Теперь картинки установлены.
EnumObjects выдаёт папки вперемешку с файлами. А это не есть хорошо.
Используй там константу SHCONTF_FOLDERS.
Вообще повторюсь про вышеуказанную статью - лучше ее нет.
Если не гемороиться, то остается только использовать чью-то ActiveX. Кроме моей есть несколько таких разработок - но у них куча недостатков (размер ~500кБ, так как написаны на Delphi, высокая цена и проч.)
Добавлено: 18 мар 2004, 12:44
AiK
Дело в том, что Windows применяет именно 2-ой способ . По крайней мере в Проводнике все заполняется таким способом
Терзают меня смутные сомнения, что уже в IE применяется 3-й способ
Используй там константу SHCONTF_FOLDERS.
Я немного криво выразился. Мне нужны и файлы и папки. Но сгруппированные: сначала папки, потом файлы. У меня они почему-то идут вперемешку, тупо отсортированные по алфавиту.
Если не гемороиться, то остается только использовать чью-то ActiveX
Не годидзе. Я тогда уж SHBrowseForFolder обойдусь
Добавлено: 18 мар 2004, 13:35
Andy
Терзают меня смутные сомнения, что уже в IE применяется 3-й способ
Если это так, то в любом случае он недокументирован, к сожалению. ListView - да он реализован. IShellFolder::CreateViewObject и т.д.
У меня они почему-то идут вперемешку, тупо отсортированные по алфавиту.
Да, сортировку надо делать самому...
Я тогда уж SHBrowseForFolder обойдусь
Если не нужна дополнительная функциональность - хороший вариант
<offtopic>
Почему-то уведомления об ответах не приходят, хотя вроде всё настроил...
</offtopic>
Добавлено: 18 мар 2004, 14:03
AiK
Если это так, то в любом случае он недокументирован, к сожалению
Ну, GUID уже установил, попробую что-нибудь нарыть...
Почему-то уведомления об ответах не приходят, хотя вроде всё настроил
Может в Минске цензура не успевает проворачиваться?
Если всё настроил - должны
ходить. По крайней мере ты первый, кто жалуется.
Добавлено: 18 мар 2004, 14:42
Andy
Ну, GUID уже установил, попробую что-нибудь нарыть...
Если что найдешь - сообщай (хотябы тот же самый GUID). Это дело интересное
Добавлено: 18 мар 2004, 15:18
AiK
хотябы тот же самый GUID
Это как раз просто. Вот этот код вызовет папку Folders в эксплорере:
Код: Выделить всё
<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>
Первый параметр ShowBrowserbar и есть искомый CLSID. Только пердуперждаю: у меня после первого запуска этого скрипта напрочь перестал этот бар работать. Пришлось восстанавливать IE.
Добавлено: 18 мар 2004, 15:29
Hawk
По моему тут вы все усложняете =) начиная от дисков FindFirstFile, FindNextFile и SHGetFileInfo практически все что надо делают. Для отделения файлов от папок проще сделать два прохода - в первом добавить все файлы у который атрибуты - папка, а во втором наоборот.