Compartilhar via


Como criar manipuladores de ícone

Um tipo de arquivo geralmente tem um ícone personalizado associado a ele, para tornar seus membros facilmente reconhecíveis no Windows Explorer. A maneira mais simples de atribuir um ícone personalizado a um tipo de arquivo é registrar o arquivo do ícone. No entanto, um ícone registrado dessa forma será o mesmo para todos os membros do tipo de arquivo. Você pode ter muito mais flexibilidade na atribuição de ícones aos membros do tipo de arquivo implementando um manipulador de ícones.

Um manipulador de ícones é um tipo de manipulador de extensão shell que permite atribuir ícones dinamicamente aos membros de um tipo de arquivo. Sempre que um arquivo do tipo é exibido, o Shell consulta o manipulador para o ícone apropriado. Por exemplo, um manipulador de ícones pode atribuir ícones diferentes a diferentes membros do tipo de arquivo ou variar o ícone com base no estado atual do arquivo.

Os procedimentos gerais para implementar e registrar um manipulador de extensão do Shell são discutidos em Criando manipuladores de extensão do Shell. Este documento se concentra nesses aspectos de implementação que são específicos para manipuladores de ícones.

Instruções

Etapa 1: Implementando manipuladores de ícones

Como todos os manipuladores de extensão do Shell, os manipuladores de ícone são objetos COM (Component Object Model) em processo implementados como DLLs. Eles devem exportar duas interfaces além de IUnknown: IPersistFile e IExtractIcon.

O Shell inicializa o manipulador por meio de sua interface IPersistFile . Ele usa essa interface para solicitar o CLSID (identificador de classe) do manipulador e fornece o nome do arquivo. O restante da operação ocorre por meio da interface IExtractIcon . Para obter uma discussão geral sobre como implementar manipuladores de extensão do Shell, incluindo a interface IPersistFile , consulte Criando manipuladores de extensão do Shell. O restante deste documento discute como implementar a interface IExtractIcon .

Etapa 2: Implementando a interface IExtractIcon

Depois que a interface é inicializada, o Shell usa a interface IExtractIcon do manipulador para solicitar o ícone apropriado. A interface tem dois métodos: IExtractIcon::GetIconLocation e IExtractIcon::Extract.

Os ícones são identificados por sua localização no sistema de arquivos. O método IExtractIcon::GetIconLocation é chamado para solicitar essas informações. Defina o parâmetro szIconFile como o nome do arquivo. Se houver mais de um ícone no arquivo, defina piIndex como o índice do ícone. Atribua valores apropriados às duas variáveis de sinalizador. Se você não quiser especificar um nome de arquivo ou se não quiser que o Shell extraia o ícone, defina o sinalizador GIL_NOTFILENAME no parâmetro pwFlags . Você não precisa atribuir um valor a szIconFile, mas o manipulador deve fornecer identificadores de ícone quando o Shell chama IExtractIcon::Extract.

Se você retornar um nome de arquivo, o Shell normalmente tentará carregar o ícone de seu cache. Para impedir o carregamento de um ícone armazenado em cache, defina o sinalizador GIL_DONTCACHE no parâmetro pwFlags . Se um ícone armazenado em cache não for carregado, o Shell chamará IExtractIcon::Extract para solicitar o identificador de ícone.

Se um arquivo e um índice foram especificados por IExtractIcon::GetIconLocation, eles serão passados para IExtractIcon::Extract nos parâmetros pszFile e nIconIndex , respectivamente. Se um nome de arquivo for fornecido, o manipulador poderá retornar S_FALSE para que o Shell extraia o ícone. Caso contrário, seu manipulador deve extrair ou produzir ícones grandes e pequenos e atribuir seus identificadores HICON aos parâmetros phiconLarge e phiconSmall . O Shell adiciona os ícones ao cache para agilizar chamadas subsequentes ao manipulador.

Etapa 3: Registrar manipuladores de ícone

Ao registrar estaticamente um ícone para um tipo de arquivo, você cria uma subchave DefaultIcon sob o ProgID para o tipo de arquivo. Seu valor padrão é definido como o arquivo que contém o ícone. Para registrar um manipulador de ícones, você ainda deve ter a subchave DefaultIcon , mas seu valor padrão deve ser definido como "%1". Adicione uma subchave IconHandler à subchave Shellex da subchave ProgID e defina seu valor padrão para a forma de cadeia de caracteres do GUID CLSID do manipulador. Para obter uma discussão geral sobre como registrar manipuladores de extensão do Shell, consulte Criando manipuladores de extensão do shell.

O exemplo a seguir modifica a entrada do Registro de Personalizando Ícones para que o tipo de arquivo .myp agora use um manipulador de menu de atalho em vez de um ícone definido estaticamente.

HKEY_CLASSES_ROOT
   .myp
      (Default) = MyProgram.1
   MyProgram.1
      (Default) = MyProgram Application
      DefaultIcon
         (Default) = %1
      Shellex
         IconHandler
            (Default) = {The handler's CLSID GUID}

Criar Manipuladores de Extensão de Shell

IPersistFile

IExtractIcon