Sobre as 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 inclui as seções a seguir.

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 poderá inserir informações não disponíveis na lista; caso contrário, o usuário só poderá 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.
Lista suspensa CBS_DROPDOWN Exibe a lista quando o ícone é clicado e mostra o item selecionado em um controle de edição.
Lista suspensa (lista suspensa) CBS_DROPDOWNLIST Exibe a lista quando o ícone é clicado e mostra o item selecionado em um controle estático.

 

As capturas de tela a seguir mostram os três tipos de caixa de combinação como eles 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 só é grande o suficiente para acomodar dois itens.

screen shot showing an item selected in a simple combo box

Na segunda captura de tela, o usuário digitou um novo texto no controle de edição da caixa de combinação suspensa. O usuário também pode ter selecionado um item existente. A caixa de listagem se expande para acomodar o maior número possível de itens.

screen shot showing text typed into a drop-down combo box

Na terceira captura de tela, o usuário abriu a caixa de combinação da 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.

screen shot showing an item selected in a drop-down list combo box

Há também vários estilos de caixa de combinação 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 se aplicam 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 Estilos visuais. Para obter informações sobre manifestos, consulte Habilitando 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 de lista selecionado pelo usuário é a seleção atual. Vários itens não podem ser selecionados. Em caixas de combinação simples e suspensas, o usuário pode digitar no campo de seleção em vez de selecionar um item de lista. Nesses 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 usuário 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 uma caixa de combinação suspensa, a seleção atual é apenas uma forma de possível entrada do usuário em uma 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. O procedimento de janela pai ou caixa de diálogo recebe notificação quando o usuário 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 é verdadeiro para uma caixa de combinação simples ou suspensa, se o usuário tiver editado 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 usuário altera a seleção atual em uma caixa de combinação, a janela pai ou o procedimento de caixa de diálogo recebe uma mensagem de WM_COMMAND com o código de notificação CBN_SELCHANGE na palavra de ordem alta 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 usuário 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 for 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. Isso pode ser particularmente importante se uma quantidade significativa de processamento for necessária.

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 concluiu e que a seleção deve ser processada. CBN_SELENDCANCEL é enviado quando o usuário seleciona um item, mas seleciona outro controle, pressiona 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 mensagem CBN_SELCHANGE .

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.

Determinadas 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 pai de uma caixa de combinação recebe uma notificação na forma de uma mensagem de WM_COMMAND . Se a lista estiver sendo aberta, a palavra de ordem alta de wParam será CBN_DROPDOWN. Se a lista está sendo fechada, ela é CBN_CLOSEUP.

Um aplicativo 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. Um aplicativo também pode aumentar a largura de uma lista suspensa usando a mensagem CB_SETDROPPEDWIDTH.

Listar Conteúdo

Quando um aplicativo cria uma caixa de combinação, ele normalmente inicializa a caixa de combinação adicionando um ou mais itens à lista. Posteriormente, um aplicativo pode adicionar ou excluir itens de lista, reinicializar a lista ou recuperar informações de item dela.

Um aplicativo adiciona itens de lista a uma caixa de combinação enviando a mensagem CB_ADDSTRING para ela. O item especificado é adicionado ao final da lista ou, em uma caixa de combinação classificada, em sua posição classificada correta com base na cadeia 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 por 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 de caracteres. Nenhuma das mensagens diferencia maiúsculas de 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 poderá 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 pintada novamente 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 em uma caixa de combinação, um aplicativo pode usar a mensagem CB_GETCOUNT.

Editar campos de seleção de controle

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 é alterado, o sistema envia mensagens de notificação para a janela pai ou para o procedimento da caixa de diálogo.

Para recuperar o conteúdo do campo de seleção, um aplicativo pode enviar a mensagem de 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 suspensa. 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 poderá 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 usuário edita o conteúdo do campo de seleção, a janela pai ou o procedimento da caixa de diálogo recebe mensagens de notificação. 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.

Caixas de combinação desenhadas pelo proprietário

Um aplicativo pode criar uma caixa de combinação desenhada pelo proprietário para assumir a responsabilidade pela pintura de itens de lista. A janela pai de uma caixa de combinação desenhada pelo proprietário (seu proprietário) recebe WM_DRAWITEM mensagens 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 adicionais a cadeias de caracteres de texto. As caixas de combinação desenhadas pelo proprietário podem ser de qualquer tipo. No entanto, o controle de edição em uma caixa de combinação simples ou suspensa só pode exibir texto, enquanto o proprietário pinta o campo de seleção em uma caixa de listagem suspensa.

O proprietário de uma caixa de combinação desenhada pelo proprietário deve processar a mensagem WM_DRAWITEM. Essa mensagem é enviada sempre que uma parte da caixa de combinação deve 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 tiverem 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 criar a caixa de combinação usando o estilo CBS_OWNERDRAWFIXED, o sistema enviará a mensagem de 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 de 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 de lista especificando o estilo CBS_HASSTRINGS. As caixas de combinação com o estilo CBS_SORT são classificadas com base neste texto. Se uma caixa de combinação for 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 controlar os itens da lista que contêm informações diferentes ou adicionais ao texto. Uma maneira conveniente de fazer isso é salvar o identificador nas informações como dados de item. Para liberar objetos de dados associados a itens em uma 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 intercepte 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 maioria do processamento de mensagens para o procedimento de janela definido pela 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 de janela. Para subclassificar uma janela, um aplicativo chama a função SetClassLong para 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. Esse procedimento, em seguida, usa a função CallWindowProc para passar mensagens não processadas para o procedimento de janela original. Para obter uma descrição do processamento de mensagens executado pelo procedimento de janela de classe COMBOBOX, consulte Comportamento padrão da caixa de combinação.

Quando a caixa de combinação está fora de uma caixa de diálogo, um aplicativo não pode processar as chaves 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 define imediatamente o foco para seu controle de edição filho. Portanto, um aplicativo deve subclassificar o controle de edição para interceptar a entrada do teclado para uma caixa de combinação simples ou suspensa. Para obter um exemplo disso, consulte Subclassificando 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, ela passa o identificador de contexto do dispositivo (DC) como o parâmetro wParam para o procedimento de janela. Se o EndPaint for chamado primeiro, o procedimento da janela de classe não será pintado porque o EndPaint validará a janela inteira.

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 não processadas para o procedimento de janela para a classe de janela pai. Siga as diretrizes em Procedimentos de janela para evitar problemas que podem ocorrer com subclassificação e superclassificação.