Capítulo 44 Control scrollbar avanzado

Terminamos el repaso de los controles más comunes del API de Windows hablando del control de barra de desplazamiento. Vamos a completar el contenido del capítulo 12 con las explicaciones de todos los mensajes y características que no se mencionaron entonces.

Controles de barra de desplazamiento y barras estándar

Las barras de desplazamiento estándar son las que suelen aparecer en la zona derecha e inferior de algunas ventanas.

Aunque aparentemente se trata de cosas similares, existen algunas diferencias entre los controles de barra de desplazamiento y las barras de desplazamiento estándar.

Para empezar, las barras estándar están siempre fuera del área de cliente, mientras que los controles son ventanas que están situadas dentro del área de cliente.

Otra diferencia es que las barras estándar están diseñadas para permitir desplazar el contenido del área de cliente, y para crearlas basta con indicar los estilos de ventana WS_HSCROLL, WS_VSCROLL o ambos. Los controles de barra de desplazamiento se crean como el resto de los controles, ya sea mediante un fichero de recursos o bien insertados durante la ejecución, mediante las funciones CreateWindow o CreateWindowEx.

Otra diferencia es que los controles de barra de desplazamiento, como ventanas que son, pueden recibir el foco del teclado, cosa que no sucede con las barras estándar.

Los controles de barra de desplazamiento también tienen un interfaz de teclado interno.

Insertar controles scrollbar durante la ejecución

Evidentemente, también es posible insertar controles de barra de desplazamiento durante la ejecución. En este caso tendremos que insertar una ventana de la clase "SCROLLBAR". Para insertar el control también usaremos las funciones CreateWindow y CreateWindowEx.

    HWND hctrl;
...
        case WM_CREATE:
           hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
           /* Insertar control Edit */
           hctrl = CreateWindowEx(
              0,
              "SCROLLBAR",    /* Nombre de la clase */
              NULL,           /* Texto del título */
              SBS_HORZ | 
              WS_CHILD | WS_VISIBLE | WS_TABSTOP, /* Estilo */
              5, 5,            /* Posición */
              120, 85          /* Tamaño */
              hwnd,            /* Ventana padre */
              (HMENU)ID_SCROLL,/* Identificador del control */
              hInstance,       /* Instancia */
              NULL);           /* Sin datos de creación de ventana */

Como vemos, usamos los mismos valores que en el fichero de recursos: un identificador, la clase de ventana (en este caso "SCROLLBAR"), una combinación de estilos, la posición y las dimensiones.

Al igual que en los demás controles, el identificador del control se suministra a través del parámetro hMenu, por lo que será necesario hacer un casting a HMENU.

Cambiar colores

No tenemos demasiado control sobre los colores de los controles de barra de desplazamiento. Sólo podemos modificar el color de la zona sobre la que se deplaza el cursor de la barra.

Para ello debemos procesar el mensaje WM_CTLCOLORSCROLLBAR. Como en otros casos, podemos cambiar el color del fondo, usando la función SetBkColor, y debemos devolver un pincel del color usado para pintar ese fondo:

        case WM_CTLCOLORSCROLLBAR:
           SetBkColor((HDC)wParam, RGB(0,255,0));
           return (LRESULT)pincel;

Estilos de scrollbar

En el capítulo 12 sólo mencionamos los estilos básicos SBS_HORZ y SBS_VERT, pero existen algunos más que veremos a continuación.

Estilos de orientación

Los controles de barra de desplazamiento pueden tener dos orientaciones: horizontal o vertical. El estilo SBS_HORZ sirve para crear un control de barra de desplazamiento horizontal. El estilo SBS_VERT, uno vertical.

En el primer caso, si no se especifican los estilos SBS_BOTTOMALIGN o SBS_TOPALIGN, la barra tendrá la altura, anchura y posición especificados por los parámetros usados en la función CreateWindow o CreateWindowEx.

En el segundo caso, si no se especifican los estilos SBS_RIGHTALIGN o SBS_LEFTALIGN, la barra tendrá la altura, anchura y posición especificados por los parámetros usados en la función CreateWindow o CreateWindowEx.

Alineamiento con los bordes

Existen cuatro estilos para alinear el control con cada uno de los cuatro bordes del rectángulo indicado en la función CreateWindow o CreateWindowEx:

SBS_BOTTOMALIGN para alinear un control vertical con el borde superior del rectángulo.

SBS_TOPALIGN para alinear un control vertical con el borde superior del rectángulo.

SBS_LEFTALIGN para alinear un control horizontal con el borde izquierdo del rectángulo.

SBS_RIGHTALIGN para alinear un control horizontal con el borde derecho del rectángulo.

Si se usa cualquiera de estos estilos, el control de barra de desplazamiento tendrá la anchura por defecto para las barras de desplazamiento del sistema, independientemente del tamaño del rectángulo usado en la función.

Opciones para cajas de tamaño

Las cajas de tamaño son barras de desplazamiento con un aspecto diferente. Seguro que las conoces, son los controles que nos permiten cambiar el tamaño de una ventana, y que suelen encontrarse en la esquina inferior derecha de las ventanas que pueden cambiar de tamaño. A veces, estos controles son invisibles, y sólo se distinguen porque cambia el cursor del ratón, mostrando dos flechas con la orientación arriba-izquierda y abajo-derecha. En otras ocasiones son visibles mediante un mapa de bits consistente en tres barras diagonales y paralelas.

Nosotros podemos usar este tipo de controles (aunque su utilidad es francamente limitada), mediante barras de desplazamiento con los estilos siguientes:

SBS_SIZEBOX crea un control de caja de tamaño. Si no se especifican ninguno de los estilos SBS_SIZEBOXBOTTOMRIGHTALIGN o SBS_SIZEBOXTOPLEFTALIGN, el control tendrá la altura, anchura y posición especificados por los parámetros de la llamada a la función CreateWindow o CreateWindowEx.

SBS_SIZEGRIP lo mismo, pero el control se muestra con un borde realzado (sólo funciona correctamente en Windows 95).

Alineamiento de cajas de tamaño

SBS_SIZEBOXBOTTOMRIGHTALIGN alinea la esquina inferior derecha del control con la esquina inferior derecha del rectángulo definido por los parámetros de la función CreateWindow o CreateWindowEx.

SBS_SIZEBOXTOPLEFTALIGN alinea la esquina superior izquierda del size box con la esquina superior izquierda del rectángulo definido por los parámetros de la función CreateWindow o CreateWindowEx.

Si se usa cualquiera de estos dos estilo, la caja de tamaño tendrá el tamaño por defecto para las cajas de tamaño del sistema.

Estos estilos se deben usar conjuntamente con SBS_SIZEBOX o SBS_SIZEGRIP.