Как создать расширение оболочки Thumbnail
Расширение Thumbnail позволяет создавать эскизы файлов, которые будут отображаться в проводнике.
В библиотеке Shell Ace обработчик Icon реализует следующие интерфейсы:
- IThumbnailProvider
- IExtractImage
- IExtractImage2
- IInitializeWithStream
- IInitializeWithItem
- IInitializeWithFile
- IPersistStream
- IParentAndItem
- IPersistFile
После создания проекта расширения необходимо добавить в проект модуль с обработчиком Thumbnail. Для этого выберите соответствующую иконку на вкладке Shell extension:
Появится окно с предложением ввести имя класса и выбрать перекрываемые методы:
После нажатия на кнопку 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:
Если библиотека Shell Ace обнаружит установленный пакет Graphics32, то модуль decShellExtensionGraphics32 будет автоматически добавлен в список используемых модулей при создании каркаса обработчика.
Для формирования информации о иконке можно дополнительно анализировать флаги AFlags. Тип TdecThumbnailFlags определен следующим образом:
TdecThumbnailFlag = (ftOffline, ftQuality, ftOriginalSize, tfAlpha);
TdecThumbnailFlags = set of TdecThumbnailFlag;
Каждый из элементов множества, кроме tfAlpha, соответствует одному из флагов, переданных в метод GetLocation method интерфейса IExtractImage. При использовании оболочкой интерфейса IThumbnailProvider флаги эмулируются библиотекой Shell Ace.
Значение | WinAPI флаг | Описание |
---|---|---|
ftOffline | IEIFLAG_OFFLINE | Для формирования изображения обработчик должен использовать только локальное содержимое. |
ftQuality | IEIFLAG_QUALITY | Оболочка ожидает получить изображение, сформированное на основе файла, а не на основе уменьшенного изображения, которое может содержаться в файле. |
ftOriginalSize | IEIFLAG_ORIGSIZE | Used 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 флаг | Описание |
---|---|---|
taUnknow | WTSAT_UNKNOWN | О наличии альфа-канала не известно. |
taRGB | WTSAT_RGB | Изображение не имеет альфа-канала. |
taARGB | WTSAT_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 являются следующие методы:
- GetClassID
- FillProgIDList
- CreateThumbnailFromStream или CreateThumbnailFromFile
Смотрите также:
- Что такое расширение оболочки
- Какие бывают расширения оболочки
- Как создать расширение оболочки
- Инициализация расширений оболочки
- Как создать расширение оболочки Context menu
- Как создать расширение оболочки Drag and drop context menu
- Как создать расширение оболочки Drop target
- Как создать расширение оболочки Icon
- Как создать расширение оболочки Info tip
- Как создать расширение оболочки Overlay icon
- Как создать расширение оболочки Preview
- Как создать расширение оболочки Property sheet
- Как создать расширение оболочки Property store
- Как создать расширение оболочки Thumbnail
- Как зарегистрировать расширение оболочки
- Как отлаживать расширение оболочки
- Использование логов