Partilhar via


Sobre os controles de cabeçalho

Um controle de cabeçalho é uma janela que geralmente é posicionada acima de colunas de texto ou números. Contém um título para cada coluna e pode ser dividido em partes. O usuário pode arrastar os divisores que separam as partes para definir a largura de cada coluna. A ilustração a seguir mostra um controle de cabeçalho que tem colunas rotuladas que fornecem informações detalhadas sobre arquivos em um diretório.

captura de tela de uma caixa de diálogo com um controle de cabeçalho de três colunas

Você pode criar um controle de cabeçalho usando a função deCreateWindowEx, especificando a classe de janela WC_HEADER e os estilos de controle de cabeçalho apropriados. Essa classe de janela é registrada quando a DLL de controle comum é carregada. Para garantir que essa DLL seja carregada, use a funçãoInitCommonControlsEx. Depois de criar um controle de cabeçalho, você pode dividi-lo em partes, definir o texto em cada parte e controlar a aparência da janela usando mensagens de janela de cabeçalho.

Um controlo de cabeçalho pode ser criado como uma janela descendente de outro controlo, como uma caixa de lista. No entanto, o controle pai não está ciente do controle de cabeçalho e não permite o espaço ocupado pelo cabeçalho, com o resultado de que os itens de lista aparecerão atrás do cabeçalho. Se o usuário desejar utilizar um controlo de cabeçalho numa caixa de listagem ou outro controlo, o controlo pai deve ser desenhado pelo programador para que todos os itens sejam exibidos na posição correta.

Os controles de exibição de lista já têm controles de cabeçalho. Em vez de criar um controle de cabeçalho para um controle de exibição de lista, você usa LVM_GETHEADER ou ListView_GetHeader para recuperar o controle existente.

Tamanho e posição do controle de cabeçalho

Normalmente, deves definir o tamanho e a posição de um controlo de cabeçalho para caber dentro dos limites de um retângulo específico, como a área de cliente de uma janela. Usando a mensagem HDM_LAYOUT, você pode recuperar os valores de tamanho e posição apropriados do controle de cabeçalho.

Ao enviar HDM_LAYOUT, especifica o endereço de uma estrutura HDLAYOUT , que contém as coordenadas do retângulo que o controlo de cabeçalho deve ocupar e fornece um ponteiro para uma estrutura WINDOWPOS . O controle preenche a estrutura WINDOWPOS com valores de tamanho e posição apropriados para posicionar o controle ao longo da parte superior do retângulo especificado. O valor de altura é a soma das alturas das bordas horizontais do controle e a altura média dos caracteres na fonte atualmente selecionada no contexto do dispositivo do controle.

Se você quiser usar HDM_LAYOUT para definir o tamanho inicial e a posição de um controle de cabeçalho, defina o estado de visibilidade inicial do controle para que ele fique oculto. Depois de enviar HDM_LAYOUT para recuperar os valores de tamanho e posição, você pode usar a função deSetWindowPospara definir o novo tamanho, posição e estado de visibilidade.

Itens

Um controle de cabeçalho normalmente tem vários itens de cabeçalho que definem as colunas do controle. Adicionar um item a um controle de cabeçalho enviando a mensagem HDM_INSERTITEM para o controle. A mensagem inclui o endereço de uma estrutura HDITEM. Essa estrutura define as propriedades do item de cabeçalho, que pode incluir uma cadeia de caracteres, uma imagem bitmap, um tamanho inicial e um valor de LPARAM definido pelo aplicativo.

O membro fmt da estruturaHDITEM de umitem pode incluir o indicador HDF_STRING ou HDF_BITMAP para indicar se o controle exibe o texto ou o bitmap do item. Se pretender exibir uma cadeia de caracteres e um bitmap, crie um item com desenho feito pelo proprietário definindo o membro fmt para incluir o sinalizador HDF_OWNERDRAW. A estrutura de HDITEM também especifica sinalizadores de formatação que indicam ao controlo se deve centralizar, alinhar à esquerda ou alinhar à direita a string ou bitmap no retângulo do item.

HDM_INSERTITEM retorna o índice do item recém-adicionado. Você pode usar o índice em outras mensagens para definir propriedades ou recuperar informações sobre o item. Você pode excluir um item usando a mensagem HDM_DELETEITEM, especificando o índice do item a ser excluído.

Você pode usar a mensagem HDM_SETITEM para definir as propriedades de um item de cabeçalho existente e a mensagem HDM_GETITEM para recuperar as propriedades atuais de um item. Para recuperar uma contagem dos itens em um controle de cabeçalho, use a mensagem HDM_GETITEMCOUNT.

Owner-Drawn controles de cabeçalho

Você pode definir itens individuais de um controle de cabeçalho como itens desenhados pelo proprietário. O uso desta técnica dá-te mais controlo do que terias sobre a aparência de um elemento de cabeçalho.

