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

С типом файла часто связан пользовательский значок, чтобы его члены были легко узнаваемыми в Windows Обозреватель. Самый простой способ назначить настраиваемый значок типу файла — зарегистрировать файл значка. Однако значок, зарегистрированный таким образом, будет одинаковым для всех членов типа файла. Вы можете гораздо более гибко назначать значки членам типа файла, реализовав обработчик значков.

Обработчик значков — это тип обработчика расширения оболочки, который позволяет динамически назначать значки членам типа файла. При каждом отображении файла типа оболочка запрашивает у обработчика соответствующий значок. Например, обработчик значков может назначать разные значки разным членам типа файла или изменять значок в зависимости от текущего состояния файла.

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

Инструкции

Шаг 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}

Создание обработчиков расширений оболочки

IPersistFile

IExtractIcon