Mensajes para controles multilínea

Disponemos de varios mensajes útiles cuando se trabaja con controles edit multilínea, veremos ahora algunos de ellos:

Para obtener el número de caracteres en un control edit se usa el mensaje WM_GETTEXTLENGTH. Los caracteres están indexados empezando en cero, pero es muy importante tener en cuenta que en esta indexación no se incluyen los caracteres de los retornos de línea.

Otro mensaje, más específico de controles edit, y que también se usa para calcular longitudes es EM_LINELENGTH. Este mensaje está orientado a obtener longitudes de líneas en controles multilínea.

El mensaje EM_LINELENGTH requiere un parámetro, que es el índice de un carácter, y devolverá la longitud de la línea a la que pertenece ese carácter. Si ese índice es -1, se devolverá la longitud del texto de las líneas con texto seleccionado, excluyendo la longitud del propio texto seleccionado.

   int longitud;
                   
   /* Longitud de la o las líneas con texto seleccionado, excluyendo el texto seleccionado */
   longitud = SendMessage(hctrl, EM_LINELENGTH, (WPARAM)-1, 0);
   sprintf(mensaje, "Longitud = %d", longitud);
   MessageBox(hwnd, mensaje, "Control edit multilínea", MB_OK);
Selección múltiple
Selección múltiple

En el ejemplo anterior, si recuperamos la longitud del texto con el índice -1, se calculará a partir de los caracteres no seleccionados en la quinta y sexta línea, ya que la selección ocupa ambas líneas.

Los mensajes WM_GETTEXTLENGTH y EM_LINELENGTH funcionan tanto con controles edit de una línea como con los multilínea.

El mensaje EM_GETFIRSTVISIBLELINE obtiene el índice de la primera línea visible en un control multilínea, empezando en cero, o el índice del primer carácter visible en un control edit de una línea.

   int pos;
   
   pos = SendMessage(hctrl, EM_GETFIRSTVISIBLELINE, 0, 0);
   sprintf(mensaje, "Primera línea visible = %d", pos);
   MessageBox(hwnd, mensaje, "Control edit multilínea", MB_OK);

El mensaje EM_GETLINE sirve para obtener el contenido de una línea determinada. Para usar este mensaje se pasa en wParam el índice de la línea a leer, y en lParam un puntero al buffer que recibirá el contenido de la línea. Cuando se envía el mensaje hay que colocar en la primera palabra de ese buffer el tamaño máximo de la cadena a leer:

   char linea[512];
   int longitud;
   
   *(WORD*)linea = 512; /* Longitud del buffer en primera palabra */
   longitud = SendMessage(hctrl, EM_GETLINE, (WPARAM)1, (LPARAM)linea);
   MessageBox(hwnd, linea, "Línea 1", MB_OK);

El mensaje EM_GETLINECOUNT nos devuelve el número de líneas total que contiene un control edit multilínea:

   char mensaje[512];
   int nLineas;
   
   nLineas = SendMessage(hctrl, EM_GETLINECOUNT, 0, 0);
   sprintf(mensaje, "Número de líneas = %d", nLineas);
   MessageBox(hwnd, mensaje, "Contol edit multilínea", MB_OK);

Los mensajes EM_GETLINE y EM_GETLINECOUNT, usados de forma conjunta, nos permiten leer y tratar (por ejemplo guardar en un fichero), el contenido de un control edit multilínea, sin preocuparnos de las rupturas de línea blandas:

void Guardar(HWND hctrl, char *fichero) {
   FILE *fs;
   int nLineas, longitud, i;
   char linea[1024];
   
   fs = fopen(fichero, "w");
   if(fs) {
      nLineas = SendMessage(hctrl, EM_GETLINECOUNT, 0, 0);
      for(i = 0; i < nLineas; i++) {
         *(WORD*)linea = 1024;
         longitud = SendMessage(hctrl, EM_GETLINE, (WPARAM)i, (LPARAM)linea);
         linea[longitud] = 0;
         fprintf(fs, "%s\n", linea);
      }
      fclose(fs);
   }
}

El mensaje EM_LINEINDEX se usa para averiguar el índice del primer carácter de una línea determinada:

   int pos;
   
   pos = SendMessage(hctrl, EM_LINEINDEX, (WPARAM)1, 0);
   sprintf(mensaje, "Índice del primer carácter de la línea 1 = %d", pos);
   MessageBox(hwnd, mensaje, "Control edit multilínea", MB_OK);

El mensaje EM_LINEFROMCHAR devuelve el índice de la línea que contiene el carácter determinado por un índice dado:

   int pos;
   
   pos = SendMessage(hctrl, EM_LINEFROMCHAR, (WPARAM)95, 0);
   sprintf(mensaje, "Índice de la línea que contiene el carácter 95 = %d", pos);
   MessageBox(hwnd, mensaje, "Contol edit multilínea", MB_OK);

Los mensajes EM_LINEINDEX y EM_LINEFROMCHAR sólo son válidos para controles edit multilínea.

Ejemplo 53


  Nombre Fichero Fecha Tamaño Contador Descarga
D Ejemplo 53 win053.zip 2005-11-07 4079 bytes 171