Как создать обработчики значков
Тип файла часто связан с ним настраиваемым значком, чтобы его члены были легко распознаваемыми в проводнике Windows. Самый простой способ назначить пользовательский значок типу файла — зарегистрировать файл значка. Однако значок, зарегистрированный таким образом, будет одинаковым для всех членов типа файла. Вы можете гораздо более гибко назначать значки членам типа файла, реализуя обработчик значков .
Обработчик значков — это тип обработчика расширений оболочки, который позволяет динамически назначать значки членам типа файла. Каждый раз при отображении файла данного типа оболочка запрашивает у обработчика соответствующий значок. Например, обработчик значков может назначать различные значки разным членам типа файла или изменять значок в зависимости от текущего состояния файла.
Общие процедуры реализации и регистрации обработчика расширений оболочки рассматриваются в Создание обработчиков расширений оболочки. В этом документе рассматриваются те аспекты реализации, которые относятся к обработчикам значков.
- Реализация обработчиков значков
- Реализация интерфейса IExtractIcon
- регистрация обработчиков иконок
- Связанные темы
Инструкции
Шаг 1. Реализация обработчиков значков
Как и все обработчики расширений оболочки, обработчики значков — это объекты объектной модели компонентов (COM), реализованные как библиотеки DLL. Они должны экспортировать два интерфейса в дополнение к IUnknown: IPersistFile и IExtractIcon.
Оболочка инициализирует обработчик с помощью интерфейса IPersistFile. Он использует этот интерфейс для запроса идентификатора класса обработчика (CLSID) и предоставляет его имя файла. Остальная часть операции выполняется через интерфейс IExtractIcon. Общие сведения о том, как реализовать обработчики расширений оболочки, включая интерфейс IPersistFile, см. в разделе Создание обработчиков расширений оболочки. Остальная часть этого документа описывает, как реализовать интерфейс IExtractIcon.
Шаг 2. Реализация интерфейса IExtractIcon
После инициализации интерфейса оболочка использует интерфейса IExtractIcon обработчика для запроса соответствующего значка. Интерфейс имеет два метода: IExtractIcon::GetIconLocation и IExtractIcon::Extract.
Значки определяются их расположением в файловой системе. Метод IExtractIcon::GetIconLocation вызывается для запроса этой информации. Задайте для параметра szIconFile имя файла. Если в файле есть несколько значков, задайте piIndex индекс значка. Назначьте соответствующие значения двум переменным флага. Если вы не хотите указывать имя файла или не хотите, чтобы оболочка извлекала значок, задайте флаг GIL_NOTFILENAME в параметре pwFlags. Не нужно назначать значение szIconFile, но обработчик должен предоставлять дескрипторы значков при вызове интерфейса оболочки IExtractIcon::Extract.
При возврате имени файла оболочка обычно пытается загрузить значок из кэша. Чтобы предотвратить загрузку кэшированного значка, задайте флаг GIL_DONTCACHE в параметре pwFlags. Если кэшированный значок не загружен, оболочка вызывает IExtractIcon::Extract, чтобы запросить дескриптор значка.
Если файл и индекс были указаны IExtractIcon::GetIconLocation, они передаются в IExtractIcon::Extract в pszFile и nIconIndex параметров соответственно. Если указано имя файла, ваш обработчик может вернуть S_FALSE, чтобы позволить оболочке извлечь значок. В противном случае обработчик должен извлечь или создать иным образом большие и небольшие значки, и назначить их дескрипторы HICON параметрам phiconLarge и phiconSmall. Интерфейс добавляет значки в свой кэш, чтобы ускорить последующие вызовы обработчика.
Шаг 3. Регистрация обработчиков значков
При статической регистрации значка для типа файласоздается подраздел DefaultIcon в файле ProgID для типа файла. Для файла, содержащего значок, задано значение по умолчанию. Чтобы зарегистрировать обработчик значков, необходимо по-прежнему иметь подраздел DefaultIcon, но его значение по умолчанию должно иметь значение "%1". Добавьте подраздел IconHandler в подраздел Shellex подраздела ProgID и задайте его значение по умолчанию строковой форме GUID CLSID обработчика. Общие сведения о том, как зарегистрировать обработчики расширений оболочки, см. в разделе Создание обработчиков расширений оболочки.
Следующий пример изменяет запись реестра из раздела "Настройка значков" так, чтобы тип файла .myp теперь использовал обработчик контекстного меню вместо статически определенного значка.
HKEY_CLASSES_ROOT
.myp
(Default) = MyProgram.1
MyProgram.1
(Default) = MyProgram Application
DefaultIcon
(Default) = %1
Shellex
IconHandler
(Default) = {The handler's CLSID GUID}
Связанные разделы