Implementação de uma Exibição de pasta

O Windows Shell fornece uma implementação padrão da exibição de pasta, coloquialmente conhecida como DefView, para que você possa evitar grande parte do trabalho de implementar sua própria extensão de namespace. Como alguns recursos de exibição não podem ser obtidos por meio de exibições personalizadas, geralmente é recomendável que o objeto de exibição de pasta do sistema padrão seja usado no lugar de uma exibição personalizada. Para obter mais informações, consulte SHCreateShellFolderView. O restante deste tópico discute a implementação de uma exibição de pasta personalizada que não pode dar suporte a recursos de exibição mais recentes.

Ao contrário do modo de exibição de árvore, o Windows Explorer não gerencia o conteúdo de uma exibição de pasta. Em vez disso, a janela de exibição de pasta hospeda uma janela filho fornecida pelo objeto de pasta. O objeto folder é responsável por criar um objeto de exibição de pasta para exibir o conteúdo da pasta na janela filho.

A chave para implementar um objeto de exibição de pasta é a interface IShellView . Essa interface é usada pelo Windows Explorer para se comunicar com o objeto de exibição de pasta. Antes de exibir uma exibição de pasta, o Windows Explorer chama o método IShellFolder::CreateViewObject do objeto de pasta com riid definido como IID_IShellView. Crie um objeto de exibição de pasta e retorne sua interface IShellView . Em seguida, o objeto de exibição de pasta deve criar uma janela filho da janela de exibição de pasta e usar a janela filho para exibir informações sobre o conteúdo da pasta.

Além de controlar como os dados são exibidos, as extensões também podem personalizar vários recursos do Windows Explorer. Por exemplo, uma extensão pode adicionar itens à barra de ferramentas ou barra de menus ou exibir informações na barra de status.

O objeto Folder View

Um objeto de exibição de pasta é um objeto COM (Component Object Model) que expõe uma interface IShellView . Este objeto é responsável por:

  • Criar uma janela filho da janela de exibição de pasta e usá-la para exibir o conteúdo da pasta.
  • Manipulando a comunicação com o Windows Explorer.
  • Adicionando comandos específicos de pasta à barra de menus do Windows Explorer e à barra de ferramentas e manipulando esses comandos quando eles são selecionados.
  • Gerenciar a interação do usuário com a janela de exibição de pasta, como exibir menus de atalho ou lidar com operações de arrastar e soltar.

Este documento discute os três primeiros tópicos. Como a interação do usuário com o modo de exibição de pasta ocorre dentro da janela filho, o objeto de exibição de pasta é responsável por lidar com ele como faria com qualquer outra janela.

O Windows Explorer solicita um objeto de exibição de pasta chamando iShellFolder::CreateViewObject do objeto de pasta com riid definido como IID_IShellView. O procedimento para criar uma exibição de pasta é:

  1. Seu objeto de pasta cria uma nova instância do objeto de exibição de pasta e retorna um ponteiro para sua interface IShellView .
  2. O Windows Explorer inicializa o objeto de exibição de pasta chamando o método IShellView::CreateViewWindow. Crie uma janela filho da janela de exibição de pasta e retorne seu identificador para o Windows Explorer.
  3. O objeto de exibição de pasta usa a interface windows Explorer IShellBrowser para personalizar a barra de ferramentas, a barra de menus e a barra de status do Windows Explorer.
  4. O objeto de exibição de pasta exibe o conteúdo da pasta na janela filho.
  5. O objeto de exibição de pasta manipula a interação do usuário com a exibição de pasta e qualquer barra de ferramentas ou itens da barra de menus específicos da pasta.

Inicializando o objeto Folder View

O Windows Explorer inicializa o objeto de exibição de pasta chamando o método IShellView::CreateViewWindow. Os parâmetros do método fornecem ao objeto de exibição de pasta as informações necessárias para criar a janela filho que será usada para exibir o conteúdo da pasta:

  • Um ponteiro para a interface IShellView do objeto de exibição de pasta anterior. Esse parâmetro pode ser definido como NULL.
  • Uma estrutura FOLDERSETTINGS que contém as configurações da exibição de pasta anterior.
  • Um ponteiro para a interface do Windows Explorer IShellBrowser.
  • Uma estrutura RECT com as dimensões da janela de exibição de pasta.

