Sobre barras de rolagem

Uma janela pode exibir um objeto de dados, como um documento ou um bitmap, que é maior do que a área do cliente da janela. Quando fornecido com uma barra de rolagem, o usuário pode rolar um objeto de dados na área do cliente para exibir as partes do objeto que se estendem além das bordas da janela.

As barras de rolagem devem ser incluídas em qualquer janela para a qual o conteúdo da área do cliente se estenda além das bordas da janela. A orientação de uma barra de rolagem determina a direção na qual a rolagem ocorre quando o usuário opera a barra de rolagem. Uma barra de rolagem horizontal permite que o usuário role o conteúdo de uma janela para a esquerda ou para a direita. Uma barra de rolagem vertical permite que o usuário role o conteúdo para cima ou para baixo.

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

Partes de uma barra de rolagem

Uma barra de rolagem consiste em um eixo sombreado com um botão de seta em cada extremidade e uma caixa de rolagem (às vezes chamada de polegar) entre os botões de seta. Uma barra de rolagem representa o comprimento ou a largura total de um objeto de dados na área do cliente de uma janela; A caixa de rolagem representa a parte do objeto que está visível na área do cliente. A posição da caixa de rolagem muda sempre que o usuário rola um objeto de dados para exibir uma parte diferente dele. O sistema também ajusta o tamanho da caixa de rolagem de uma barra de rolagem para que ela indique qual parte de todo o objeto de dados está visível atualmente na janela. Se a maior parte do objeto estiver visível, a caixa de rolagem ocupará a maior parte do eixo da barra de rolagem. Da mesma forma, se apenas uma pequena parte do objeto estiver visível, a caixa de rolagem ocupará uma pequena parte do eixo da barra de rolagem.

O usuário rola o conteúdo de uma janela clicando em um dos botões de seta, clicando na área no eixo da barra de rolagem sombreada ou arrastando a caixa de rolagem. Quando o usuário clica em um botão de seta, o aplicativo rola o conteúdo por uma unidade (normalmente uma única linha ou coluna). Quando o usuário clica nas áreas sombreadas, o aplicativo rola o conteúdo por uma janela. A quantidade de rolagem que ocorre quando o usuário arrasta a caixa de rolagem depende da distância que o usuário arrasta a caixa de rolagem e do intervalo de rolagem da barra de rolagem. Para obter mais informações sobre o intervalo de rolagem, consulte Posição da caixa de rolagem e Intervalo de rolagem.

A captura de tela a seguir mostra um controle de edição avançado com barras de rolagem verticais e horizontais, como elas podem aparecer no Windows Vista. A barra de rolagem vertical está atualmente "quente" porque o ponteiro do mouse estava pairando sobre ela quando a captura de tela foi feita.

screen shot of a rich edit control with scroll bars

Barras de rolagem padrão e controles de barra de rolagem

Uma barra de rolagem é incluída em uma janela como uma barra de rolagem padrão ou como um controle de barra de rolagem. Uma barra de rolagem padrão está localizada na área não cliente de uma janela. Ele é criado com a janela e exibido quando a janela é exibida. O único objetivo de uma barra de rolagem padrão é permitir que o usuário gere solicitações de rolagem para exibir todo o conteúdo da área do cliente. Você pode incluir uma barra de rolagem padrão em uma janela especificando WS_HSCROLL, WS_VSCROLL ou ambos os estilos ao criar a janela. O estilo WS_HSCROLL cria uma barra de rolagem horizontal posicionada na parte inferior da área do cliente. O estilo WS_VSCROLL cria uma barra de rolagem vertical posicionada à direita da área do cliente. Os valores métricos do sistema SM_CXHSCROLL e SM_CYHSCROLL definem a largura e a altura de uma barra de rolagem horizontal padrão. Os valores SM_CXVSCROLL e SM_CYVSCROLL definem a largura e a altura de uma barra de rolagem vertical padrão. Uma barra de rolagem padrão faz parte de sua janela associada e, portanto, não tem um identificador de janela próprio.

Um controle de barra de rolagem é uma janela de controle que pertence à classe de janela SCROLLBAR. Um controle de barra de rolagem aparece e funciona como uma barra de rolagem padrão, mas é uma janela separada. Como uma janela separada, um controle de barra de rolagem assume o foco de entrada direto. Ao contrário de uma barra de rolagem padrão, um controle de barra de rolagem também tem uma interface de teclado integrada.

