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.
Os tópicos a seguir são discutidos nesta seção.
- Estilos de controle ascendentes e descendentes
- Posição e Aceleração
- Processamento de mensagens de controles up-down padrã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. |