O método IShellView::CreateViewWindow é chamado antes que o objeto de exibição de pasta anterior seja destruído. O ponteiro da interface IShellView permite que você se comunique com o objeto de exibição de pasta anterior. Essa interface será útil principalmente se a pasta anterior pertencer à sua extensão e usar o mesmo esquema de exibição. Nesse caso, você pode se comunicar com o objeto de exibição de pasta anterior para fins como trocar configurações privadas.

Uma maneira simples de determinar se o ponteiro IShellView pertence à sua extensão é fazer com que todos os objetos de exibição de pasta exponham uma interface privada. Chame IShellView::QueryInterface para solicitar a interface privada e examine o valor retornado para determinar se o objeto de exibição de pasta é um dos seus. Em seguida, você pode usar um método privado nessa interface para trocar informações.

A estrutura FOLDERSETTINGS contém as configurações de exibição da exibição de pasta anterior. A configuração primária é o modo de exibição: ícone grande, ícone pequeno, lista ou detalhes. Há também um sinalizador que contém as configurações de uma variedade de opções de exibição, como se a exibição deve ser alinhada à esquerda. A exibição da pasta deve seguir essas configurações na medida possível, para dar aos usuários uma experiência consistente à medida que eles vão de uma pasta para outra. Você deve armazenar essa estrutura e atualizá-la conforme as configurações mudam. O Windows Explorer chama IShellView::GetCurrentInfo para obter o valor mais recente dessa estrutura antes de abrir a próxima exibição de pasta.

A interface IShellBrowser é exposta pelo Windows Explorer. Essa interface é complementar ao IShellView e permite que um objeto de exibição de pasta se comunique com o Windows Explorer. Não há outra maneira de recuperar esse ponteiro de interface, portanto, o objeto de exibição de pasta deve armazená-lo para uso posterior. Em particular, você precisará chamar IShellBrowser::GetWindow para recuperar a janela de exibição de pasta pai que você usará para criar a janela filho. Observe que o método IShellBrowser::GetWindow não está incluído na documentação do IShellBrowser porque ele é herdado de IOleWindow. Depois de armazenar o ponteiro da interface, lembre-se de chamar IShellBrowser::AddRef para incrementar a contagem de referência da interface. Quando você não precisar mais da interface, chame IShellBrowser::Release.

Para criar a janela filho:

  1. Examine as estruturas FOLDERSETTINGS e RECT .
  2. Se necessário, obtenha configurações privadas do objeto de exibição de pasta anterior.
  3. Chame IShellBrowser::GetWindow para recuperar a janela de exibição de pasta pai.
  4. Crie um filho da janela de exibição de pasta obtida na etapa anterior e retorne-o ao Windows Explorer.

Exibindo o Modo de Exibição de Pasta

Depois de criar a janela filho e a retornar ao Windows Explorer, você poderá exibir o conteúdo da pasta. Normalmente, as extensões exibem suas informações fazendo com que a janela filho hospede um controle de exibição de lista ou um controle WebBrowser. O controle de exibição de lista permite replicar o modo de exibição clássico do Windows Explorer. O controle WebBrowser permite que você use um documento DHTML (HTML Dinâmico) para exibir suas informações, assim como o modo de exibição do Windows Explorer Web. Para obter mais informações, consulte a documentação desses controles.

A janela de exibição de pasta sempre existe, mesmo que não tenha foco. Portanto, você deve manter três estados para a janela filho:

  • Ativado com foco. A exibição de pasta foi criada e tem foco. Defina a barra de menus ou os itens da barra de ferramentas apropriados para um estado focado.
  • Ativado sem foco. A exibição de pasta foi criada e está ativa, mas não tem foco. Defina a barra de menus ou os itens da barra de ferramentas apropriados para um estado não modificado. Omita todos os itens que se aplicam à seleção de itens na exibição de pasta.
  • Desativado. A exibição de pasta está prestes a ser destruída. Remova todos os itens de menu específicos da pasta.

O Windows Explorer notifica o objeto de exibição de pasta quando o estado da janela é alterado chamando IShellView::UIActivate. Por sua vez, o objeto de exibição de pasta deve notificar o Windows Explorer quando um usuário ativa a janela de exibição de pasta chamando IShellBrowser::OnViewWindowActive. Para obter mais discussões sobre essa interface, consulte Using IShellBrowser to Communicate with Windows Explorer.

Embora a exibição de pasta esteja ativa, você precisa processar qualquer mensagem do Windows, como WM_SIZE, que pertençam à janela filho. O procedimento de janela também receberá mensagens WM_COMMAND para todos os itens que você adicionou à barra de menus ou barra de ferramentas do Windows Explorer.

