Partilhar via


Sobre os controles de guia

Um controle de tabulação é análogo aos divisores em um bloco de anotações ou às etiquetas em um gabinete de arquivos. Usando um controle de guia, um aplicativo pode definir várias páginas para a mesma área de uma janela ou caixa de diálogo. Cada página consiste em um determinado tipo de informação ou um grupo de controles que o aplicativo exibe quando o usuário seleciona a guia correspondente.

A seguinte captura de ecrã mostra um controlo de abas simples que inclui abas para os dias da semana. O separador terça-feira foi selecionado.

captura de ecrã de uma folha de propriedades com cinco separadores, um para cada dia da semana

Este tópico inclui as seguintes seções.

Criando controles de guia

Você pode criar um controle de guia chamando a funçãoCreateWindowEx, especificando a classe WC_TABCONTROL window. Essa classe de janela é registrada quando a DLL de controles comuns é carregada. Para garantir que a DLL seja carregada, use a funçãoInitCommonControlsEx.

No Microsoft Visual Studio, você pode criar um controle de guia usando a caixa de ferramentas.

Você envia mensagens para um controle de guia para adicionar guias e afetar a aparência e o comportamento do controle. Cada mensagem tem uma macro correspondente que você pode usar em vez de enviar a mensagem explicitamente. Não é possível desativar uma guia individual em um controle de guia. No entanto, você pode desabilitar um controle de guia em uma folha de propriedades desativando a página correspondente.

Estilos de controle de tabulação

Você pode aplicar determinadas características aos controles de guia especificando estilos de controle de guia quando o controle é criado. Por exemplo, você pode especificar o alinhamento e a aparência geral das guias em um controle de guia.

Você pode fazer com que as guias se pareçam com botões especificando o estilo TCS_BUTTONS. As guias neste tipo de controle de guia devem ter a mesma função que os controles de botão; ou seja, clicar em uma guia deve executar um comando em vez de exibir uma página. Como a área de exibição em um controle de guia de botão normalmente não é usada, nenhuma borda é desenhada ao redor dela.

Você pode fazer com que uma guia receba o foco de entrada quando clicado, especificando o estilo TCS_FOCUSONBUTTONDOWN. Este estilo é normalmente usado apenas com o estilo TCS_BUTTONS. Você pode especificar que uma guia não ganha foco de entrada quando clicada usando o estilo TCS_FOCUSNEVER.

Por padrão, um controle de guia exibe apenas uma linha de guias. Se nem todas as guias puderem ser mostradas de uma só vez, o controle de guia exibirá um controle ascendente para que o usuário possa rolar guias adicionais para a exibição. Você pode fazer com que um controle de guia exiba várias linhas de guias, se necessário, especificando o estilo TCS_MULTILINE. Com esse estilo, todas as guias podem ser exibidas de uma só vez. As abas são alinhadas à esquerda dentro de cada linha, a menos que especifique o estilo TCS_RIGHTJUSTIFY. Nesse caso, a largura de cada guia é aumentada para que cada linha de guias preencha toda a largura do controle de guia.

Um controle de guia dimensiona automaticamente cada guia para ajustar seu ícone, se houver, e seu rótulo. Para dar a todas as guias a mesma largura, você pode especificar o estilo TCS_FIXEDWIDTH. O controlo dimensiona todas as abas para se ajustar ao rótulo mais largo, ou pode atribuir uma largura e altura específicas usando a mensagem TCM_SETITEMSIZE. Dentro de cada guia, o controle centraliza o ícone e o rótulo, colocando o ícone à esquerda do rótulo. Você pode forçar o ícone para a esquerda, deixando o rótulo centralizado, especificando o estilo TCS_FORCEICONLEFT. Você pode alinhar à esquerda o ícone e o rótulo usando o estilo TCS_FORCELABELLEFT. Não é possível usar o estilo TCS_FIXEDWIDTH com o estilo TCS_RIGHTJUSTIFY.

Você pode especificar que a janela principal desenhe as abas no controlo utilizando o estilo TCS_OWNERDRAWFIXED. Para obter mais informações, consulte Owner-Drawn Guias.

