Как создать расширение оболочки Thumbnail

Расширение Thumbnail позволяет создавать эскизы файлов, которые будут отображаться в проводнике.

В библиотеке Shell Ace обработчик Icon реализует следующие интерфейсы:

После создания проекта расширения необходимо добавить в проект модуль с обработчиком Thumbnail. Для этого выберите соответствующую иконку на вкладке Shell extension:

Создание обработчика Thumbnail

Появится окно с предложением ввести имя класса и выбрать перекрываемые методы:

Методы обработчика Thumbnail

После нажатия на кнопку OK в проект будет добавлен модуль с каркасом обработчика. При включении опции Create sample помимо каркаса обработчика будут создан пример готового расширения оболочки, который можно использовать для изучения библиотеки. Рекомендуется перекрывать метод CreateThumbnailFromStream, поскольку это даст возможность Проводнику передавать в расширение не только реальные объекты файловой системы, но и виртуальные объекты, например файл из zip архива.

В обработчике можно перекрывать следующие виртуальные процедуры и функции:

procedure Initialize;

Процедура инициализации обработчика, вызывается один раз при создании экземпляра обработчика. В этой процедуре можно установить значения свойств Adornments и Cutoff.

Свойство Adornments имеет тип TdecThumbnailAdornments, оно определяет вид рамки, которая будет обрамлять изображение в Проводнике. Вид конкретной рамки определяется установленной визуальной темой. Тип TdecThumbnailAdornments определен следующим образом:

TdecThumbnailAdornments = (taDefault, taAuto, taNoAdornment, taDropShadow, taPhotoBorder, taVideoSprockets);
ЗначениеОписание
taDefaultВид рамки определяется системой.
taAutoБиблиотека Shell Ace попытается самостоятельно определить вид рамки на основе типа файла.
taNoAdornmentРамка отсутствует.
taDropShadowРамка в виде тени.
taPhotoBorderРамка в виде фотокарточки.
taVideoSprocketsРамка в виде видеопленки.

По умолчанию свойство Adornments имеет значение taDefault.

Свойство Cutoff имеет тип TdecThumbnailCutoff, оно определяет минимальный допустимый размер эскиза. Если оболочке необходимо отобразить эскиз файла с указанным или меньшим размером, то будет использоваться иконка файла. Тип TdecThumbnailCutoff определен следующим образом:

TdecThumbnailCutoff = (tcDefault, tc32x32, tc16x16, tc48x48, tc16x16v2);
ЗначениеОписание
tcDefaultМинимальный размер определяется системой.
tc32x32Минимальный размер равен 32x32 пикселей.
tc16x16Минимальный размер равен 16x16 пикселей.
tc48x48Минимальный размер равен 48x48 пикселей.
tc16x16v2Минимальный размер равен 16x16 пикселей.

По умолчанию свойство Cutoff имеет значение tсDefault.

procedure Clear;

Процедура вызывается при завершении работы с текущим файлом или потоком, переданным в обработчик.

class function GetClassID: TCLSID;

Функция должна возвращать уникальный идентификатор обработчика. Библиотека Shell Ace изначально генерирует уникальный идентификатор при генерации шаблона обработчика, поэтому менять его нет необходимости.

class function GetDescription: UnicodeString;

Функция должна возвращать описание обработчика.

procedure FillProgIDList(AList: TStrings);

В процедуре должно происходить заполнение списка AList ключами реестра, в которые будет прописан обработчик при регистрации расширения. Регистрация происходит в раздел реестра HKEY_CLASSES_ROOT. Например, если будет добавлен ключ .bmp, то расширение будет прописано в ветку HKEY_CLASSES_ROOT\.bmp\ShellEx\{BB2E617C-0920-11d1-9A0B-00C04FC2D6C1} и ветку HKEY_CLASSES_ROOT\.bmp\ShellEx\{E357FCCD-A995-4576-B01F-234630154E96} и будет соответствовать всем файлам, имеющим расширение bmp, а если будет добавлен ключ SystemFileAssociations\Audio, то расширение будет прописано в ветку HKEY_CLASSES_ROOT\SystemFileAssociations\Audio\ShellEx\{BB2E617C-0920-11d1-9A0B-00C04FC2D6C1} и ветку HKEY_CLASSES_ROOT\SystemFileAssociations\Audio\ShellEx\{E357FCCD-A995-4576-B01F-234630154E96} и будет соответствовать всем файлам, расширения которых имеют PerceivedType Audio.

При добавлении ключа реестра нужно учитывать, что в Windows определен порядок приоритета обработчиков. И если в системе зарегистрирован обработчик с более высоким приоритетом, то ваш обработчик не будет вызываться.

Порядок приоритета типов объектов, в порядке уменьшения приоритета, может отличаться в различных версиях Windows:

Ключ реестраПримечание
HKCR\ProgIDЕсли для расширения файла определено значение Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.Расширение\UserChoice
HKCR\ProgIDЕсли для расширения файла определено значение ProgID
HKCR\.РасширениеРасширение файла
HKCR\SystemFileAssociations\.РасширениеСистемное расширение файла
HKCR\SystemFileAssociations\PerceivedTypeЕсли для расширения файла определено значение PerceivedType
HKCR\Kind.KindЕсли для расширения файла определено значение Kind
HKCR\UnknownФайл, не имеющий описанного в реестре расширения
HKCR\*Любой файл

В общем случае рекомендуется регистрировать расширение на ProgID расширения файла.

function CreateThumbnailFromStream(AStream: TStream; AOpenMode: DWORD; ASize: TSize; AFlags: TdecThumbnailFlags; var AFormat: TdecThumbnailFormat): HBITMAP;

Функция должна на основании потока с данными AStream сформировать эскиз и вернуть его идентификатор (handle), вызывается в реализации метода Extract интерфейса IExtractImage и в реализации метода GetThumbnail интерфейса IThumbnailProvider.

Параметр OpenMode определяет режим работы с потоком. Он может быть равен следующим величинам:

  • STGM_READ – поток может быть использован только для чтения
  • STGM_READWRITE – поток может быть использован как для чтения, так и для записи.

Параметр ASize определяет оптимальные размеры формируемого изображения. Если сформированное изображение имеет соотношение сторон, отличное от соотношения сторон, переданных в ASize, то не нужно растягивать изображение. Оболочка Windows сама корректно отцентрует изображение при прорисовке.

Если будет сформировано изображение, имеющее большие размеры, нежели переданные в ASize, то библиотека Shell Ace самостоятельно уменьшит изображение до нужных размеров. Если в среде разработки установлен пакет Graphics32, то рекомендуется добавлять в список используемых модулей модуль decShellExtensionGraphics32. Это позволит библиотеке использовать более плавные процедуры сглаживания изображения при уменьшении его размеров. Так выглядит уменьшенный эскиз без использования модуля decShellExtensionGraphics32:

Эскиз без использования модуля decShellExtensionGraphics32

А так выглядит уменьшенный эскиз с использованием модуля decShellExtensionGraphics32:

Эскиз с использованием модуля decShellExtensionGraphics32

Если библиотека Shell Ace обнаружит установленный пакет Graphics32, то модуль decShellExtensionGraphics32 будет автоматически добавлен в список используемых модулей при создании каркаса обработчика.

Для формирования информации о иконке можно дополнительно анализировать флаги AFlags. Тип TdecThumbnailFlags определен следующим образом:

TdecThumbnailFlag = (ftOffline, ftQuality, ftOriginalSize, tfAlpha);
TdecThumbnailFlags = set of TdecThumbnailFlag;

Каждый из элементов множества, кроме tfAlpha, соответствует одному из флагов, переданных в метод GetLocation method интерфейса IExtractImage. При использовании оболочкой интерфейса IThumbnailProvider флаги эмулируются библиотекой Shell Ace.

ЗначениеWinAPI флагОписание
ftOfflineIEIFLAG_OFFLINEДля формирования изображения обработчик должен использовать только локальное содержимое.
ftQualityIEIFLAG_QUALITYОболочка ожидает получить изображение, сформированное на основе файла, а не на основе уменьшенного изображения, которое может содержаться в файле.
ftOriginalSizeIEIFLAG_ORIGSIZEUsed to tell the handler to render the image to the approximate size passed in ASize, but crop it if necessary.
tfAlphaОболочка может корректно отображать 32-битные изображения с альфа-каналом. Если при отсутствии этого флага будет возвращено 32-битные изображение, то библиотека Shell Ace самостоятельно преобразует его к 24-битному.

Флаги IEIFLAG_ASYNC и IEIFLAG_CACHE библиотека Shell Ace обрабатывает самостоятельно.

В параметре AFormat нужно сообщить оболочке о наличии альфа-канала в сформированном изображении. Тип TdecThumbnailFormat определен следующим образом:

TdecThumbnailFormat = (taUnknow, taRGB, taARGB);

Каждый из элементов множества соответствует одному из флагов, возвращаемых в оболочку методом GetThumbnail интерфейса IThumbnailProvider.

ЗначениеWinAPI флагОписание
taUnknowWTSAT_UNKNOWNО наличии альфа-канала не известно.
taRGBWTSAT_RGBИзображение не имеет альфа-канала.
taARGBWTSAT_ARGBИзображение имеет альфа-канал.

По умолчанию параметр AFormat имеет значение taUnknow.

function CreateThumbnailFromFile(const AFileName: UnicodeString; AOpenMode: DWORD; ASize: TSize; AFlags: TdecThumbnailFlags; var AFormat: TdecThumbnailFormat): HBITMAP;

Метод аналогичен методу CreateThumbnailFromStream за исключением того, что вместо потока передается имя файла. Для создания потока для чтения данных из файла можно воспользоваться следующей функцией:

function CreateStream(const AFileName: UnicodeString; AOpenMode: DWORD = DefaultOpenMode): TStream;

После использования полученного потока его нужно удалить.

Обязательными для реализации в обработчике Thumbnail являются следующие методы:

Смотрите также: