Mayúsculas y minúsculas

Disponemos de dos estilos para los controles edit que nos sirven para limitar el tipo de caracteres que se pueden usar. El estilo ES_LOWERCASE convierte cualquier carácter en mayúscula a minúscula. El contenido del control edit será sólo de letras en minúsculas, números y caracteres especiales. El estilo ES_UPPERCASE convierte cualquier carácter en minúscula a mayúsculas.

El estilo no afecta al contenido de los caracteres del control, podemos asignar valores con mayúsculas o minúsculas con cualquiera de los estilos. Estos estilos afectan sólo a los nuevos caracteres introducidos por el usuario.

Los estilos se pueden asignar en el momento de la creación del control, como hemos hecho hasta ahora mediante ficheros de recursos o mediante las funciones CreateWindow y CreateWindowEx, o se pueden modificar durante la ejecución, usando la función SetWindowLong, y la función GetWindowLong para obtener el estilo actual:

   ActivarEstilo(GetDlgItem(hDlg, ID_TEXTO), estado);
...
void ActivarEstilo(HWND hctrl, int estado)
{
   LONG estiloActual;

   estiloActual = GetWindowLong(hctrl, GWL_STYLE);
   switch(estado) {
      case 0: /* Normal */
         estiloActual &= ~ES_UPPERCASE;
         estiloActual &= ~ES_LOWERCASE;
         break;
      case 1: /* Mayúsculas */
         estiloActual &= ~ES_LOWERCASE;
         estiloActual |= ES_UPPERCASE;
         break;
      case 2: /* Minúsculas */
         estiloActual &= ~ES_UPPERCASE;
         estiloActual |= ES_LOWERCASE;
         break;
   }
   SetWindowLong(hctrl, GWL_STYLE, estiloActual);
}

Ejemplo 52


  Nombre Fichero Fecha Tamaño Contador Descarga
D Ejemplo 52 win052.zip 2005-11-07 3523 bytes 121

Mensajes de notificación

Windows envía un tipo especial de mensajes, denominados mensajes de notificación, a la ventana padre de un control edit. Estos mensajes sirven para informar a la aplicación de determinadas circunstancias relativas a un control.

Los mensajes de notificación se reciben a través de un mensaje WM_COMMAND. En la palabra de menor peso del parámetro wParam se envía el identificador del control. El manipulador del control se envía en el parámetro lParam y el código del mensaje de notificación en la palabra de mayor peso de wParam.

Nota: en el API de Windows 3.x el código del mensaje de notificación se envía en el parámetro lParam. Hay que tener esto en cuenta si se intenta portar código entre estas plataformas.

Veamos a continuación los mensajes de notificación que existen para los controles edit:

Modificación

Cada vez que el usuario modifica el texto de un control edit, primero se actualiza el contenido del control en pantalla, y a continuación se genera un mensaje EN_CHANGE.

Actualización

Cada vez que el usuario modifica el texto del un control Edit, y antes de que este nuevo texto se muestre en pantalla, Windows envía un mensaje EN_UPDATE.

Este mensaje está pensado para permitir a la aplicación redimensionar el tamaño del control en función de su contenido.

Falta espacio

Cuando el control edit no puede consegurir espacio de memoria suficiente para realizar una operación se envía un mensaje de notificación EN_ERRSPACE.

Desplazamiento horizontal y vertical

Cuando el usuario hace clic sobre una barra de desplazamiento de un control edit, horizontal o vertical, se envía el mensaje EN_HSCROLL o EN_VSCROLL, respectivamente, antes de que la pantalla se actualice.

Pérdida y recuperación de foco

Cada vez que el usuario selecciona otro control se envía un mensaje de notificación EN_KILLFOCUS.

Cuando el usuario selecciona un control edit, se envía un mensaje de notificación EN_SETFOCUS.

Texto máximo

El mensaje de notificación EN_MAXTEXT se envía si el usuario intenta escribir más caracteres de los especificados para un control edit.

También se envía este mensaje si la anchura de la cadena introducida en el control es mayor de la anchura del control y no se ha especificado el estilo ES_AUTOHSCROLL, o si el número total de líneas a insertar en un control edit multilínea excede la altura del control y no se ha especificado el estilo ES_AUTOVSCROLL.

Por ejemplo, para gestionar los mensajes de notificación de un control edit con el identificador ID_TEXTO, usaríamos un código parecido a este:

        case WM_COMMAND:
           switch(LOWORD(wParam)) {
              case ID_TEXTO:
                /* Mensajes de notificación */
                switch(HIWORD(wParam)) {
                   case EN_MAXTEXT:
                      MessageBox(hwnd, "Imposible insertar más caracteres", "Control edit", MB_OK);
                      break;
                   case EN_ERRSPACE:
                      ...
                   case EN_HSCROLL:
                      ...
                   case EN_VSCROLL:
                      ...
                   case EN_KILLFOCUS:
                      ...
                   case EN_SETFOCUS:
                      ...
                   case EN_UPDATE:
                      ...
                   case EN_CHANGE:
                      ...
                }
             ...