Você pode especificar que um controle tab criará um controle de dica de ferramenta usando o estilo TCS_TOOLTIPS. Para obter mais informações sobre isso, consulte Dicas de ferramentas de controle de guia.

Separadores e Atributos de Separador

Cada guia em um controle de guia consiste em um ícone, um rótulo e dados definidos pelo aplicativo. Essas informações são especificadas por uma estrutura de TCITEM. Você pode adicionar guias a um controle de guia, recuperar o número de guias, recuperar e definir o conteúdo de uma guia e excluir guias. As guias são identificadas por seu índice baseado em zero.

Para adicionar guias a um controle de guia, use a mensagem TCM_INSERTITEM, especificando a posição do item e o endereço de uma estrutura TCITEM . Você pode recuperar e definir o conteúdo de uma guia existente usando as mensagens TCM_GETITEM e TCM_SETITEM. Para cada guia, você pode especificar um ícone, um rótulo ou ambos. Também pode especificar dados definidos pelo aplicativo para associar ao separador.

Você pode recuperar o número atual de guias usando a mensagem TCM_GETITEMCOUNT, excluir uma guia usando a mensagem TCM_DELETEITEM e excluir todas as guias em um controle de guia usando a mensagem TCM_DELETEALLITEMS.

Você pode associar dados definidos pelo aplicativo a cada guia. Por exemplo, você pode salvar informações sobre cada página com sua guia correspondente. Por padrão, um controle de guia aloca quatro bytes extras por guia para dados definidos pelo aplicativo. Você pode alterar o número de bytes extras por guia usando a mensagem TCM_SETITEMEXTRA. Você só pode usar essa mensagem quando o controle de guia estiver vazio.

Os dados definidos pelo aplicativo são especificados pelo lParam membro da estrutura TCITEM. Se você usar mais de 4 bytes de dados definidos pelo aplicativo, precisará definir sua própria estrutura e usá-la em vez de TCITEM. Você pode recuperar e definir dados definidos pelo aplicativo da mesma forma que recupera e define outras informações sobre uma guia, usando as mensagens TCM_GETITEM e TCM_SETITEM.

O primeiro membro da sua estrutura deve ser uma estrutura TCITEMHEADER e os membros restantes devem especificar dados definidos pela aplicação. TCITEMHEADER é idêntico ao TCITEM, exceto que não tem lParam como membro . A diferença entre o tamanho da sua estrutura e o tamanho de TCITEMHEADER deve ser igual ao número de bytes extras por guia.

Área de Exposição

A área de exibição de um controle de guia é a área na qual um aplicativo exibe a página atual. Normalmente, uma aplicação cria uma janela filha ou caixa de diálogo, definindo o tamanho e a posição da janela para se ajustar à área de exibição. Dado o retângulo de janela para um controle de guia, você pode calcular o retângulo delimitador da área de exibição usando a mensagem TCM_ADJUSTRECT.

Às vezes, a área de exibição deve ter um tamanho específico — por exemplo, o tamanho de uma caixa de diálogo filho não modal. Dado o retângulo delimitador para a área de exibição, você pode usar TCM_ADJUSTRECT para calcular o retângulo de janela correspondente para o controle de guia.

Seleção de abas

Quando o utilizador seleciona uma aba, um controlo de abas envia os seus códigos de notificação para a janela-mãe na forma de mensagens WM_NOTIFY. O código de notificação TCN_SELCHANGING é enviado antes das alterações na seleção e o código de notificação TCN_SELCHANGE é enviado após as alterações na seleção.

Você pode processar TCN_SELCHANGING para salvar o estado da página de saída. Você pode retornar TRUE para evitar que a seleção mude. Por exemplo, talvez não queiras sair de uma caixa de diálogo secundária onde um controlo tem uma definição inválida.

