Sobre controles ascendentes e descendentes

Um controle ascendente é um par de botões de seta nos quais o usuário pode clicar para incrementar ou diminuir um valor, como uma posição de rolagem ou um número exibido em um controle complementar (chamado de janela de amigo).

Para o usuário, um controle ascendente e descendente e sua janela de amigo geralmente parecem um único controle. Você pode especificar que um controle ascendente se posicione automaticamente ao lado de sua janela de amigo e que defina automaticamente a legenda da janela de amigo para sua posição atual. Por exemplo, você pode usar um controle ascendente com um controle de edição para solicitar ao usuário a entrada numérica. A ilustração a seguir mostra um controle ascendente com um controle de edição como sua janela de amigo, uma combinação que às vezes é chamada de controle rotativo.

screen shot showing a short, wide rectangular control with up and down arrows at the right edge

Os tópicos a seguir são discutidos nesta seção.

Estilos de controle ascendente e descendente

Usando estilos de janela, você pode manipular características de um controle de cima para baixo, como como ele se posiciona em relação à janela de amigo, se define o texto de sua janela de amigo e se processa as teclas SETA PARA CIMA e SETA PARA BAIXO.

Um controle ascendente com o estilo UDS_ALIGNLEFT ou UDS_ALIGNRIGHT se alinha com a borda esquerda ou direita de sua janela de amigos. A largura da janela do amigo é diminuída para acomodar a largura do controle ascendente-descendente.

Um controle ascendente com o estilo UDS_SETBUDDYINT define a legenda de sua janela de amigo sempre que a posição atual muda. O controle insere um separador de milhares entre cada três dígitos de uma cadeia decimal, a menos que o estilo UDS_NOTHOUSANDS seja especificado. Se a janela do amigo for uma caixa de listagem, um controle ascendente definirá sua seleção atual em vez de sua legenda.

Você pode especificar o estilo UDS_ARROWKEYS para fornecer uma interface de teclado para um controle ascendente. Se esse estilo for especificado, o controle processará as teclas de seta para cima e para baixo. O controle também subclassifica a janela do amigo para que ele possa processar essas teclas quando a janela do amigo tiver o foco.

Se você usar um controle para cima e para baixo para rolagem horizontal, poderá especificar o estilo UDS_HORZ. Esse estilo faz com que as setas do controle de cima para baixo apontem para a esquerda e para a direita, em vez de para cima e para baixo.

Por padrão, a posição atual não será alterada se o usuário tentar incrementá-la ou diminuí-la além do valor máximo ou mínimo. Você pode alterar esse comportamento usando o estilo UDS_WRAP, para que a posição "quebra" para o extremo oposto. Por exemplo, incrementar além do limite superior envolve a posição de volta para o limite inferior.

Posição e Aceleração

Depois que um controle ascendente é criado, você pode alterar a posição atual, a posição mínima e a posição máxima do controle enviando mensagens. Você também pode alterar a base radix usada para exibir a posição atual na janela do amigo e a taxa na qual a posição atual muda quando a seta para cima ou para baixo é clicada.

Para recuperar a posição atual de um controle ascendente-descendente, use a mensagem UDM_GETPOS . Para um controle ascendente com uma janela de amigos, a posição atual é o número na legenda da janela de amigos. Como a legenda pode ter sido alterada (por exemplo, o usuário pode ter editado o texto de um controle de edição), o controle ascendente recupera a legenda atual e atualiza sua posição atual de acordo.

A legenda da janela do amigo pode ser uma cadeia decimal ou hexadecimal, dependendo da base radix (ou seja, base 10 ou 16) do controle up-down. Você pode definir a base radix usando a mensagem UDM_SETBASE e recuperar a base radix usando a mensagem UDM_GETBASE.

A mensagem UDM_SETPOS define a posição atual de uma janela de amigo. Observe que, ao contrário de uma barra de rolagem, um controle para cima e para baixo muda automaticamente sua posição atual quando as setas para cima e para baixo são clicadas. Um aplicativo, portanto, não precisa definir a posição atual ao processar a mensagem WM_VSCROLL ou WM_HSCROLL.

Você pode alterar as posições mínima e máxima de um controle ascendente usando a mensagem UDM_SETRANGE. A posição máxima pode ser menor que a mínima e, nesse caso, clicar no botão de seta para cima diminui a posição atual. Dito de outra forma, subir significa mover-se em direção à posição máxima. Para recuperar as posições mínima e máxima de um controle ascendente-descendente, use a mensagem UDM_GETRANGE.

Você pode controlar a taxa na qual a posição muda quando o usuário mantém pressionado um botão de seta configurando a aceleração do controle para cima-para baixo. A aceleração é definida por uma matriz de estruturas UDACCEL. Cada estrutura especifica um intervalo de tempo e o número de unidades pelas quais aumentar ou diminuir no final desse intervalo. Para definir a aceleração, use a mensagem UDM_SETACCEL. Para recuperar informações de aceleração, use a mensagem UDM_GETACCEL.

Processamento de mensagens de controles up-down padrão

Esta seção descreve as mensagens padrão do Windows processadas por um controle ascendente.

Mensagem Processamento realizado
WM_CREATE Aloca e inicializa uma estrutura de dados privada e salva seu endereço como dados de janela.
WM_DESTROY Libera os dados alocados durante o processamento WM_CREATE .
WM_ENABLE Invalida a janela.
WM_KEYDOWN Altera a posição atual no caso de uma tecla SETA PARA CIMA ou SETA PARA BAIXO.
WM_KEYUP Conclui a mudança de posição.
WM_LBUTTONDOWN Captura o mouse. Se a janela do amigo for um controle de edição ou uma caixa de listagem, ela definirá o foco para a janela do amigo. Se o mouse estiver sobre o botão para cima ou para baixo, ele começa a mudar a posição e define um temporizador.
WM_LBUTTONUP Conclui a mudança de posição e libera a captura do mouse se o controle ascendente tiver capturado o mouse. Se a janela do amigo for um controle de edição, ela selecionará todo o texto no controle de edição.
WM_PAINT Pinta o controle ascendente-descendente. Se o parâmetro wParam for não-NULL, o controle assume que o valor é um HDC e pinta usando esse contexto de dispositivo.
WM_TIMER Altera a posição atual se o mouse estiver sendo pressionado sobre um botão e um intervalo suficiente tiver decorrido.