Criando manipuladores de coluna

[Esse recurso só tem suporte no Windows XP ou anterior. ]

A exibição Detalhes no Windows Explorer normalmente exibe várias colunas padrão. Cada coluna lista informações, como o tamanho ou o tipo de arquivo, para cada arquivo na pasta atual. Implementando e registrando um manipulador de colunas, você pode disponibilizar colunas personalizadas para exibição.

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

Os tópicos a seguir são discutidos.

Como funcionam os manipuladores de coluna

A ilustração a seguir mostra o Windows Explorer no modo de exibição Detalhes.

captura de tela do Windows Explorer na exibição de detalhes

Com o Windows 2000, a pasta também pode dar suporte a várias colunas que, por padrão, não são exibidas. O usuário pode exibir colunas adicionais clicando com o botão direito do mouse em um dos cabeçalhos de coluna e selecionando o comando Mais... no menu. Em seguida, é exibida uma caixa de diálogo que lista as colunas disponíveis para a pasta e permite que o usuário selecione quais colunas exibir. A ilustração a seguir mostra essa caixa de diálogo para o exemplo anterior.

captura de tela do Windows Explorer com a caixa de diálogo Escolher detalhes exibida

Ao criar um manipulador de colunas, você pode criar colunas personalizadas e adicioná-las a essa lista. Por exemplo, uma coleção de arquivos que contêm música pode usar um manipulador de colunas para exibir colunas listando o artista e a peça contidas por cada arquivo.

Um manipulador de colunas é um objeto global que é chamado sempre que o Windows Explorer exibe a exibição Detalhes. No entanto, manipuladores de coluna normalmente são usados para exibir colunas personalizadas somente para membros de um tipo de arquivo específico. Antes de exibir a exibição Detalhes, o Windows Explorer consulta todos os manipuladores de coluna registrados para suas características de coluna. Se o usuário tiver selecionado uma das colunas do manipulador, o Windows Explorer consultará o manipulador para obter os dados associados. Quando um manipulador de coluna recebe uma solicitação de dados, ele o fornece se o arquivo é um membro de seu tipo com suporte. Caso contrário, ele ignorará a solicitação retornando S_FALSE.

Registrando manipuladores de coluna

Os manipuladores de coluna são registrados na subchave a seguir.

HKEY_CLASSES_ROOT
   Folder
      shellex
         ColumnHandlers

Crie uma subchave de ColumnHandlers chamada com a forma de cadeia de caracteres do GUID do IDENTIFICADOR de Classe (CLSID) do manipulador. Para obter uma discussão geral sobre como registrar manipuladores de extensão do Shell, consulte Criando manipuladores de extensão de shell. O exemplo a seguir ilustra como registrar um manipulador de colunas.

HKEY_CLASSES_ROOT
   Folder
      shellex
         ColumnHandlers
            {My Column Handler CLSID GUID}

Implementando manipuladores de coluna

Como todos os manipuladores de extensão do Shell, os manipuladores de coluna são objetos COM (Component Object Model) em processo implementados como DLLs. Eles exportam a interface IColumnProvider além de IUnknown.

O Windows Explorer chama os três métodos exportados por IColumnProvider para solicitar as informações necessárias para exibir a coluna. O procedimento usado pelo Windows Explorer é:

  1. Chame IColumnProvider::Initialize para especificar a pasta que está prestes a ser exibida.
  2. Chame IColumnProvider::GetColumnInfo para recuperar o identificador e as características da coluna.
  3. Se a coluna tiver sido selecionada pelo usuário, chame IColumnProvider::GetItemData para cada arquivo na pasta para recuperar os dados que pertencem à entrada de coluna do arquivo.

O método Initialize

O Windows Explorer chama IColumnProvider::Initialize para inicializar o manipulador de colunas. O método tem três parâmetros, mas apenas wszFolder é usado no momento. Ele é definido como a pasta cuja exibição Detalhes está prestes a ser exibida. Armazene o nome da pasta para uso posterior e inicialize o objeto do manipulador conforme necessário.

O método GetColumnInfo

O Windows Explorer chama IColumnProvider::GetColumnInfo para solicitar o identificador e as características da coluna. Ele passa um índice para a coluna no parâmetro dwIndex . Esse índice é um valor arbitrário usado para enumerar colunas. O Windows Explorer também passa um ponteiro para uma estrutura SHCOLUMNINFO. Essa estrutura é usada para retornar o identificador e as características da coluna. IColumnProvider::GetColumnInfo deve atribuir valores apropriados aos membros da estrutura e retornar.

As colunas são identificadas pela FMTID (ID do conjunto de propriedades OLE) e por uma PID (ID de propriedade associada). O primeiro membro da estrutura SHCOLUMNINFO , scid, é um ponteiro para uma estrutura SHCOLUMNID usada para identificar a coluna. Seu membro fmtid contém o FMTID da coluna e seu membro pid contém o PID da coluna. Por exemplo, um par FMTID/PID padrão que normalmente é usado para identificar colunas é o PID do Autor do conjunto de propriedades Informações de Resumo.

Se possível, seu manipulador deve usar FMTIDs e PIDs existentes para identificar a coluna à qual ele dá suporte. Se você usar uma estrutura SHCOLUMNID personalizada, a coluna exibirá dados somente para os arquivos compatíveis com o manipulador. Se a pasta contiver outros arquivos, suas entradas ficarão em branco. Se uma pasta contiver arquivos de mais de um tipo de arquivo, o uso de valores FMTID/PID padrão poderá tornar possível mesclar dados de diferentes tipos na mesma coluna.

Defina o membro vt como o tipo VARIANT dos dados que você deseja exibir na coluna. O tipo mais usado é VT_LPSTR, pois a maioria das colunas exibe seus dados como cadeias de caracteres. Os membros restantes da estrutura SHCOLUMNINFO são usados para definir as características da coluna. Atribua valores conforme apropriado.

O método GetItemData

Se a coluna do manipulador de colunas tiver sido selecionada, o Windows Explorer chamará IColumnProvider::GetItemData para cada arquivo na pasta a ser exibida. O parâmetro pscid é um ponteiro para uma estrutura SHCOLUMNID que identifica a coluna. O parâmetro pscd aponta para uma estrutura SHCOLUMNDATA que identifica o arquivo específico.

O parâmetro pvarData retorna os dados que devem ser exibidos na coluna do manipulador para o arquivo especificado por pscd. Se esse arquivo tiver suporte do manipulador de colunas, atribua seu valor de dados a pvarData e retorne S_OK. Se o arquivo não tiver suporte do manipulador de colunas, retorne S_FALSE sem atribuir um valor a pvarData.

Muitas pastas conterão vários arquivos que não são compatíveis com nenhum manipulador de coluna específico. Para melhorar a eficiência, IColumnProvider::GetItemData deve primeiro marcar o membro pwszExt da estrutura apontada por pscd. Esse membro contém a extensão de nome de arquivo. Se a extensão indicar que o arquivo não é um membro de um tipo de arquivo compatível com o manipulador, evite o processamento desnecessário retornando imediatamente S_FALSE.