Você pode usar a mensagem HDM_INSERTITEM para inserir um novo item desenhado pelo proprietário em um controle de cabeçalho ou a mensagem HDM_SETITEM para alterar um item existente para um item desenhado pelo proprietário. Ambas as mensagens incluem o endereço de uma estrutura HDITEM, que deve ter o campo fmt definido para o valor HDF_OWNERDRAW.

Quando um controle de cabeçalho deve desenhar um item desenhado pelo proprietário, ele envia a mensagem WM_DRAWITEM para a janela pai. O parâmetro wParam da mensagem é o identificador da janela filha do controlo de cabeçalho, e o parâmetro lParam é um endereço de uma estrutura DRAWITEMSTRUCT. A janela pai usa as informações na estrutura para desenhar o item. Para um item desenhado pelo utilizador num controlo de cabeçalho, a estrutura DRAWITEMSTRUCT contém as seguintes informações.

Membro Descrição
CtlType ODT_HEADER tipo de controle desenhado pelo proprietário.
CtlID Identificador de janela filho do controle de cabeçalho.
itemID Índice do item a ser sorteado.
itemAction ODA_DRAWENTIRE sinalizador de ação de desenho.
estadoDoItem ODS_SELECTED sinalizador de ação de desenho se o cursor estiver no item e o botão do rato estiver pressionado. Caso contrário, este membro é zero.
hwndItem Manipule o controle de cabeçalho.
hDC Manipule o contexto do dispositivo do controle de cabeçalho.
rcItem Coordenadas do item de cabeçalho a ser desenhado. As coordenadas são relativas ao canto superior esquerdo do controle de cabeçalho.
itemData Valor de 32 bits definido pelo aplicativo associado ao item.

 

Filtros de controle de cabeçalho

Ao especificar o estilo de janela HDS_FILTERBAR para um controle de cabeçalho, você pode habilitar o posicionamento de caixas de edição de filtro abaixo dos cabeçalhos de coluna. Um botão de filtro aparece ao lado da caixa de edição. Você pode implementar a filtragem respondendo a HDN_BEGINFILTEREDIT, HDN_ENDFILTEREDIT, HDN_FILTERBTNCLICKou HDN_FILTERCHANGE códigos de notificação.

Por padrão, a caixa de edição contém um prompt para o usuário inserir texto. Você pode restaurar a caixa de edição para esse estado padrão usando Header_ClearFilter ou Header_ClearAllFilters.

O exemplo de código a seguir mostra como recuperar o controle de cabeçalho de um controle de exibição de lista e adicionar uma barra de filtro.

// hList is the HWND of the list-view control.
HWND hHeader = ListView_GetHeader(hList);
LONG_PTR styles = GetWindowLongPtr(hHeader, GWL_STYLE);
SetWindowLongPtr(g_hHeader, GWL_STYLE, styles | HDS_FILTERBAR);

Processamento de mensagens de controlo de cabeçalho predefinido

Esta seção descreve as mensagens de janela manipuladas pelo procedimento de janela para a classe de janela WC_HEADER.

Mensagem Processamento realizado
WM_CREATE Inicializa o controlo de cabeçalho.
WM_DESTROY Desinicializa o controle de cabeçalho.
WM_ERASEBKGND Preenche o fundo do controlo de cabeçalho utilizando a cor de fundo corrente do controlo.
WM_GETDLGCODE Devolve uma combinação dos valores DLGC_WANTTAB e DLGC_WANTARROWS.
WM_GETFONT Retorna o identificador para a fonte atual, que é usada pelo controlo de cabeçalho para exibir o seu texto.
WM_LBUTTONDBLCLK Captura a entrada do mouse. Se o cursor do mouse estiver em um divisor, o controle envia o código de notificação HDN_BEGINTRACK e começa a arrastar o divisor. Se o cursor estiver em um item, o item será exibido no estado pressionado.
WM_LBUTTONDOWN O mesmo que a mensagem WM_LBUTTONDBLCLK.
WM_LBUTTONUP Libera a captura do rato. Se o controle estava rastreando o movimento do mouse, ele envia o código de notificação HDN_ENDTRACK e redesenha o controle de cabeçalho. Caso contrário, o controle envia o código de notificação HDN_ITEMCLICK e redesenha o item de cabeçalho que foi clicado.
WM_MOUSEMOVE Se um divisor estiver sendo arrastado, o controle enviará o código de notificação HDN_TRACK e exibirá o item na nova posição. Se o botão esquerdo do mouse estiver para baixo e o cursor estiver em um item, o item será exibido no estado pressionado.
WM_NCCREATE Aloca e inicializa uma estrutura de dados interna.
WM_NCDESTROY Liberta os recursos alocados pelo controlo de cabeçalho após este ser desativado.
WM_PAINT Pinta a região inválida do controle de cabeçalho. Se o parâmetro wParam não for NULL, o controlo assumirá que o valor é um HDC e desenhará utilizando esse contexto de dispositivo.
WM_SETCURSOR Define a forma do cursor, dependendo se o cursor está em um divisor ou em um item de cabeçalho.
WM_SETFONT Seleciona um novo identificador de fonte no contexto do dispositivo para o controle de cabeçalho.