Mostrar u ocultar barras de desplazamiento

En ocasiones nos puede interesar inhibir u ocultar barras de desplazamiento. Esto es frecuente con las barras estándar, por ejemplo, cuando todo el contenido a mostrar en una ventana cabe en el área de cliente, podemos optar por inhibir las barras de desplazamiento, de modo que sigan siendo visibles, aunque no respondan al usuario, o podemos optar por ocultarlas, dejando que el espacio que ocupan pueda ser usado por el área de cliente.

Con nuestros controles de barra de desplazamiento podemos hacer lo mismo, para ello disponemos de dos funciones:

La función ShowScrollBar nos permite mostrar u ocultar un control de barra de desplazamiento o una barra estándar.

Si se trata de una barra estándar, en el primer parámetro indicaremos la ventana a la que pertenece mediante su manipulador. En el segundo parámetro indicaremos qué barra o barras queremos ocultar o mostrar: SB_HORZ para la horizontal, SB_VERT para la vertical o SB_BOTH para ambas. En el tercer parámetro indicaremos el valor TRUE para hacer visible la barra o FALSE para ocultarla:

  ShowScrollBar(hWnd, SB_VERT, FALSE); // ocultar barra estándar vertical
  ShowScrollBar(hWnd, SB_HORZ, TRUE);  // mostrar barra estándar horizontal

Si se trata de un control de barra de desplazamiento, en el primer parámetro deberemos indicar el manipulador del control. En el segundo parámetro usaremos el valor SB_CTL. El tercero tiene el mismo significado que en el caso anterior:

  ShowScrollBar(GetDlgItem(hwnd, ID_SCR1), SB_CTL, FALSE); // ocultar control de barra de desplazamiento

Deshabilitar o habilitar un control de barra de desplazamiento

Como con cualquier otro control, es posible habilitar o deshabilitar cualquier control de barra de desplazamiento mediante una llamada a la función EnableWindow:

  EnableWindow(GetDlgItem(hwnd, ID_SCR1), TRUE);  // Habilitar
  EnableWindow(GetDlgItem(hwnd, ID_SCR1), FALSE); // Deshabilitar

Deshabilitar o habilitar flechas

Por último, también podemos habilitar o deshabilitar una o ambas flechas de un control de barra de desplazamiento o de una barra de desplazamiento estándar. Bueno, en realidad, deshabilitar ambas flechas equivale a deshabilitar el control completo, pero esto nos da dos formas diferentes de conseguir el mismo resultado.

Usando funciones

Para habilitar o deshabilitar las flechas de una barra de desplazamiento se usa la función EnableScrollBar.

Si se trata de una barra estándar, el primer parámetro debe contener el manipulador de la ventana a la que pertenece la barra. En caso de tratarse de un control, debe ser el manipulador de ventana del propio control.

Para barras estándar, el segundo parámetro puede ser uno de los valores: SB_HORZ, SB_VERT o SB_BOTH, para referirse a la barra estándar horizontal, vertical o ambas, respectivamente. En caso de un control, el valor debe ser SB_CTL.

El tercer parámetro puede tener uno de los valores siguientes:

  • ESB_DISABLE_UP: para deshablitar la flecha hacia arriba en una barra vertical.
  • ESB_DISABLE_LEFT: para deshablitar la flecha hacia la izquierda en una barra horizontal.
  • ESB_DISABLE_LTUP: equivale a las dos anteriores.
  • ESB_DISABLE_DOWN: para deshablitar la flecha hacia abajo en una barra vertical.
  • ESB_DISABLE_RIGHT: para deshablitar la flecha hacia hacia la derecha en una barra horizontal.
  • ESB_DISABLE_RTDN: equivale a las dos anteriores.
  • ESB_DISABLE_BOTH: para deshabilitar ambas flechas.
  • ESB_ENABLE_BOTH: para habilitar ambas flechas.
   EnableScrollBar(hwnd, SB_HORZ, ESB_DISABLE_RIGHT);
   EnableScrollBar(GetDlgItem(hwnd, ID_SCR1), SB_CTL, ESB_DISABLE_UP);

Ya hemos comentado que deshabilitar ambas flechas equivale a deshabilitar la barra completa. Esto es tanto así que para habilitar un control deshabilitado por completo se puede usar tanto la función EnableScrollBar con el valor ESB_ENABLE_BOTH como la función EnableWindow con el valor TRUE.

De forma simétrica, deshabilitar ambas flechas mediante la función EnableScrollBar, ya sea una después de otra o ambas a la vez, equivale a usar la función EnableWindow con el valor FALSE.

Usando mensajes

Además de la función EnableScrollBar, también podemos habilitar o deshabilitar flechas de barras de desplazamiento usando el mensaje SBM_ENABLE_ARROWS.

En este caso, el parámetro lParam no se usa, y debe valer 0. En el parámetro wParam usaremos el mismo valor que en el tercer parámetro de la función EnableScrollBar.

Este mensaje sólo sirve para habilitar o deshabilitar flechas en un control de barra de desplazamiento, y no en una barra estándar. Por supuesto, se debe enviar a una ventana, usando el manipulador de ventana del control.

Como siempre, podemos usar dos funciones para enviar mensajes a un control: SendMessage o SendDlgItemMessage. La primera función la usaremos cuando conozcamos el manipulador de la ventana que debe recibir el mensaje, aunque podríamos usar la función GetDlgItem para obtener ese manipulador, cuando no lo tengamos será más sencillo usar la segunda función. De este modo, estas tres funciones son equivalentes:

   HWND hctl = GetDlgItem(hwnd, ID_SCR1);
   SendMessage(hctl, SBM_ENABLE_ARROWS, ESB_DISABLE_UP, 0);
   SendMessage(GetDlgItem(hwnd, ID_SCR1), SBM_ENABLE_ARROWS, ESB_DISABLE_UP, 0);
   SendDlgItemMessage(hwnd, ID_SCR1, SBM_ENABLE_ARROWS, ESB_DISABLE_UP, 0);

También hemos comentado con anterioridad que a pesar del nombre, la función SendDlgItemMessage sirve para enviar mensajes a controles que estén tanto en cuadros de diálogo como en ventanas normales.

Mensajes de barras de desplazamiento

Los controles de barra de desplazamiento no envían mensajes de notificación. Al contrario que otros controles, todas las barras de desplazamiento envían mensajes WM_HSCROLL o WM_VSCROLL, dependiendo de si se trata de barras horizontales o verticales, respectivamente.

Todo esto se comentó con suficiente detalle en el capítulo 12, por lo que no abundaremos en este tema. Tan sólo añadir un gráfico con los códigos de notificación asociados a cada parte de la barra de desplazamiento. Recordemos que estos códigos se reciben en la palabra de menor peso del parámetro wParam de los mensajes WM_HSCROLL y WM_VSCROLL.

mensajes de barras de desplazamiento