Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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.
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
- Itens
- Owner-Drawn controles de cabeçalho
- Filtros de controle de cabeçalho
- Processamento de Mensagens do Controlador de Cabeçalho Padrão
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. |