Depois de criar a exibição de pasta, o Windows Explorer chama a interface IShellView do objeto de exibição de pasta para passar uma variedade de informações. Seu objeto deve modificar sua exibição adequadamente. Quando a exibição de pasta está prestes a ser destruída, o Windows Explorer notifica o objeto de exibição de pasta chamando seu método IShellView::D estroyViewWindow.

Implementando IShellView

Depois que o objeto folder tiver sido criado, o Windows Explorer chamará vários métodos IShellView para solicitar informações ou notificar o objeto de uma alteração no estado do Windows Explorer. Esta seção descreve como implementar esses métodos IShellView . Os métodos restantes são usados para fins mais especializados, como a caixa de diálogo Abrir Arquivo comum. Para obter detalhes, consulte a documentação do IShellView .

AddPropertySheetPages

Quando um usuário seleciona Opções de Pasta no menu Windows Explorer Tools, uma folha de propriedades é exibida que permite que o usuário modifique as opções de pasta. O Windows Explorer chama o método IShellView::AddPropertySheetPages do objeto de exibição de pasta para permitir que você adicione uma página a essa folha de propriedades.

O Windows Explorer passa um ponteiro para uma função de retorno de chamada AddPropSheetPageProc no parâmetro lpfn de IShellView::AddPropertySheetPages. Chame CreatePropertySheetPage para criar a página e chame AddPropSheetPageProc para adicioná-la à folha de propriedades. Para obter mais discussões sobre como lidar com folhas de propriedades, consulte Folhas de Propriedades.

GetCurrentInfo

Quando o usuário alterna de uma pasta para outra, o Windows Explorer tenta manter uma exibição de pasta semelhante. Por exemplo, se a exibição de pasta anterior mostrar ícones grandes, o próximo também deverá. Quando o Windows Explorer chama IShellView::CreateViewWindow para inicializar o objeto de exibição de pasta, o método recebe uma estrutura FOLDERSETTINGS. Essa estrutura contém informações que permitem que você torne a exibição de pasta consistente com a exibição de pasta anterior.

Para ajudar a garantir que a próxima exibição seja consistente com a exibição atual, armazene a estrutura FOLDERSETTINGS . Se a exibição for alterada, por exemplo, de ícones grandes para pequenos, atualize a estrutura adequadamente. Antes de alternar as exibições, o Windows Explorer chamará IShellView::GetCurrentInfo para solicitar que os valores atuais de FOLDERSETTINGS passem para o próximo objeto de exibição de pasta.

Atualizar

O usuário pode garantir que a exibição de pasta reflita o estado atual da pasta selecionando Atualizar no menu Exibir ou pressionando a tecla F5. Quando o usuário faz isso, o Windows Explorer chama o método IShellView::Refresh. O objeto de exibição de pasta deve atualizar imediatamente a exibição de pasta.

Saveviewstate

O Windows Explorer chama o método IShellView::SaveViewState para solicitar que o objeto de exibição de pasta salve seu estado de exibição. Em seguida, você pode recuperar o estado na próxima vez que a pasta for exibida. A maneira preferida de salvar um estado de exibição é chamando o método IShellBrowser::GetViewStateStream . Esse método retorna uma interface IStream que o objeto de exibição de pasta pode usar para salvar seu estado. Ao criar outra exibição de pasta, você pode chamar o mesmo método IShellBrowser::GetViewStateStream para obter um ponteiro IStream que permite ler as configurações salvas por exibições de pasta anteriores.

TranslateAcelerator

Quando o usuário pressiona uma tecla de atalho, o Windows Explorer passa a mensagem para o objeto de exibição de pasta chamando IShellView::TranslateAccelerator. Retorne S_FALSE para que o Windows Explorer processe a mensagem. Se o objeto de exibição de pasta tiver processado a mensagem, retorne S_OK.

Quando a janela de exibição de pasta tem foco, o Windows Explorer chama IShellView::TranslateAccelerator antes de processar a mensagem. Como a maioria das mensagens normalmente está associada à barra de menus ou comandos da barra de ferramentas do Windows Explorer, o objeto de exibição de pasta normalmente deve retornar S_FALSE. Os Explorer do Windows podem processar a mensagem normalmente. Retorne S_OK somente se a mensagem for específica da pasta e você não quiser que o Windows Explorer faça mais processamento. Se a exibição de pasta não tiver foco, o Windows Explorer processará a mensagem primeiro. Ele chamará IShellBrowser::TranslateAcceleratorSB somente se ele não manipular a mensagem.

Usando o IShellBrowser para se comunicar com o Windows Explorer

A interface IShellBrowser é usada pelo objeto de exibição de pasta para se comunicar com o Windows Explorer para uma variedade de finalidades, incluindo:

Modificando a barra de menus do Windows Explorer

A barra de menus do Windows Explorer permite que o usuário inicie uma variedade de comandos. Por padrão, a barra de menus só dá suporte a comandos específicos do Windows Explorer. As mensagens de WM_COMMAND relacionadas são processadas pelo Windows Explorer e não são passadas para o objeto de exibição de pasta. No entanto, você pode modificar a barra de menus para incluir um ou mais itens de menu específicos da pasta com IShellBrowser. O Windows Explorer passa as mensagens WM_COMMAND associadas desses itens para o procedimento de janela do objeto de pasta para processamento. Você também pode remover ou desabilitar quaisquer comandos padrão que não se apliquem ao seu aplicativo.

Objetos de exibição de pasta normalmente modificam a barra de menus antes que a exibição de pasta seja exibida pela primeira vez. Eles devem retornar a barra de menus ao estado original quando a exibição de pasta for destruída. Talvez você também precise modificar a barra de menus sempre que a exibição de pasta ganhar ou perder o foco.

Como o Windows Explorer chama IShellView::UIActivate sempre que o estado da janela de exibição de pasta é alterado, a modificação da barra de menus normalmente é incluída na implementação desse método. O procedimento básico para modificar a barra de menus do Windows Explorer é:

  1. Chame CreateMenu para criar um identificador de menu.
  2. Passe esse identificador de menu para o Windows Explorer chamando IShellBrowser::InsertMenusSB. O Windows Explorer preencherá suas informações de menu.
  3. Modifique o menu conforme necessário.
  4. Chame IShellBrowser::SetMenuSB para que o Windows Explorer exiba a barra de menus modificada.

O Windows Explorer tem seis menus pop-up em sua barra de menus. Assim como acontece com todos os contêineres OLE, o menu Explorer do Windows é dividido em seis grupos: Arquivo, Edição, Contêiner, Objeto, Janela e Ajuda. A tabela a seguir lista os menus pop-up do Windows Explorer e seu grupo associado, juntamente com as IDs de menu.

Menu pop-up ID Grupo
Arquivo FCIDM_MENU_FILE Arquivo
Editar FCIDM_MENU_EDIT Arquivo
Visualizar FCIDM_MENU_VIEW Contêiner
Favoritos FCIDM_MENU_FAVORITES Contêiner
Ferramentas FCIDM_MENU_TOOLS Contêiner
Ajuda FCIDM_MENU_HELP Janela

 

Ao passar o identificador de menu para o Windows Explorer chamando IShellBrowser::InsertMenusSB, você também deve passar um ponteiro para uma estrutura OLEMENUGROUPWIDTHS cujos membros foram inicializados como zero.

Quando IShellBrowser::InsertMenusSB retornar, o Windows Explorer terá adicionado seus itens de menu. Em seguida, você pode usar o identificador de menu retornado com funções de menu padrão do Windows, como InsertMenuItem para:

  • Adicione itens aos menus pop-up do Windows Explorer.
  • Modifique ou exclua itens existentes nos menus pop-up do Windows Explorer.
  • Adicione novos menus pop-up.

Use as IDs listadas na tabela para identificar os vários menus pop-up do Windows Explorer.

Observação

Para evitar conflitos com as IDs de comando do Windows Explorer, as IDs de todos os itens de menu adicionados devem ficar entre FCIDM_SHVIEWFIRST e FCIDM_SHVIEWLAST. Esses dois valores são definidos em Shlobj.h.

 

Depois de terminar de modificar o menu, chame IShellBrowser::SetMenuSB para que o Windows Explorer exiba a nova barra de menus.

Depois que o modo de exibição de pasta é exibido inicialmente, o Windows Explorer chama IShellView::UIActivate sempre que a exibição de pasta ganha ou perde o foco. Se você tiver itens de menu que sejam sensíveis ao estado do modo de exibição de pasta, modifique o menu adequadamente, sempre que o estado for alterado. Por exemplo, você pode ter um item de menu que atua em um item no modo de exibição de pasta que foi selecionado pelo usuário. Você deve desabilitar ou remover este item de menu quando a exibição de pasta perder o foco.

