Название интерфейса к Explorer bar "Folders"?

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Eugie, Romeo, Hawk

Аватара пользователя
AiK
Сообщения: 2271
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

17 мар 2004, 23:51

Хочу использовать в собственной программе Explorer bar "Folders".
Возможно это из Shell'a, т.к. используется и в NT Explore'e и в IE.
Возможно и в Outlook Express он же используется, только pidlRoot другой. Беда в том, что понятия не имею как эта штуковина грамотно называется. По-ламерски: нужна функциональность SHBrowseForFolder, но не в отдельном диалоге, а так как в IE см. View->Explorer bar->Folders
Даже самый дурацкий замысел можно воплотить мастерски
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

18 мар 2004, 00:53

Если я правильно все понял, то есть 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 (но лучше её нет).
Аватара пользователя
AiK
Сообщения: 2271
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

18 мар 2004, 01:36

Первый способ не годится. Есть много на то причин и первая из них заключается в твоём "пока" :)
Второй способ конечно хорош, но
а) я запарился с извлечением иконок и
б) EnumObjects выдаёт папки вперемешку с файлами. А это не есть хорошо. А сортировать вручную неохота.
в) Это дерево - не самоцель, хотя и был бы весьма удобен в проекте.

Т.е. я этот способ отбросил, после того как понял, что, скажем, за неделю по вечерам его написать и оттестировать на _разных_ платформах не получится. Поэтому очень хочется третий способ - заюзать родной для системы элемент.
Даже самый дурацкий замысел можно воплотить мастерски
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

18 мар 2004, 10:46

Дело в том, что 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, высокая цена и проч.)
Аватара пользователя
AiK
Сообщения: 2271
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

18 мар 2004, 12:44

Дело в том, что Windows применяет именно 2-ой способ . По крайней мере в Проводнике все заполняется таким способом
Терзают меня смутные сомнения, что уже в IE применяется 3-й способ :)
Используй там константу SHCONTF_FOLDERS.
Я немного криво выразился. Мне нужны и файлы и папки. Но сгруппированные: сначала папки, потом файлы. У меня они почему-то идут вперемешку, тупо отсортированные по алфавиту.
Если не гемороиться, то остается только использовать чью-то ActiveX
Не годидзе. Я тогда уж SHBrowseForFolder обойдусь :)
Даже самый дурацкий замысел можно воплотить мастерски
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

18 мар 2004, 13:35

Терзают меня смутные сомнения, что уже в IE применяется 3-й способ
Если это так, то в любом случае он недокументирован, к сожалению. ListView - да он реализован. IShellFolder::CreateViewObject и т.д.
У меня они почему-то идут вперемешку, тупо отсортированные по алфавиту.
Да, сортировку надо делать самому...
Я тогда уж SHBrowseForFolder обойдусь
Если не нужна дополнительная функциональность - хороший вариант :)

<offtopic>
Почему-то уведомления об ответах не приходят, хотя вроде всё настроил... :(
</offtopic>
Аватара пользователя
AiK
Сообщения: 2271
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

18 мар 2004, 14:03

Если это так, то в любом случае он недокументирован, к сожалению
Ну, GUID уже установил, попробую что-нибудь нарыть...
Почему-то уведомления об ответах не приходят, хотя вроде всё настроил
Может в Минске цензура не успевает проворачиваться? :) Если всё настроил - должны
ходить. По крайней мере ты первый, кто жалуется.
Даже самый дурацкий замысел можно воплотить мастерски
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

18 мар 2004, 14:42

Ну, GUID уже установил, попробую что-нибудь нарыть...
Если что найдешь - сообщай (хотябы тот же самый GUID). Это дело интересное :)
Аватара пользователя
AiK
Сообщения: 2271
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

18 мар 2004, 15:18

хотябы тот же самый 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.
Даже самый дурацкий замысел можно воплотить мастерски
Hawk
Сообщения: 215
Зарегистрирован: 17 фев 2004, 14:52
Откуда: СПб
Контактная информация:

18 мар 2004, 15:29

По моему тут вы все усложняете =) начиная от дисков FindFirstFile, FindNextFile и SHGetFileInfo практически все что надо делают. Для отделения файлов от папок проще сделать два прохода - в первом добавить все файлы у который атрибуты - папка, а во втором наоборот.
Ответить