Sobre Caixas de Combinação
Uma caixa de combinação combina uma caixa de edição ou texto estático e uma lista.
Este tópico contém as seguintes seções.
- Tipos e estilos de caixa de combinação
- Lista de caixas de combinação
- Editar campos de seleção de controle
- Owner-Drawn Caixas de combinação
- Caixas de combinação subclassificadas
Tipos e estilos de caixa de combinação
Uma caixa de combinação consiste em uma lista e um campo de seleção. A lista apresenta as opções que um usuário pode selecionar e o campo de seleção exibe a seleção atual. Se o campo de seleção for um controle de edição, o usuário pode inserir informações não disponíveis na lista; caso contrário, o usuário só pode selecionar itens na lista.
A biblioteca de controles comuns inclui três estilos principais de caixa de combinação, conforme mostrado na tabela a seguir.
Tipo de caixa de combinação | Constante de estilo | Descrição |
---|---|---|
Simples | CBS_SIMPLE | Exibe a lista o tempo todo e mostra o item selecionado em um controle de edição. |
Menu desdobrável | CBS_DROPDOWN | Exibe a lista quando o ícone é clicado e mostra o item selecionado em um controle de edição. |
Menu suspenso (lista suspensa) | CBS_DROPDOWNLIST | Exibe a lista quando o ícone é clicado e mostra o item selecionado em um controle estático. |
As capturas de ecrã a seguir mostram os três tipos de caixa de combinação como podem aparecer no Windows Vista. Na primeira captura de tela, o usuário selecionou um item na caixa de combinação simples. O usuário também pode digitar um novo valor na caixa de edição deste controle. A lista foi dimensionada no editor de recursos do Microsoft Visual Studio e é grande o suficiente para acomodar dois itens.
Na segunda captura de tela, o usuário digitou novo texto no controle de edição da caixa de combinação suspensa. O usuário também poderia ter selecionado um item existente. A caixa de listagem se expande para acomodar o maior número possível de itens.
Na terceira captura de ecrã, o utilizador abriu a caixa de lista suspensa. A caixa de listagem se expande para acomodar o maior número possível de itens. O usuário não pode inserir novo texto.
Há também uma série de estilos de combobox que definem propriedades específicas. Os estilos de caixa de combinação definem propriedades específicas de uma caixa de combinação. Você pode combinar estilos; no entanto, alguns estilos aplicam-se apenas a determinados tipos de caixa de combinação. Para obter uma tabela de estilos de caixa de combinação, consulte Estilos de caixa de combinação.
Observação
Para usar estilos visuais com caixas de combinação, um aplicativo deve incluir um manifesto e deve chamar InitCommonControls no início do programa. Para obter informações sobre estilos visuais, consulte Visual Styles. Para obter informações sobre manifestos, consulte Ativar estilos visuais.
Lista de caixas de combinação
A lista é a parte de uma caixa de combinação que exibe os itens que um usuário pode selecionar. Normalmente, um aplicativo inicializa o conteúdo da lista quando cria uma caixa de combinação. Qualquer item da lista selecionado pelo utilizador é a seleção atual. Não é possível selecionar vários itens. Em caixas de combinação simples e caixas de seleção suspensas, o utilizador pode digitar no campo de seleção em vez de selecionar um item da lista. Nestes casos, não há seleção atual, e é responsabilidade do aplicativo adicionar o item à lista e torná-lo a seleção atual, se for apropriado fazê-lo.
Esta seção discute os seguintes tópicos:
Seleção atual
A seleção atual é um item de lista que o utilizador selecionou; o texto selecionado aparece no campo de seleção da caixa de combinação. No entanto, no caso de uma caixa de combinação simples ou de uma caixa de combinação suspensa, a seleção atual é apenas uma das possíveis opções de entrada do utilizador numa caixa de combinação. O usuário também pode digitar texto no campo de seleção.
A seleção atual é identificada pelo índice baseado em zero do item de lista selecionado. Um aplicativo pode defini-lo e recuperá-lo a qualquer momento. A janela pai ou o procedimento da caixa de diálogo recebe uma notificação quando o utilizador altera a seleção atual de uma caixa de combinação. A janela pai ou a caixa de diálogo não é notificada quando o aplicativo altera a seleção.
Quando uma caixa de combinação é criada, não há seleção atual. Isso também é verdade para uma caixa de combinação simples ou desdobrável, se o utilizador tiver alterado o conteúdo do campo de seleção. Para definir a seleção atual, um aplicativo envia a mensagem CB_SETCURSEL para a caixa de combinação. Um aplicativo também pode usar a mensagem CB_SELECTSTRING para definir a seleção atual como um item de lista cuja cadeia de caracteres começa com uma cadeia de caracteres especificada. Para determinar a seleção atual, um aplicativo envia a mensagem CB_GETCURSEL para a caixa de combinação. Se não houver nenhuma seleção atual, essa mensagem retornará CB_ERR.
Quando o utilizador altera a seleção atual em uma caixa de combinação, a janela principal ou o procedimento da caixa de diálogo recebe uma mensagem WM_COMMAND com o código de notificação CBN_SELCHANGE na palavra de ordem superior do parâmetro wParam. Esse código de notificação não é enviado quando a seleção atual é definida usando a mensagem CB_SETCURSEL.
Uma caixa de combinação suspensa ou caixa de listagem suspensa envia o código de notificação CBN_CLOSEUP para a janela pai ou procedimento de caixa de diálogo quando a lista suspensa é fechada. Se o utilizador alterou a seleção atual, a caixa de combinação também enviará o código de notificação CBN_SELCHANGE quando a lista suspensa é fechada. Para executar um processo específico cada vez que o usuário seleciona um item de lista, você pode manipular o código de notificação CBN_SELCHANGE ou CBN_CLOSEUP. Normalmente, você aguardaria o código de notificação CBN_CLOSEUP antes de processar uma alteração na seleção atual. Isto pode ser particularmente importante se for necessária uma quantidade significativa de processamento.
Um aplicativo também pode processar os códigos de notificação CBN_SELENDOK e CBN_SELENDCANCEL. O sistema envia CBN_SELENDOK quando o usuário seleciona um item de lista ou seleciona um item e, em seguida, fecha a lista. Isso indica que o usuário terminou e que a seleção deve ser processada. CBN_SELENDCANCEL é enviado quando o utilizador seleciona um item, mas depois escolhe outro controlo, carrega na tecla ESC enquanto a lista suspensa está aberta ou fecha a caixa de diálogo. Isso indica que a seleção do usuário deve ser ignorada. CBN_SELENDOK é enviado antes de cada CBN_SELCHANGE mensagem.
Em uma caixa de combinação simples, o sistema envia o código de notificação CBN_DBLCLK quando o usuário clica duas vezes em um item de lista. Em uma caixa de combinação suspensa ou lista suspensa, um único clique oculta a lista, portanto, não é possível clicar duas vezes em um item.
Listas pendentes
Algumas notificações e mensagens aplicam-se apenas a caixas de combinação que contêm listas pendentes. Quando uma lista suspensa é aberta ou fechada, a janela principal de uma caixa de combinação recebe uma notificação na forma de uma mensagem WM_COMMAND. Se a lista estiver sendo aberta, a palavra de alta ordem de wParam é CBN_DROPDOWN. Se a lista está sendo fechada, é CBN_CLOSEUP.
Uma aplicação pode abrir a lista de uma caixa de combinação suspensa ou caixa de listagem suspensa usando a mensagem CB_SHOWDROPDOWN. Ele pode determinar se a lista está aberta usando a mensagem CB_GETDROPPEDSTATE e pode determinar as coordenadas de uma lista suspensa usando a mensagem CB_GETDROPPEDCONTROLRECT. Uma aplicação também pode aumentar a largura de uma lista pendente usando a mensagem CB_SETDROPPEDWIDTH.
Conteúdo da lista
Quando um aplicativo cria uma caixa de combinação, ele normalmente inicializa a caixa de combinação adicionando um ou mais itens à lista. Mais tarde, um aplicativo pode adicionar ou excluir itens de lista, reinicializar a lista ou recuperar informações de itens dela.
Um aplicativo adiciona itens de lista a uma caixa de combinação enviando a mensagem CB_ADDSTRING para ele. O item especificado é adicionado ao final da lista ou, numa caixa de combinação ordenada, na sua posição correta com base na sequência de caracteres do item. Em uma caixa de combinação não classificada, um aplicativo pode usar a mensagem CB_INSERTSTRING para inserir um item em uma posição específica. Uma vez adicionado, um item de lista é identificado pela sua posição.
Usando a mensagem CB_FINDSTRING ou CB_FINDSTRINGEXACT, um aplicativo pode determinar a posição de um item de lista. CB_FINDSTRING localiza um item cuja cadeia de caracteres começa com a cadeia de caracteres especificada. CB_FINDSTRINGEXACT localiza um item cuja cadeia de caracteres corresponde exatamente à cadeia da string original. As mensagens não são sensíveis a maiúsculas/minúsculas.
Um aplicativo pode remover um item de lista usando a mensagem CB_DELETESTRING. Se um aplicativo precisar reinicializar a lista de caixas de combinação, ele pode primeiro limpar todo o seu conteúdo usando a mensagem CB_RESETCONTENT. Ao adicionar vários itens à lista depois que uma caixa de combinação já tiver sido mostrada, um aplicativo pode limpar o sinalizador de redesenho para impedir que a caixa de combinação seja repintada depois que cada item for adicionado. Para obter mais informações sobre como redesenhar, consulte a descrição da mensagem WM_SETREDRAW.
Para recuperar a cadeia de caracteres associada a um item de lista, um aplicativo pode usar a mensagem CB_GETLBTEXT. A cadeia de caracteres do item é copiada para o buffer especificado pelo aplicativo. Para garantir que o buffer seja grande o suficiente para receber a cadeia de caracteres, o aplicativo pode primeiro usar a mensagem CB_GETLBTEXTLEN para determinar o comprimento da cadeia de caracteres. Para obter o número de itens de lista numa caixa de combinação, um aplicativo pode usar a mensagem CB_GETCOUNT.
Editar campos de controlo de seleção
Um aplicativo pode recuperar ou definir o conteúdo do campo de seleção e pode determinar ou definir a seleção de edição. O aplicativo também pode limitar a quantidade de texto que um usuário pode digitar no campo de seleção. Quando o conteúdo do campo de seleção muda, o sistema envia mensagens de notificação para o procedimento da janela pai ou da caixa de diálogo.
Para recuperar o conteúdo do campo de seleção, um aplicativo pode enviar a mensagem WM_GETTEXT para a caixa de combinação. Para definir o conteúdo do campo de seleção de uma caixa de combinação simples ou suspensa, um aplicativo pode enviar a mensagem WM_SETTEXT para a caixa de combinação.
A seleção de edição é o intervalo de texto selecionado, se houver, no campo de seleção de uma caixa de combinação simples ou drop-down. Um aplicativo pode determinar as posições de caracteres iniciais e finais da seleção atual usando a mensagem CB_GETEDITSEL. Ele também pode selecionar caracteres na seleção de edição usando a mensagem CB_SETEDITSEL.
Inicialmente, a quantidade de texto que o usuário pode digitar no campo de seleção é limitada pelo tamanho do campo de seleção. No entanto, se a caixa de combinação tiver o estilo CBS_AUTOHSCROLL, o texto pode continuar além do tamanho do campo de seleção. Um aplicativo pode usar a mensagem CB_LIMITTEXT para limitar a quantidade de texto que um usuário pode digitar no campo de seleção, independentemente de o controle ter o estilo CBS_AUTOHSCROLL.
Quando o utilizador edita o conteúdo do campo de seleção, a janela pai ou o procedimento da caixa de diálogo recebe notificações. O código de notificação CBN_EDITUPDATE é enviado primeiro, indicando que o texto no campo de seleção foi editado. Depois que o texto alterado é exibido, o sistema envia CBN_EDITCHANGE. Quando o conteúdo do campo de seleção é alterado como resultado da seleção de um item de lista, essas mensagens não são enviadas.
Owner-Drawn Caixas de combinação
Um aplicativo pode criar uma caixa de combinação desenhada pelo proprietário para assumir a responsabilidade de pintar itens da lista. A janela pai de uma caixa de combinação desenhada pelo seu dono recebe mensagens WM_DRAWITEM quando uma parte da caixa de combinação precisa ser pintada. Uma caixa de combinação desenhada pelo proprietário pode listar informações diferentes ou além de cadeias de texto. As caixas de combinação desenhadas pelo proprietário podem ser de qualquer tipo. No entanto, o controlo de edição numa caixa de combinação simples ou suspensa só pode exibir texto, enquanto o responsável desenha o campo de seleção numa caixa de listagem suspensa.
O proprietário de uma caixa de combinação desenhada pelo proprietário deve processar a mensagem WM_DRAWITEM. Esta mensagem é enviada sempre que uma parte da caixa de combinação tem de ser redesenhada. O proprietário pode precisar processar outras mensagens, dependendo dos estilos especificados para a caixa de combinação.
Um aplicativo pode criar uma caixa de combinação desenhada pelo proprietário especificando o estilo CBS_OWNERDRAWFIXED ou CBS_OWNERDRAWVARIABLE. Se todos os itens de lista na caixa de combinação tiverem a mesma altura, como cadeias de caracteres ou ícones, um aplicativo poderá usar o estilo CBS_OWNERDRAWFIXED. Se os itens de lista forem de altura variável, como bitmaps de tamanho diferente, um aplicativo poderá usar o estilo CBS_OWNERDRAWVARIABLE.
O proprietário de uma caixa de combinação desenhada pelo proprietário pode processar uma mensagem de WM_MEASUREITEM para especificar as dimensões dos itens de lista na caixa de combinação. Se o aplicativo cria a caixa de combinação usando o estilo CBS_OWNERDRAWFIXED, o sistema envia a mensagem WM_MEASUREITEM apenas uma vez. As dimensões especificadas pelo proprietário são usadas para todos os itens da lista. Se o estilo CBS_OWNERDRAWVARIABLE for usado, o sistema enviará uma mensagem WM_MEASUREITEM para cada item de lista adicionado à caixa de combinação. O proprietário pode determinar ou definir a altura de um item de lista a qualquer momento usando as mensagens CB_GETITEMHEIGHT e CB_SETITEMHEIGHT, respectivamente.
Se as informações exibidas em uma caixa de combinação desenhada pelo proprietário incluírem texto, um aplicativo poderá controlar o texto de cada item da lista especificando o estilo CBS_HASSTRINGS. As caixas de combinação com o estilo CBS_SORT são ordenadas com base neste texto. Se uma caixa de combinação estiver classificada e não do estilo CBS_HASSTRINGS, o proprietário deverá processar a mensagem WM_COMPAREITEM.
Em uma caixa de combinação desenhada pelo proprietário, o proprietário deve manter o controle dos itens da lista que contêm informações diferentes ou adicionais ao texto. Uma maneira conveniente de fazer isso é salvar o identificador das informações como dados de item. Para liberar objetos de dados associados a itens numa caixa de combinação, o proprietário pode processar a mensagem WM_DELETEITEM.
Caixas de combinação subclassificadas
A subclassificação é um procedimento que permite que um aplicativo intercete e processe mensagens enviadas ou postadas em uma janela. Usando a subclassificação, um aplicativo pode substituir seu próprio processamento para determinadas mensagens, deixando a maior parte do processamento de mensagens para o procedimento de janela definido por classe.
Quando o sistema operacional cria uma janela, ele salva informações sobre ela em uma estrutura de dados interna que inclui um ponteiro para o procedimento da janela. Para subclassificar uma janela, um aplicativo chama a funçãoSetClassLongpara substituir o ponteiro para esse procedimento por um ponteiro para um procedimento de subclasse definido pelo aplicativo. Depois disso, todas as mensagens para a janela são enviadas para o procedimento de subclasse. Em seguida, este procedimento usa a funçãoCallWindowProc para passar mensagens não processadas para o procedimento da janela original. Para obter uma descrição do processamento de mensagens realizado pelo procedimento da janela da classe COMBOBOX, consulte Default Combo Box Behavior.
Quando a caixa de combinação está fora de uma caixa de diálogo, um aplicativo não pode processar as teclas TAB, ENTER e ESC, a menos que use um procedimento de subclasse. Quando uma caixa de combinação simples ou suspensa recebe o foco de entrada, ela imediatamente define o foco para seu controle de edição filho. Portanto, um aplicativo deve subclassificar o controle de edição para intercetar a entrada do teclado para uma caixa de combinação simples ou suspensa. Para obter um exemplo disso, consulte Subclassificação de uma caixa de combinação.
Se um procedimento de subclasse processar a mensagem WM_PAINT, ele deverá usar a função BeginPaint para se preparar para a pintura. Antes de chamar a função EndPaint, passa-se o identificador de contexto do dispositivo (DC) como parâmetro wParam para o procedimento de janela. Se EndPaint é chamado primeiro, o procedimento de janela da classe não faz pintura porque EndPaint valida toda a janela.
Uma técnica relacionada à subclassificação é a superclassificação. Uma superclasse se assemelha a qualquer outra classe, exceto que seu procedimento de janela não chama DefWindowProc para manipular mensagens não processadas. Em vez disso, ele passa mensagens brutas ao procedimento da janela para a classe de janela mãe. Siga as diretrizes em Procedimentos de janela para evitar problemas que podem ocorrer com subclassificação e superclassificação.