Quando o Windows Explorer chama IShellView::UIActivate para indicar que a exibição de pasta está sendo desativada, restaure a barra de menus para seu estado original chamando IShellBrowser::RemoveMenusSB.

Modificando a barra de ferramentas do Windows Explorer

Além de modificar a barra de menus do Windows Explorer, você também pode adicionar botões à barra de ferramentas. Assim como acontece com a barra de menus, a modificação da barra de ferramentas geralmente faz parte da implementação IShellView::UIActivate . O procedimento para adicionar botões à barra de ferramentas do Windows Explorer é:

  1. Adicione o bitmap do botão à lista de imagens da barra de ferramentas.
  2. Defina a cadeia de texto do botão.
  3. Adicione o botão à barra de ferramentas.

Para adicionar um bitmap à lista de imagens de uma barra de ferramentas, envie à barra de ferramentas uma mensagem TB_ADDBITMAP chamando IShellBrowser::SendControlMsg. Para especificar o controle de barra de ferramentas, defina o parâmetro id do método como FCW_TOOLBAR. Defina wParam como o número de imagens de botão no bitmap e lParam como o endereço de uma estrutura TBADDBITMAP . O índice de imagem é retornado no parâmetro pret .

Há duas maneiras de definir uma cadeia de caracteres para o botão:

  • Atribua a cadeia de caracteres ao membro iString da estrutura TBBUTTON do botão.
  • Chame IShellBrowser::SendControlMsg para enviar ao controle de barra de ferramentas uma mensagem TB_ADDSTRING . O parâmetro wParam deve ser definido como zero e o parâmetro lParam para a cadeia de caracteres. O índice de cadeia de caracteres é retornado no parâmetro pret .

Para adicionar o botão à barra de ferramentas, preencha uma estrutura TBBUTTON e passe-a para IShellBrowser::SetToolbarItems. Assim como acontece com o menu, sua ID de comando deve ficar entre FCIDM_SHVIEWFIRST e FCIDM_SHVIEWLAST. Em seguida, a barra de ferramentas acrescentará o botão à direita dos botões existentes.

Por exemplo, o fragmento de código a seguir adiciona um botão padrão à barra de ferramentas do Windows Explorer com uma ID de comando de IDB_MYBUTTON.

TBADDBITMAP tbadbm;
int iButtonIndex;
TBBUTTON tbb;

tbadbm.hInst = g_hInstance;    // The module's instance handle
tbadbm.nID = IDB_BUTTONIMAGE;  // The bitmap's resource ID

psb->SendControlMsg(FCW_TOOLBAR, TB_ADDBITMAP, 1,
                    reinterpret_cast<LPARAM>(&tbadbm), &iButtonIndex);

psb->SendControlMsg(FCW_TOOLBAR, TB_ADDSTRING, NULL,
                    reinterpret_cast<LPARAM>(szLabel), &iStringIndex);

ZeroMemory(&tbb, sizeof(TBBUTTON));
tbb.iBitmap = iButtonIndex;
tbb.iCommand = IDB_MYBUTTON;
tbb.iString = iStringIndex;
tbb.fsState = TBSTATE_ENABLED;
tbb.fsStyle = TBSTYLE_BUTTON;

psb->SetToolbarItems(&tbb, 1, FCT_MERGE);

Para obter mais discussões sobre como lidar com controles da barra de ferramentas, consulte Controles da barra de ferramentas.

Modificando a barra de status do Windows Explorer

Você pode usar a barra de Explorer status do Windows para exibir uma variedade de informações úteis. Há duas maneiras de usar a barra de status:

O primeiro método é simples, mas suficiente para muitas finalidades. Para maior flexibilidade, você pode enviar mensagens diretamente para o controle de barra de status chamando IShellBrowser::SendControlMsg com o parâmetro id definido como FCW_STATUS. Para obter mais discussões sobre controles de barra de status, consulte Barras de Status.

Armazenando informações específicas do modo de exibição

Quando uma exibição está prestes a ser destruída, geralmente é útil armazenar informações como o estado ou as configurações da exibição. O Windows Explorer solicita que você faça essa tarefa chamando IShellView::SaveViewState. A maneira preferencial de salvar informações específicas do modo de exibição é chamar IShellBrowser::GetViewStateStream. Esse método fornece uma interface IStream que você pode usar para armazenar as informações. Você está livre para usar qualquer formato de dados adequado.