Capítulo 42 Control estático avanzado

En el capítulo 10 ya vimos la mayor parte de lo que se puede decir sobre los controles estáticos. En este capítulo veremos que estos controles no son tan poco interactivos como parecen, y aunque no pueden ser seleccionados, ni pueden recibir el foco, ni responden al teclado; sí puede recibir algunos mensajes de notificación, si se definen con el estilo adecuado.

Insertar controles estáticos durante la ejecución

Empezaremos por ver cómo insertar controles estáticos durante la ejecución. Esto ya no es nada nuevo, el proceso es similar al de los controles que ya hemos visto, la única diferencia es que en este caso se trata de ventanas de la clase STATIC. Para insertar el control también usaremos las funciones CreateWindow y CreateWindowEx.

   HWND hctrl;
...
   hctrl = CreateWindowEx(
      0,
      "STATIC",        /* Nombre de la clase */
      "Texto",         /* Texto del título */
      SS_SIMPLE | 
      WS_CHILD | WS_VISIBLE, /* Estilo */
      5, 5,            /* Posición */
      55, 55,          /* Tamaño */
      hwnd,            /* Ventana padre */
      (HMENU)ID_ESTAT, /* Identificador del control */
      hInstance,       /* Instancia */
      NULL);           /* Sin datos de creación de ventana */

En aquellos controles estáticos que visuelicen texto, el parámetro del título se usará para indicar el texto. En otros casos podrá ser un nombre de fichero, y en el resto se ignora.

El identificador del control se suministra a través del parámetro hMenu, por lo que será necesario hacer un casting.

Sin embargo, con frecuencia no será necesario procesar mensajes de estos controles, ni enviárselos durante la ejecución, de modo que muchas veces podemos usar el mismo identificador para todos ellos. En esos casosno existe ningún valor en especial para usar como identificador, aunque suele usarse el valor -1.

Cambiar fuente

También es posible modificar la fuente de un control estático enviando un mensaje WM_SETFONT. El lugar apropiado es, por supuesto, al procesar el mensaje WM_INITDIALOG en diálogos o al iniciar la ventana, al procesar el mensaje WM_CREATE.

En el parámetro wParam pasamos un manipulador de fuente, y usaremos la macro MAKELPARAM para crear un valor LPARAM, en el que especificaremos la opción de repintar el control, que se almacena en la palabra de menor peso de LPARAM.

Esto nos permite modificar la fuente durante la ejecución, reflejando los cambios en pantalla.

   static HFONT hfont;
...
   hfont = (HFONT)GetStockObject( DEFAULT_GUI_FONT );
   SendMessage(hctrl, WM_SETFONT, (WPARAM)hfont, MAKELPARAM(TRUE, 0));

Cambiar colores

Análogamente a lo que hemos visto con otros controles, también existe un mensaje que nos permite modificar el color de los controles de tipo estático.

Se trata del mensaje WM_CTLCOLORSTATIC, que se envía a la ventana propietaria del control cuando debe ser dibujado.

En el parámetro wParam recibiremos un manipulador de contexto de dispositivo del control, y en el parámetro lParam el manipulador ventana del control. Podemos cambiar el color de fondo y el del texto, y cuando se procese este mensaje, y deberemos retornar un manipulador de pincel, que se usará para pintar el fondo:

   static HBRUSH pincel;
...
      case WM_CREATE:
        pincel = CreateSolidBrush(RGB(0,255,0));
        ...
      case WM_CTLCOLORSTATIC:
        SetTextColor((HDC)wParam, RGB(0,0,255));
        SetBkColor((HDC)wParam, RGB(0,255,0));
        return (LRESULT)pincel;
      case WM_DESTROY:
        DeleteObject(pincel);
        ...