Acerca de las barras de desplazamiento
Una ventana puede mostrar un objeto de datos, como un documento o un mapa de bits, que es mayor que el área de cliente de la ventana. Cuando se proporciona con una barra de desplazamiento, el usuario puede desplazar un objeto de datos en el área de cliente para incluir en la vista las partes del objeto que se extienden más allá de los bordes de la ventana.
Las barras de desplazamiento deben incluirse en cualquier ventana para la que el contenido del área de cliente se extiende más allá de los bordes de la ventana. La orientación de una barra de desplazamiento determina la dirección en la que se produce el desplazamiento cuando el usuario opera la barra de desplazamiento. Una barra de desplazamiento horizontal permite al usuario desplazar el contenido de una ventana a la izquierda o a la derecha. Una barra de desplazamiento vertical permite al usuario desplazar el contenido hacia arriba o hacia abajo.
En esta sección se describen los temas siguientes.
- Partes de una barra de desplazamiento
- Barras de desplazamiento estándar y controles de barra de desplazamiento
- Posición del cuadro de desplazamiento y intervalo de desplazamiento
- Visibilidad de la barra de desplazamiento
- Solicitudes de barra de desplazamiento
- Interfaz de teclado para una barra de desplazamiento
- Desplazamiento del área de cliente
- Colores y métricas de la barra de desplazamiento
Partes de una barra de desplazamiento
Una barra de desplazamiento consta de un eje sombreado con un botón de flecha en cada extremo y un cuadro de desplazamiento (a veces denominado pulgar) entre los botones de flecha. Una barra de desplazamiento representa la longitud total o el ancho de un objeto de datos en el área cliente de una ventana; el cuadro de desplazamiento representa la parte del objeto que está visible en el área de cliente. La posición del cuadro de desplazamiento cambia cada vez que el usuario desplaza un objeto de datos para mostrar una parte diferente de él. El sistema también ajusta el tamaño del cuadro de desplazamiento de una barra de desplazamiento para que indique qué parte del objeto de datos completo está visible actualmente en la ventana. Si la mayoría del objeto está visible, el cuadro de desplazamiento ocupa la mayor parte del eje de la barra de desplazamiento. Del mismo modo, si solo hay una pequeña parte del objeto visible, el cuadro de desplazamiento ocupa una pequeña parte del eje de la barra de desplazamiento.
El usuario desplaza el contenido de una ventana haciendo clic en uno de los botones de flecha, haciendo clic en el área del eje de la barra de desplazamiento sombreada o arrastrando el cuadro de desplazamiento. Cuando el usuario hace clic en un botón de flecha, la aplicación desplaza el contenido por una unidad (normalmente una sola línea o columna). Cuando el usuario hace clic en las áreas sombreadas, la aplicación desplaza el contenido por una ventana. La cantidad de desplazamiento que se produce cuando el usuario arrastra el cuadro de desplazamiento depende de la distancia a la que el usuario arrastra el cuadro de desplazamiento y en el intervalo de desplazamiento de la barra de desplazamiento. Para obtener más información sobre el intervalo de desplazamiento, vea Posición del cuadro de desplazamiento y Intervalo de desplazamiento.
En la captura de pantalla siguiente se muestra un control de edición enriquecido con barras de desplazamiento verticales y horizontales, como podrían aparecer en Windows Vista. La barra de desplazamiento vertical es actualmente "activa" porque el puntero del mouse estaba desplazando sobre él cuando se tomó la captura de pantalla.
Barras de desplazamiento estándar y controles de barra de desplazamiento
Una barra de desplazamiento se incluye en una ventana como una barra de desplazamiento estándar o como un control de barra de desplazamiento. Una barra de desplazamiento estándar se encuentra en el área no cliente de una ventana. Se crea con la ventana y se muestra cuando se muestra la ventana. El único propósito de una barra de desplazamiento estándar es permitir que el usuario genere solicitudes de desplazamiento para ver todo el contenido del área de cliente. Puede incluir una barra de desplazamiento estándar en una ventana especificando WS_HSCROLL, WS_VSCROLL o ambos estilos al crear la ventana. El estilo WS_HSCROLL crea una barra de desplazamiento horizontal situada en la parte inferior del área de cliente. El estilo WS_VSCROLL crea una barra de desplazamiento vertical situada a la derecha del área de cliente. Los valores de métricas del sistema SM_CXHSCROLL y SM_CYHSCROLL definen el ancho y el alto de una barra de desplazamiento horizontal estándar. Los valores SM_CXVSCROLL y SM_CYVSCROLL definen el ancho y el alto de una barra de desplazamiento vertical estándar. Una barra de desplazamiento estándar forma parte de su ventana asociada y, por lo tanto, no tiene un identificador de ventana propio.
Un control de barra de desplazamiento es una ventana de control que pertenece a la clase de ventana SCROLLBAR. Aparece un control de barra de desplazamiento y funciona como una barra de desplazamiento estándar, pero es una ventana independiente. Como ventana independiente, un control de barra de desplazamiento toma el foco de entrada directo. A diferencia de una barra de desplazamiento estándar, un control de barra de desplazamiento también tiene una interfaz de teclado integrada.
Puede usar tantos controles de barra de desplazamiento como sea necesario en una sola ventana. Al crear un control de barra de desplazamiento, debe especificar el tamaño y la posición de la barra de desplazamiento. Sin embargo, si se puede cambiar el tamaño de la ventana de un control de barra de desplazamiento, se deben realizar ajustes en el tamaño de la barra de desplazamiento cada vez que cambie el tamaño de la ventana.
La ventaja de usar una barra de desplazamiento estándar es que el sistema crea la barra de desplazamiento y establece automáticamente su tamaño y posición. Sin embargo, las barras de desplazamiento estándar a veces son demasiado restrictivas. Por ejemplo, supongamos que desea dividir un área de cliente en cuadrantes y usar un conjunto independiente de barras de desplazamiento para controlar el contenido de cada cuadrante. No puede usar barras de desplazamiento estándar porque solo puede crear un conjunto de barras de desplazamiento para una ventana determinada. En su lugar, use controles de barra de desplazamiento, ya que puede agregar tantos de ellos a una ventana como desee.
Las aplicaciones pueden proporcionar controles de barra de desplazamiento para fines distintos de desplazarse por el contenido de una ventana. Por ejemplo, una aplicación de protector de pantalla podría proporcionar una barra de desplazamiento para establecer la velocidad a la que se mueven los gráficos en la pantalla.
Un control de barra de desplazamiento puede tener una serie de estilos que sirven para controlar la orientación y la posición de la barra de desplazamiento. Especifique los estilos que desee al llamar a la función CreateWindowEx para crear un control de barra de desplazamiento. Algunos de los estilos crean un control de barra de desplazamiento que usa un ancho o alto predeterminados. Sin embargo, siempre debe especificar las coordenadas x e y y las demás dimensiones de la barra de desplazamiento.
Para obtener una tabla de estilos de control de barra de desplazamiento, vea Estilos de control de barra de desplazamiento.
Nota
Para usar estilos visuales con barras de desplazamiento, una aplicación debe incluir un manifiesto y llamar a InitCommonControls al principio del programa. Para obtener información sobre los estilos visuales, vea Estilos visuales. Para obtener información sobre los manifiestos, consulte Habilitación de estilos visuales.
Posición del cuadro de desplazamiento y intervalo de desplazamiento
La posición del cuadro de desplazamiento se representa como un entero; es relativo al extremo izquierdo o superior de la barra de desplazamiento, dependiendo de si la barra de desplazamiento es horizontal o vertical. La posición debe estar dentro de los valores mínimo y máximo del intervalo de desplazamiento. Por ejemplo, en una barra de desplazamiento con un intervalo de 0 a 100, la posición 50 está en el centro, con las posiciones restantes distribuidas igual a lo largo de la barra de desplazamiento. El intervalo inicial depende de la barra de desplazamiento. Las barras de desplazamiento estándar tienen un intervalo inicial de 0 a 100; Los controles de barra de desplazamiento tienen un intervalo vacío (los valores mínimo y máximo son cero), a menos que proporcione un intervalo explícito cuando se cree el control. Puede cambiar el intervalo en cualquier momento. Puede usar la función SetScrollInfo para establecer los valores de rango y la función GetScrollInfo para recuperar los valores de intervalo actuales.
Normalmente, una aplicación ajusta el intervalo de desplazamiento a enteros convenientes, lo que facilita la conversión de la posición del cuadro de desplazamiento en un valor correspondiente al objeto de datos que se va a desplazar. Por ejemplo, si una aplicación debe mostrar 260 líneas de un archivo de texto en una ventana que solo puede mostrar 16 líneas a la vez, el intervalo de barras de desplazamiento vertical se puede establecer en 1 a 244. Si el cuadro de desplazamiento está en la posición 1, la primera línea estará en la parte superior de la ventana. Si el cuadro de desplazamiento está en la posición 244, la última línea (línea 260) estará en la parte inferior de la ventana. Si una aplicación intenta especificar un valor de posición menor que el mínimo o superior al máximo, se usa en su lugar el valor de intervalo de desplazamiento mínimo o máximo.
Puede establecer un tamaño de página para una barra de desplazamiento. El tamaño de página representa el número de unidades de datos que pueden caber en el área cliente de la ventana del propietario según su tamaño actual. Por ejemplo, si el área cliente puede contener 16 líneas de texto, una aplicación establecería el tamaño de página en 16. El sistema usa el tamaño de página, junto con el intervalo de desplazamiento y la longitud del eje de la barra de desplazamiento, para establecer el tamaño del cuadro de desplazamiento. Cada vez que se cambia el tamaño de una ventana que contiene una barra de desplazamiento, una aplicación debe llamar a la función SetScrollInfo para establecer el tamaño de página. Una aplicación puede recuperar el tamaño de página actual llamando a la función GetScrollInfo de envío.
Para establecer una relación útil entre el intervalo de barras de desplazamiento y el objeto de datos, una aplicación debe ajustar el intervalo siempre que cambie el tamaño del objeto de datos.
A medida que el usuario mueve el cuadro de desplazamiento en una barra de desplazamiento, la barra de desplazamiento informa de la posición del cuadro de desplazamiento como un entero en el intervalo de desplazamiento. Si la posición es el valor mínimo, el cuadro de desplazamiento se encuentra en la parte superior de una barra de desplazamiento vertical o en el extremo izquierdo de una barra de desplazamiento horizontal. Si la posición es el valor máximo, el cuadro de desplazamiento se encuentra en la parte inferior de una barra de desplazamiento vertical o al final derecho de una barra de desplazamiento horizontal.
El valor máximo que una barra de desplazamiento puede notificar (es decir, la posición de desplazamiento máxima) depende del tamaño de página. Si la barra de desplazamiento tiene un tamaño de página mayor que uno, la posición máxima de desplazamiento es menor que el valor máximo del intervalo. Puede usar la fórmula siguiente para calcular la posición máxima de desplazamiento:
MaxScrollPos = MaxRangeValue - (PageSize - 1)
Una aplicación debe mover el cuadro de desplazamiento en una barra de desplazamiento. Aunque el usuario realiza una solicitud para desplazarse en una barra de desplazamiento, la barra de desplazamiento no actualiza automáticamente la posición del cuadro de desplazamiento. En su lugar, pasa la solicitud a la ventana primaria, que debe desplazar los datos y actualizar la posición del cuadro de desplazamiento. Una aplicación usa la función SetScrollInfo para actualizar la posición del cuadro de desplazamiento; de lo contrario, usa la función SetScrollPos . Dado que controla el movimiento del cuadro de desplazamiento, la aplicación puede mover el cuadro de desplazamiento en incrementos que funcionan mejor para los datos que se desplazan.
Visibilidad de la barra de desplazamiento
El sistema oculta y deshabilita una barra de desplazamiento estándar cuando se especifican valores mínimos y máximos iguales. El sistema también oculta y deshabilita una barra de desplazamiento estándar si especifica un tamaño de página que incluye todo el intervalo de desplazamiento de la barra de desplazamiento. Esta es la manera de ocultar temporalmente una barra de desplazamiento cuando no es necesaria para el contenido del área de cliente. No es necesario realizar solicitudes de desplazamiento a través de la barra de desplazamiento cuando está oculta. El sistema habilita la barra de desplazamiento y la muestra de nuevo cuando se establecen los valores mínimos y máximos en valores diferentes y cuando el tamaño de página no incluye todo el intervalo de desplazamiento. La función ShowScrollBar también se puede usar para ocultar o mostrar una barra de desplazamiento. No afecta al intervalo, el tamaño de página o la posición del cuadro de desplazamiento de la barra de desplazamiento.
La función EnableScrollBar se puede usar para deshabilitar una o ambas flechas de una barra de desplazamiento. Una aplicación muestra flechas deshabilitadas en gris y no responde a la entrada del usuario.
Solicitudes de barra de desplazamiento
El usuario realiza solicitudes de desplazamiento haciendo clic en varias partes de una barra de desplazamiento. El sistema envía la solicitud a la ventana especificada en forma de un mensaje de WM_HSCROLL o WM_VSCROLL . Una barra de desplazamiento horizontal envía el mensaje WM_HSCROLL ; una barra de desplazamiento vertical envía el mensaje WM_VSCROLL . Cada mensaje incluye un código de solicitud que corresponde a la acción del usuario, al identificador de la barra de desplazamiento (solo controles de barra de desplazamiento) y, en algunos casos, a la posición del cuadro de desplazamiento.
En el diagrama siguiente se muestra el código de solicitud que genera el usuario al hacer clic en varias partes de una barra de desplazamiento.
Los valores de SB_ especifican la acción que realiza el usuario. Una aplicación examina los códigos que acompañan al WM_HSCROLL y WM_VSCROLL mensajes y, a continuación, realiza la operación de desplazamiento adecuada. En la tabla siguiente, se especifica la acción del usuario para cada valor, seguida de la respuesta de la aplicación. En cada caso, la aplicación define una unidad según corresponda para los datos. Por ejemplo, la unidad típica para desplazar el texto verticalmente es una línea de texto.
Request | Acción | Response |
---|---|---|
SB_LINEUP | El usuario hace clic en la flecha de desplazamiento superior. | Disminuye la posición del cuadro de desplazamiento; se desplaza hacia la parte superior de los datos por una unidad. |
SB_LINEDOWN | El usuario hace clic en la flecha de desplazamiento inferior. | Incrementa la posición del cuadro de desplazamiento; se desplaza hacia la parte inferior de los datos por una unidad. |
SB_LINELEFT | El usuario hace clic en la flecha de desplazamiento izquierda. | Disminuye la posición del cuadro de desplazamiento; se desplaza hacia el extremo izquierdo de los datos por una unidad. |
SB_LINERIGHT | El usuario hace clic en la flecha de desplazamiento derecha. | Incrementa la posición del cuadro de desplazamiento; se desplaza hacia el extremo derecho de los datos por una unidad. |
SB_PAGEUP | El usuario hace clic en el eje de la barra de desplazamiento encima del cuadro de desplazamiento. | Disminuye la posición del cuadro de desplazamiento por el número de unidades de datos de la ventana; se desplaza hacia la parte superior de los datos por el mismo número de unidades. |
SB_PAGEDOWN | El usuario hace clic en el eje de la barra de desplazamiento debajo del cuadro de desplazamiento. | Incrementa la posición del cuadro de desplazamiento por el número de unidades de datos de la ventana; se desplaza hacia la parte inferior de los datos por el mismo número de unidades. |
SB_PAGELEFT | El usuario hace clic en el eje de la barra de desplazamiento a la izquierda del cuadro de desplazamiento. | Disminuye la posición del cuadro de desplazamiento por el número de unidades de datos de la ventana; se desplaza hacia el extremo izquierdo de los datos por el mismo número de unidades. |
SB_PAGERIGHT | El usuario hace clic en el eje de la barra de desplazamiento a la derecha del cuadro de desplazamiento. | Incrementa la posición del cuadro de desplazamiento por el número de unidades de datos de la ventana; se desplaza hacia el extremo derecho de los datos por el mismo número de unidades. |
SB_THUMBPOSITION | El usuario libera el cuadro de desplazamiento después de arrastrarlo. | Establece el cuadro de desplazamiento en la posición especificada en el mensaje; desplaza los datos por el mismo número de unidades que se ha movido el cuadro de desplazamiento. |
SB_THUMBTRACK | El usuario arrastra el cuadro de desplazamiento. | Establece el cuadro de desplazamiento en la posición especificada en el mensaje y desplaza los datos por el mismo número de unidades que el cuadro de desplazamiento ha movido para las aplicaciones que dibujan datos rápidamente. Las aplicaciones que no pueden dibujar datos rápidamente deben esperar al código de solicitud de SB_THUMBPOSITION antes de mover el cuadro de desplazamiento y desplazar los datos. |
SB_ENDSCROLL | El usuario suelta el mouse después de mantenerlo en una flecha o en el eje de la barra de desplazamiento. | No se necesita ninguna respuesta. |
Una barra de desplazamiento genera SB_THUMBPOSITION y SB_THUMBTRACK código de solicitud cuando el usuario hace clic y arrastra el cuadro de desplazamiento. Se debe programar una aplicación para procesar el SB_THUMBTRACK o SB_THUMBPOSITION código de solicitud.
El SB_THUMBPOSITION código de solicitud se produce cuando el usuario suelta el botón del mouse después de hacer clic en el cuadro de desplazamiento. Una aplicación que procesa este mensaje realiza la operación de desplazamiento después de que el usuario haya arrastrado el cuadro de desplazamiento a la posición deseada y libere el botón del mouse.
El código de solicitud SB_THUMBTRACK se produce cuando el usuario arrastra el cuadro de desplazamiento. Si una aplicación procesa SB_THUMBTRACK códigos de solicitud, puede desplazar el contenido de una ventana a medida que el usuario arrastra el cuadro de desplazamiento. Sin embargo, una barra de desplazamiento puede generar muchos SB_THUMBTRACK código de solicitud en un breve período, por lo que una aplicación debe procesar estos códigos de solicitud solo si puede volver a dibujar rápidamente el contenido de la ventana.
Interfaz de teclado para una barra de desplazamiento
Un control de barra de desplazamiento proporciona una interfaz de teclado integrada que permite al usuario emitir solicitudes de desplazamiento mediante el teclado; una barra de desplazamiento estándar no. Cuando un control de barra de desplazamiento tiene el foco del teclado, envía WM_HSCROLL y WM_VSCROLL mensajes a su ventana primaria cuando el usuario presiona las teclas de dirección. El código de solicitud se envía con cada mensaje correspondiente a la tecla de flecha que el usuario ha presionado. A continuación se muestran las teclas de dirección y sus códigos de solicitud correspondientes.
Tecla de flecha | Solicitar código |
---|---|
ABAJO | SB_LINEDOWN o SB_LINERIGHT |
FIN | SB_BOTTOM |
INICIO | SB_TOP |
LEFT | SB_LINEUP o SB_LINELEFT |
PGDN | SB_PAGEDOWN o SB_PAGERIGHT |
PGUP | SB_PAGEUP o SB_PAGELEFT |
RIGHT | SB_LINEDOWN o SB_LINERIGHT |
UP | SB_LINEUP o SB_LINELEFT |
Nota
La interfaz de teclado de un control de barra de desplazamiento envía los códigos de solicitud SB_TOP y SB_BOTTOM. El código de solicitud SB_TOP indica que el usuario ha alcanzado el valor superior del intervalo de desplazamiento. Una aplicación desplaza el contenido de la ventana hacia abajo para que la parte superior del objeto de datos esté visible. El código de solicitud SB_BOTTOM indica que el usuario ha alcanzado el valor inferior del intervalo de desplazamiento. Si una aplicación procesa el código de solicitud de SB_BOTTOM, desplaza el contenido de la ventana hacia arriba para que la parte inferior del objeto de datos esté visible.
Si desea una interfaz de teclado para una barra de desplazamiento estándar, puede crear uno usted mismo procesando el mensaje WM_KEYDOWN en el procedimiento de ventana y realizando la acción de desplazamiento adecuada en función del código de tecla virtual que acompaña al mensaje. Para obtener información sobre cómo crear una interfaz de teclado para una barra de desplazamiento, vea Crear una interfaz de teclado para una barra de desplazamiento estándar.
Desplazamiento del área de cliente
La manera más sencilla de desplazar el contenido de un área de cliente es borrarlo y volver a dibujarlo. Este es el método que es probable que una aplicación use con SB_PAGEUP, SB_PAGEDOWN y SB_TOP códigos de solicitud, que normalmente requieren contenido completamente nuevo.
Para algunos códigos de solicitud, como SB_LINEUP y SB_LINEDOWN, no todo el contenido debe borrarse, ya que algunos permanecen visibles después de que se produzca el desplazamiento. La función ScrollWindowEx conserva una parte del contenido del área cliente, mueve la parte conservada una cantidad especificada y, a continuación, prepara el resto del área cliente para pintar información nueva. ScrollWindowEx usa la función BitBlt para mover una parte específica del objeto de datos a una nueva ubicación dentro del área de cliente. Cualquier parte descubierta del área cliente (nada que no se conserva) se invalida, borra y pinta cuando se produce el siguiente mensaje de WM_PAINT .
La función ScrollWindowEx se puede usar para excluir una parte del área cliente de la operación de desplazamiento. Esto mantiene los elementos con posiciones fijas, como ventanas secundarias, desde el movimiento dentro del área de cliente. Invalida automáticamente la parte del área de cliente que va a recibir la nueva información, por lo que la aplicación no tiene que calcular sus propias regiones de recorte. Para obtener más información sobre el recorte, consulte Recorte.
Normalmente, una aplicación desplaza el contenido de una ventana en la dirección opuesta que indica la barra de desplazamiento. Por ejemplo, cuando el usuario hace clic en el eje de la barra de desplazamiento del área debajo del cuadro de desplazamiento, una aplicación desplaza el objeto en la ventana hacia arriba para mostrar una parte del objeto que está debajo de la parte visible.
También puede desplazarse por una región rectangular mediante la función ScrollDC .
Colores y métricas de la barra de desplazamiento
El valor de color definido por el sistema, COLOR_SCROLLBAR, controla el color dentro de un eje de barra de desplazamiento. Use la función GetSysColor para determinar el color del eje de la barra de desplazamiento y la función SetSysColors para establecer el color del eje de la barra de desplazamiento. Sin embargo, tenga en cuenta que este cambio de color afecta a todas las barras de desplazamiento del sistema.
Puede obtener las dimensiones de los mapas de bits que usa el sistema en barras de desplazamiento estándar llamando a la función GetSystemMetrics . A continuación se muestran los valores de métricas del sistema asociados a las barras de desplazamiento.
Métrica del sistema | Descripción |
---|---|
SM_CXHSCROLL | Ancho del mapa de bits de flecha en la barra de desplazamiento horizontal |
SM_CXHTHUMB | Ancho del cuadro de desplazamiento en la barra de desplazamiento horizontal. Este valor recupera el ancho de una barra de desplazamiento que tiene un tamaño de página de cero. |
SM_CXVSCROLL | Ancho del mapa de bits de flecha en la barra de desplazamiento vertical |
SM_CYHSCROLL | Alto del mapa de bits de flecha en la barra de desplazamiento horizontal |
SM_CYVSCROLL | Alto del mapa de bits de flecha en la barra de desplazamiento vertical |
SM_CYVTHUMB | Alto del cuadro de desplazamiento en la barra de desplazamiento vertical. Este valor recupera el alto de una barra de desplazamiento que tiene un tamaño de página de cero. |