Você pode usar quantos controles de barra de rolagem forem necessários em uma única janela. Ao criar um controle de barra de rolagem, você deve especificar o tamanho e a posição da barra de rolagem. No entanto, se a janela de um controle de barra de rolagem puder ser redimensionada, ajustes no tamanho da barra de rolagem deverão ser feitos sempre que o tamanho da janela for alterado.

A vantagem de usar uma barra de rolagem padrão é que o sistema cria a barra de rolagem e define automaticamente seu tamanho e posição. No entanto, as barras de rolagem padrão às vezes são muito restritivas. Por exemplo, suponha que você queira dividir uma área do cliente em quadrantes e usar um conjunto separado de barras de rolagem para controlar o conteúdo de cada quadrante. Não é possível usar barras de rolagem padrão porque você só pode criar um conjunto de barras de rolagem para uma janela específica. Em vez disso, use controles da barra de rolagem, pois você pode adicionar quantos deles quiser a uma janela.

Os aplicativos podem fornecer controles de barra de rolagem para outros fins que não rolar o conteúdo de uma janela. Por exemplo, um aplicativo de proteção de tela pode fornecer uma barra de rolagem para definir a velocidade na qual os gráficos são movidos na tela.

Um controle de barra de rolagem pode ter vários estilos que servem para controlar a orientação e a posição da barra de rolagem. Você especifica os estilos desejados ao chamar a função CreateWindowEx para criar um controle de barra de rolagem. Alguns dos estilos criam um controle de barra de rolagem que usa uma largura ou altura padrão. No entanto, você sempre deve especificar as coordenadas x e y e as outras dimensões da barra de rolagem.

Para obter uma tabela de estilos de controle da barra de rolagem, consulte Estilos de controle da barra de rolagem.

Observação

Para usar estilos visuais com barras de rolagem, 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.

 

Posição da caixa de rolagem e intervalo de rolagem

A posição da caixa de rolagem é representada como um inteiro; Ele é relativo à extremidade esquerda ou superior da barra de rolagem, dependendo se a barra de rolagem é horizontal ou vertical. A posição deve estar dentro dos valores mínimo e máximo do intervalo de rolagem. Por exemplo, em uma barra de rolagem com um intervalo de 0 a 100, a posição 50 está no meio, com as posições restantes distribuídas igualmente ao longo da barra de rolagem. O intervalo inicial depende da barra de rolagem. As barras de rolagem padrão têm um intervalo inicial de 0 a 100; Os controles da barra de rolagem têm um intervalo vazio (os valores mínimo e máximo são zero), a menos que você forneça um intervalo explícito quando o controle for criado. Você pode alterar o intervalo a qualquer momento. Você pode usar a função SetScrollInfo para definir os valores de intervalo e a função GetScrollInfo para recuperar os valores de intervalo atuais.

Um aplicativo normalmente ajusta o intervalo de rolagem para inteiros convenientes, facilitando a conversão da posição da caixa de rolagem em um valor correspondente ao objeto de dados a ser rolado. Por exemplo, se um aplicativo deve exibir 260 linhas de um arquivo de texto em uma janela que pode mostrar apenas 16 linhas por vez, o intervalo da barra de rolagem vertical pode ser definido como 1 a 244. Se a caixa de rolagem estiver na posição 1, a primeira linha estará na parte superior da janela. Se a caixa de rolagem estiver na posição 244, a última linha (linha 260) estará na parte inferior da janela. Se um aplicativo tentar especificar um valor de posição menor que o mínimo ou maior que o máximo, o valor mínimo ou máximo do intervalo de rolagem será usado.

Você pode definir um tamanho de página para uma barra de rolagem. O tamanho da página representa o número de unidades de dados que podem caber na área do cliente da janela do proprietário, dado seu tamanho atual. Por exemplo, se a área do cliente puder conter 16 linhas de texto, um aplicativo definirá o tamanho da página como 16. O sistema usa o tamanho da página, juntamente com o intervalo de rolagem e o comprimento do eixo da barra de rolagem, para definir o tamanho da caixa de rolagem. Sempre que uma janela que contém uma barra de rolagem é redimensionada, um aplicativo deve chamar a função SetScrollInfo para definir o tamanho da página. Um aplicativo pode recuperar o tamanho de página atual chamando a função GetScrollInfo de envio.

Para estabelecer uma relação útil entre o intervalo da barra de rolagem e o objeto de dados, um aplicativo deve ajustar o intervalo sempre que o tamanho do objeto de dados for alterado.

À medida que o usuário move a caixa de rolagem em uma barra de rolagem, a barra de rolagem informa a posição da caixa de rolagem como um inteiro no intervalo de rolagem. Se a posição for o valor mínimo, a caixa de rolagem estará na parte superior de uma barra de rolagem vertical ou na extremidade esquerda de uma barra de rolagem horizontal. Se a posição for o valor máximo, a caixa de rolagem estará na parte inferior de uma barra de rolagem vertical ou na extremidade direita de uma barra de rolagem horizontal.

O valor máximo que uma barra de rolagem pode relatar (ou seja, a posição máxima de rolagem) depende do tamanho da página. Se a barra de rolagem tiver um tamanho de página maior que um, a posição máxima de rolagem será menor que o valor máximo do intervalo. Você pode usar a seguinte fórmula para calcular a posição máxima de rolagem:

MaxScrollPos = MaxRangeValue - (PageSize - 1) 

Um aplicativo deve mover a caixa de rolagem em uma barra de rolagem. Embora o usuário faça uma solicitação de rolagem em uma barra de rolagem, a barra de rolagem não atualiza automaticamente a posição da caixa de rolagem. Em vez disso, ele passa a solicitação para a janela pai, que deve rolar os dados e atualizar a posição da caixa de rolagem. Um aplicativo usa a função SetScrollInfo para atualizar a posição da caixa de rolagem, caso contrário, ele usa a função SetScrollPos. Como ele controla o movimento da caixa de rolagem, o aplicativo pode mover a caixa de rolagem em incrementos que funcionam melhor para os dados que estão sendo rolados.

Visibilidade da barra de rolagem

O sistema oculta e desabilita uma barra de rolagem padrão quando valores mínimos e máximos iguais são especificados. O sistema também oculta e desabilita uma barra de rolagem padrão se você especificar um tamanho de página que inclua todo o intervalo de rolagem da barra de rolagem. Essa é a maneira de ocultar temporariamente uma barra de rolagem quando ela não é necessária para o conteúdo da área do cliente. Não há necessidade de fazer solicitações de rolagem pela barra de rolagem quando ela está oculta. O sistema habilita a barra de rolagem e a mostra novamente quando você define os valores mínimo e máximo para valores desiguais e quando o tamanho da página não inclui todo o intervalo de rolagem. A função ShowScrollBar também pode ser usada para ocultar ou mostrar uma barra de rolagem. Isso não afeta o intervalo, o tamanho da página ou a posição da caixa de rolagem da barra de rolagem.

A função EnableScrollBar pode ser usada para desativar uma ou ambas as setas de uma barra de rolagem. Um aplicativo exibe setas desabilitadas em cinza e não responde à entrada do usuário.

Solicitações da barra de rolagem

O usuário faz solicitações de rolagem clicando em várias partes de uma barra de rolagem. O sistema envia a solicitação para a janela especificada na forma de uma mensagem WM_HSCROLL ou WM_VSCROLL. Uma barra de rolagem horizontal envia a mensagem WM_HSCROLL e uma barra de rolagem vertical envia a mensagem WM_VSCROLL. Cada mensagem inclui um código de solicitação que corresponde à ação do usuário, à alça da barra de rolagem (somente controles da barra de rolagem) e, em alguns casos, à posição da caixa de rolagem.

O diagrama a seguir mostra o código de solicitação que o usuário gera ao clicar em várias partes de uma barra de rolagem.

diagram showing the request codes associated with each region on two scroll bars

Os valores SB_ especificam a ação executada pelo usuário. Um aplicativo examina os códigos que acompanham as mensagens WM_HSCROLL e WM_VSCROLL e, em seguida, executa a operação de rolagem apropriada. Na tabela a seguir, a ação do usuário é especificada para cada valor, seguida pela resposta do aplicativo. Em cada caso, uma unidade é definida pelo aplicativo como apropriado para os dados. Por exemplo, a unidade típica para rolar texto verticalmente é uma linha de texto.

Solicitar Ação Resposta
SB_LINEUP O usuário clica na seta de rolagem superior. Decrementa a posição da caixa de rolagem; rola em direção à parte superior dos dados por uma unidade.
SB_LINEDOWN O usuário clica na seta de rolagem inferior. Incrementa a posição da caixa de rolagem; rola para a parte inferior dos dados por uma unidade.
SB_LINELEFT O usuário clica na seta de rolagem para a esquerda. Decrementa a posição da caixa de rolagem; rola para a extremidade esquerda dos dados por uma unidade.
SB_LINERIGHT O usuário clica na seta de rolagem para a direita. Incrementa a posição da caixa de rolagem; rola para a extremidade direita dos dados por uma unidade.
SB_PAGEUP O usuário clica no eixo da barra de rolagem acima da caixa de rolagem. Decrementa a posição da caixa de rolagem pelo número de unidades de dados na janela; rola em direção à parte superior dos dados pelo mesmo número de unidades.
SB_PAGEDOWN O usuário clica no eixo da barra de rolagem abaixo da caixa de rolagem. Incrementa a posição da caixa de rolagem pelo número de unidades de dados na janela; rola para a parte inferior dos dados pelo mesmo número de unidades.
SB_PAGELEFT O usuário clica no eixo da barra de rolagem à esquerda da caixa de rolagem. Decrementa a posição da caixa de rolagem pelo número de unidades de dados na janela; rola para a extremidade esquerda dos dados pelo mesmo número de unidades.
SB_PAGERIGHT O usuário clica no eixo da barra de rolagem à direita da caixa de rolagem. Incrementa a posição da caixa de rolagem pelo número de unidades de dados na janela; rola para a extremidade direita dos dados pelo mesmo número de unidades.
SB_THUMBPOSITION O usuário libera a caixa de rolagem depois de arrastá-la. Define a caixa de rolagem para a posição especificada na mensagem; rola os dados pelo mesmo número de unidades que a caixa de rolagem moveu.
SB_THUMBTRACK O usuário arrasta a caixa de rolagem. Define a caixa de rolagem para a posição especificada na mensagem e rola os dados pelo mesmo número de unidades que a caixa de rolagem moveu para aplicativos que desenham dados rapidamente. Os aplicativos que não podem desenhar dados rapidamente devem aguardar o código de solicitação SB_THUMBPOSITION antes de mover a caixa de rolagem e rolar os dados.
SB_ENDSCROLL O usuário solta o mouse depois de segurá-lo em uma seta ou no eixo da barra de rolagem. Nenhuma resposta é necessária.

 

Uma barra de rolagem gera SB_THUMBPOSITION e SB_THUMBTRACK código de solicitação quando o usuário clica e arrasta a caixa de rolagem. Um aplicativo deve ser programado para processar o código de solicitação SB_THUMBTRACK ou SB_THUMBPOSITION.

O código de solicitação SB_THUMBPOSITION ocorre quando o usuário libera o botão do mouse depois de clicar na caixa de rolagem. Um aplicativo que processa essa mensagem executa a operação de rolagem depois que o usuário arrastou a caixa de rolagem para a posição desejada e liberou o botão do mouse.

O código de solicitação SB_THUMBTRACK ocorre quando o usuário arrasta a caixa de rolagem. Se um aplicativo processar códigos de solicitação SB_THUMBTRACK, ele poderá rolar o conteúdo de uma janela à medida que o usuário arrasta a caixa de rolagem. No entanto, uma barra de rolagem pode gerar muitos códigos de solicitação SB_THUMBTRACK em um curto período, portanto, um aplicativo deve processar esses códigos de solicitação somente se puder repintar rapidamente o conteúdo da janela.

Interface de teclado para uma barra de rolagem

Um controle de barra de rolagem fornece uma interface de teclado integrada que permite ao usuário emitir solicitações de rolagem usando o teclado; uma barra de rolagem padrão não. Quando um controle de barra de rolagem tem o foco do teclado, ele envia mensagens WM_HSCROLL e WM_VSCROLL para sua janela pai quando o usuário pressiona as teclas de seta. O código de solicitação é enviado com cada mensagem correspondente à tecla de seta que o usuário pressionou. A seguir estão as teclas de seta e seus códigos de solicitação correspondentes.

Tecla de direção Solicitar código
DOWN SB_LINEDOWN ou SB_LINERIGHT
END SB_BOTTOM
HOME SB_TOP
LEFT SB_LINEUP ou SB_LINELEFT
PGDN SB_PAGEDOWN ou SB_PAGERIGHT
PGUP SB_PAGEUP ou SB_PAGELEFT
RIGHT SB_LINEDOWN ou SB_LINERIGHT
UP SB_LINEUP ou SB_LINELEFT

 

 

Observação

A interface do teclado de um controle de barra de rolagem envia os códigos de solicitação SB_TOP e SB_BOTTOM. O código de solicitação SB_TOP indica que o usuário atingiu o valor máximo do intervalo de rolagem. Um aplicativo rola o conteúdo da janela para baixo para que a parte superior do objeto de dados fique visível. O código de solicitação SB_BOTTOM indica que o usuário atingiu o valor inferior do intervalo de rolagem. Se um aplicativo processar o código de solicitação SB_BOTTOM, ele rolará o conteúdo da janela para cima para que a parte inferior do objeto de dados fique visível.

 

Se desejar uma interface de teclado para uma barra de rolagem padrão, você mesmo poderá criar uma processando a mensagem WM_KEYDOWN no procedimento da janela e, em seguida, executando a ação de rolagem apropriada com base no código de chave virtual que acompanha a mensagem. Para obter informações sobre como criar uma interface de teclado para uma barra de rolagem, consulte Criando uma interface de teclado para uma barra de rolagem padrão.

Rolando a área do cliente

A maneira mais simples de rolar o conteúdo de uma área do cliente é apagá-lo e, em seguida, redesenhá-lo. Esse é o método que um aplicativo provavelmente usará com códigos de solicitação SB_PAGEUP, SB_PAGEDOWN e SB_TOP, que normalmente exigem conteúdo completamente novo.

Para alguns códigos de solicitação, como SB_LINEUP e SB_LINEDOWN, nem todo o conteúdo precisa ser apagado, pois alguns permanecem visíveis após a rolagem. A função ScrollWindowEx preserva uma parte do conteúdo da área do cliente, move a parte preservada uma quantidade especificada e, em seguida, prepara o restante da área do cliente para pintar novas informações. ScrollWindowEx usa a função BitBlt para mover uma parte específica do objeto de dados para um novo local dentro da área do cliente. Qualquer parte descoberta da área do cliente (qualquer coisa não preservada) é invalidada, apagada e pintada quando a próxima mensagem WM_PAINT ocorre.

A função ScrollWindowEx pode ser usada para excluir uma parte da área do cliente da operação de rolagem. Isso impede que itens com posições fixas, como janelas filhas, se movam dentro da área do cliente. Ele invalida automaticamente a parte da área do cliente que deve receber as novas informações, para que o aplicativo não precise computar suas próprias regiões de recorte. Para obter mais informações sobre recorte, consulte Recorte.

Normalmente, um aplicativo rola o conteúdo de uma janela na direção oposta à indicada pela barra de rolagem. Por exemplo, quando o usuário clica no eixo da barra de rolagem na área abaixo da caixa de rolagem, um aplicativo rola o objeto na janela para cima para revelar uma parte do objeto que está abaixo da parte visível.

Você também pode rolar uma região retangular usando a função ScrollDC .

Cores e métricas da barra de rolagem

O valor de cor definido pelo sistema, COLOR_SCROLLBAR, controla a cor dentro de um eixo de barra de rolagem. Use a função GetSysColor para determinar a cor do eixo da barra de rolagem e a função SetSysColors para definir a cor do eixo da barra de rolagem. Note, no entanto, que essa alteração de cor afeta todas as barras de rolagem no sistema.

Você pode obter as dimensões dos bitmaps que o sistema usa em barras de rolagem padrão chamando a função GetSystemMetrics. A seguir estão os valores de métrica do sistema associados às barras de rolagem.

Métrica do sistema Descrição
SM_CXHSCROLL Largura do bitmap de seta na barra de rolagem horizontal
SM_CXHTHUMB Largura da caixa de rolagem na barra de rolagem horizontal. Esse valor recupera a largura de uma barra de rolagem que tem um tamanho de página de zero.
SM_CXVSCROLL Largura do bitmap de seta na barra de rolagem vertical
SM_CYHSCROLL Altura do bitmap de seta na barra de rolagem horizontal
SM_CYVSCROLL Altura do bitmap de seta na barra de rolagem vertical
SM_CYVTHUMB Altura da caixa de rolagem na barra de rolagem vertical. Esse valor recupera a altura de uma barra de rolagem que tem um tamanho de página de zero.