C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 79 - Shell extensions / С++ Builder 5 / Borland C++

Шаг 79 - Shell extensions

Строго говоря, я сейчас буду говорить не о всей теме расширений оболочки, а более конкретно - о функции, открывающей окно выбора папки, и списках идентификаторов.

Что такое списки идентификаторов... Вообще, предполагается, что в оболочке данные, такие как имена файлов, директорий и т.д. записываются не простыми строками, а списками идентификаторов. Это довольно сложный способо хранения информации такого рода, и мне немного непонятно, к чему такие ухищрения... Но, неважно. Так вот, так как диалог открывается, первая выделенная папка, которую он отображает, и вообще выбранная папка, которую он (вернее она - функция) возвращает, находятся в указателях на списки идентфикаторов, именумых item identifier list. Для этих списков существуют функции. Которые мы естественно рассмотрим.

SHBrowseForFolder

Функция, открывающая диалоговое окно, довольно лаконично выглядит:

WINSHELLAPI LPITEMIDLIST WINAPI SHBrowseForFolder( LPBROWSEINFO lpbi );

Как я и предупреждал, возвращает указатель на список идентификаторов. Аргумент lpbi содержит необходимые данные. Хочу обратить Ваше внимание на некоторую систему, существующую в способах определения данных в WinAPI. Имена структур пишутся прописью (ITEMIDLIST). Простой указатель на эту структуру прибавляет P (PITEMIDLIST). Дальний указатель - LP (LPITEMIDLIST). Дальний константный указатель - LPC (LPCITEMIDLIST).

BROWSEINFO

Надо сказать, помимо того, что эта структура передает иформацию функции SHBrowseForFolder, функция через эту структуру еще и кое-что возвращает. Определение функции выглядит так:

typedef struct _browseinfo {  
	HWND hwndOwner;
	LPCITEMIDLIST pidlRoot;
	LPSTR pszDisplayName;
	LPCSTR lpszTitle;
	UINT ulFlags;
	BFFCALLBACK lpfn;
	LPARAM lParam;
	int iImage;
} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO; 

  • hwndOwner - Указатель на родительское окно, обычно это главная форма приложения. Реально относительно этого параметра диалог выравнивается. Вполне может быть NULL, тогда дилог выравнивается относительно корневого окна.
  • pidlRoot - Указатель на список идентификаторов, указывающих, от какого каталога показать дерево. Несмотря на то, что определен как LPCITEMIDLIST, в качестве параметра нужно передавать просто LPITEMIDLIST.
  • pszDisplayName - Указатель на область памяти (массив байтов, или NULL-terminated строка), получающих путь выбранной папки выбранной пользователем. Предполагается, что размер массива MAX_PATH байтов.
  • lpszTitle - Указатель на NULL-terminated строку, которая отображается над деревом. Опять-таки может быть равна NULL
  • ulFlags - Целое значение, определяющее поведение диалогового окна. Получается OR-комбинированием следующих значений:
    • BIF_BROWSEFORCOMPUTER - разрешает пользователю выбирать только компьютеры сетевого окружения.
    • BIF_BROWSEFORPRINTER - то же самое с принтерами
    • BIF_DONTGOBELOWDOMAIN - не выходить из домена сети
    • BIF_RETURNFSANCESTORS - возвращать только системные подпапки
    • BIF_RETURNONLYFSDIRS - возвращать только системные папки
    • BIF_STATUSTEXT - разрешает отображение статусного текста.
  • lpfn - Указатель на функцию-обработчик событий диалогового окна. Должна быть типа BrowseCallbackProc, которую мы рассмотрим ниже. Может быть равно NULL.
  • lParam - Любое значение, которое передается функции lpfn при возникновении события.
  • iImage - Получает индекс значка выбранной папки. Это индекс значка в системном списке изображений (IMAGELIST).

Ну, на этот шаг пока достаточно. В следующем шаге рассмотрим ITEMIDLIST и BrowseCallbackProc.


| |
Автор Аванесов Самвел.
[AD]