Você deve processar TCN_SELCHANGE para exibir a página recebida na área de exibição. Isso pode simplesmente consistir em alterar as informações exibidas em uma janela secundária. Frequentemente, cada página consiste numa janela secundária ou caixa de diálogo. Nesse caso, uma aplicação poderia processar essa notificação destruindo ou ocultando a janela ou caixa de diálogo de saída, e criando ou exibindo a janela ou caixa de diálogo de entrada.

Você pode recuperar e definir a seleção atual usando as mensagens TCM_GETCURSEL e TCM_SETCURSEL.

Listas de imagens de controle de tabulação

Cada guia pode ter um ícone associado a ela, que é especificado por um índice na lista de imagens para o controle de guia. Quando um controle de guia é criado, ele não tem nenhuma lista de imagens associada a ele. Um aplicativo pode criar uma lista de imagens usando a função ImageList_Create e, em seguida, atribuí-la a um controle de guia usando a mensagem TCM_SETIMAGELIST.

Você pode adicionar imagens à lista de imagens de um controle de guia da mesma forma que faria com qualquer outra lista de imagens. No entanto, um aplicativo deve remover imagens usando a mensagem TCM_REMOVEIMAGE em vez da função ImageList_Remove. Essa mensagem garante que cada guia permaneça associada à mesma imagem de antes.

Destruir um controle de tabulação não destrói uma lista de imagens associada a ele. Você deve destruir a lista de imagens separadamente. Isso é útil se você quiser atribuir a mesma lista de imagens a vários controles de guia.

Para recuperar o identificador para a lista de imagens atualmente associada a um controle de guia, você pode usar a mensagem TCM_GETIMAGELIST.

Tamanho e posição da aba

Cada separador num controlo de separador tem um tamanho e uma posição. Você pode definir o tamanho das guias, recuperar o retângulo delimitador de uma guia ou determinar qual guia está em uma posição especificada.

Para controles de guia de largura fixa e desenhados pelo proprietário, você pode definir a largura e a altura exatas das guias usando a mensagem TCM_SETITEMSIZE. Em outros controles de guia, o tamanho de cada guia é calculado com base no ícone e no rótulo da guia. O controle tab inclui espaço para uma borda e uma margem adicional. Você pode definir a espessura da margem usando a mensagem TCM_SETPADDING.

Você pode determinar o retângulo delimitador atual para uma guia usando a mensagem TCM_GETITEMRECT. Você pode determinar qual guia, se houver, está em um local especificado usando a mensagem TCM_HITTEST.

Em um controle de guia com o estilo TCS_MULTILINE, você pode determinar o número atual de linhas de guias usando a mensagem TCM_GETROWCOUNT.

Owner-Drawn Abas

Se um controle de guia tiver o estilo TCS_OWNERDRAWFIXED, a janela pai deverá pintar guias processando a mensagem WM_DRAWITEM. O controlo de separadores envia esta mensagem sempre que um separador precisa ser pintado. O parâmetro lParam especifica o endereço de uma estrutura DRAWITEMSTRUCT, que contém o índice da guia, o seu retângulo delimitador e o contexto de dispositivo (DC) no qual desenhar.

Por padrão, o membro itemData de DRAWITEMSTRUCT contém o valor do membro lParam da estrutura TCITEM. No entanto, se alterares a quantidade de dados definidos pela aplicação por guia, itemData conterá o endereço dos dados. Você pode alterar a quantidade de dados definidos pelo aplicativo por aba usando a mensagem TCM_SETITEMEXTRA.

Para especificar o tamanho dos itens em um controle de guia, a janela pai deve processar a mensagem WM_MEASUREITEM. Como todas as guias em um controle de guia desenhado pelo proprietário são do mesmo tamanho, essa mensagem é enviada apenas uma vez. Não há estilo de controle de tabulação para guias desenhadas pelo proprietário de tamanho variável. Você também pode definir a largura e a altura das guias usando a mensagem TCM_SETITEMSIZE.

Dicas de ferramentas de controle de guia

Você pode usar um controle de dica de ferramenta para fornecer uma breve descrição de cada guia em um controle de guia. Um controle tab que tem o estilo TCS_TOOLTIPS cria um controle de dica de ferramenta quando ele é criado e destrói o controle de dica de ferramenta quando ele é destruído. Você também pode criar um controle de tooltip e atribuí-lo a um controle de guia.

Se você usar um controle de dica de ferramenta com um controle de guia, a janela pai deverá processar o código de notificação TTN_GETDISPINFO para fornecer uma descrição de cada guia mediante solicitação.

Para usar o mesmo controle de dica de ferramenta com mais de um controle de guia, crie o controle de dica de ferramenta você mesmo e atribua-o ao controle de guia usando a mensagem TCM_SETTOOLTIPS. Você pode recuperar o identificador para o controle de dica de ferramenta atual de um controle de guia usando a mensagem TCM_GETTOOLTIPS. Se você criar seu próprio controle de dica de ferramenta, não deverá usar o estilo TCS_TOOLTIPS.

Processamento de mensagens do controlo de tabulação padrão

Esta seção descreve o processamento de mensagens executado por um controle de guia. Mensagens específicas para controles de guia são discutidas em outras seções desta documentação.

Mensagem Processamento realizado
WM_CAPTURECHANGED Não faz nada se o controle tab liberou a captura do mouse em si. Se outra janela capturou o mouse e um botão é pressionado, o comando libera o botão.
WM_CREATE Aloca e inicializa uma estrutura de dados interna. O controle cria um controle de dica de ferramenta se o estilo TCS_TOOLTIPS for especificado.
WM_DESTROY Liberta os recursos alocados durante o processamento de WM_CREATE.
WM_GETDLGCODE Devolve uma combinação dos valores DLGC_WANTARROWS e DLGC_WANTCHARS.
WM_GETFONT Retorna o identificador para a fonte usada para rótulos.
WM_KEYDOWN Processa chaves de direção e altera a seleção, se apropriado.
WM_KILLFOCUS Invalida a guia que tem o foco para que ela seja repintada para refletir um estado desfocado.
WM_LBUTTONDOWN Encaminha a mensagem para o controle de dica de ferramenta, se houver, e altera a seleção se o usuário estiver clicando em uma guia. Se o usuário estiver clicando em um botão, o controle redesenha o botão para dar uma aparência submersa e captura o mouse. Se o usuário estiver clicando em uma guia ou botão e o estilo TCS_FOCUSONBUTTONDOWN for especificado, o controle definirá o foco para si mesmo.
WM_LBUTTONUP Libera o mouse se um botão foi pressionado. Se o cursor estiver sobre o botão e estiver sendo pressionado, o controle altera a seleção de acordo e redesenha o botão.
WM_MOUSEMOVE Encaminha a mensagem para o controle de dica de ferramenta, se houver. Se o estilo TCS_BUTTONS for especificado e o botão do mouse estiver sendo pressionado após o clique, o controle também poderá redesenhar o botão afetado para dar a ele uma aparência elevada ou afundada.
WM_NOTIFY Encaminha os códigos de notificação enviados pelo controlo de tooltip.
WM_PAINT Desenha uma borda ao redor da área de exibição (a menos que o estilo TCS_BUTTONS seja especificado) e pinta todas as guias que cruzam o retângulo inválido. Para cada separador, ele desenha o corpo do separador (ou envia uma mensagem WM_DRAWITEM para a janela pai) e depois desenha uma borda ao redor do separador. Se o parâmetro wParam não for NULL, o controlo considera que o valor é um HDC e pinta usando esse contexto de dispositivo.
WM_RBUTTONDOWN Envia um código de notificação NM_RCLICK de para a janela mãe.
WM_SETFOCUS Invalida a guia que tem o foco para que ela seja redesenhada para refletir um estado focado.
WM_SETFONT Define a fonte usada para rótulos.
WM_SETREDRAW Define o estado de um sinalizador interno que determina se o controle é repintado quando os itens são inseridos e excluídos, quando a fonte é alterada e assim por diante.
WM_SIZE Recalcula as posições dos separadores e pode invalidar parte do controlo de separadores para forçar o redesenho de alguns ou de todos os separadores.