Desplazar texto

Ya vimos más arriba, cuando hablamos del mensaje para seleccionar texto, que podemos desplazar el contenido de un control edit hasta el punto donde se encuentre el caret, con el fin de hacerlo visible. Para esto usamos el mensaje EM_SCROLLCARET:

   ...
   SendMessage(hctrl, EM_SETSEL, 1500, 1559);
   SendMessage(hctrl, EM_SCROLLCARET, 0, 0);
   ...

Pero disponemos de otros dos mensajes para desplazar el contenido de un control edit. Por una parte, el mensaje EM_LINESCROLL, nos permite desplazar el texto verticalmente un número de líneas especificado, y desplazar horizontalmente el número de caracteres especificado:

   /* Desplazar texto 20 caracteres a la derecha
      y 10 líneas hacia abajo */
   SendMessage(hctrl, EM_LINESCROLL, 20, 10);

El otro mensaje es EM_SCROLL, que equivale a usar el mensaje WM_VSCROLL, y permite desplazar el texto verticalmente, línea a línea o página a página:

   case CM_PAGINAARRIBA:
      SendMessage(hctrl, EM_SCROLL, SB_PAGEUP, 0);
      break;
   case CM_LINEAARRIBA:
      SendMessage(hctrl, EM_SCROLL, SB_LINEUP, 0);
      break;
   case CM_LINEAABAJO:
      SendMessage(hctrl, EM_SCROLL, SB_LINEDOWN, 0);
      break;
   case CM_PAGINAABAJO:
      SendMessage(hctrl, EM_SCROLL, SB_PAGEDOWN, 0);
      break;

Ejemplo 54


  Nombre Fichero Fecha Tamaño Contador Descarga
D Ejemplo 54 win054.zip 2007-03-15 6385 bytes 137

Caracteres y posiciones

Por último, disponemos de dos mensajes que relacionan los puntos físicos de la pantalla con los caracteres que ocupan esas posiciones. El mensaje EM_CHARFROMPOS nos devuelve el índice del carácter situado en las coordenadas especificadas.

Las coordenadas se proporcionan en el parámetro lParam, la x en la palabra de menor peso, y la y en la de mayor peso. Para crear un valor LPARAM a partir de las coordenadas podemos usar la macro MAKELPARAM.

El valor obtenido contiene en la palabra de mayor peso el índice de la línea, y en la de menor peso, el índice del carácter:

   int indice, indicecaracter;
...
   indice = SendMessage(hctrl, EM_CHARFROMPOS, 0, MAKELPARAM(86,52));
   indicecaracter = LOWORD(indice);
   /* Seleccionar carácter en esa coordenada */
   SendMessage(hctrl, EM_SETSEL, indicecaracter, indicecaracter+1);

El mensaje EM_POSFROMCHAR es el inverso al anterior: a partir de un índice de carácter nos devuelve las coordenadas de ese carácter en pantalla.

Para ello indicaremos en el parámetro wParam el índice del carácter, el valor de retorno contiene las coordenas correspondientes, la x en la palabra de menor peso y la y en la de mayor.

   LRESULT punto;
   char mensaje[128];
...
   punto = SendMessage(hctrl, EM_POSFROMCHAR, 153, 0);
   sprintf(mensaje, "Coordenadas del carácter 153: "
      "(%d, %d)", LOWORD(punto), HIWORD(punto));
   MessageBox(hwnd, mensaje, "EM_POSFROMCHAR", MB_OK);

Ejemplo 55


  Nombre Fichero Fecha Tamaño Contador Descarga
D Ejemplo 55 win055.zip 2007-03-15 5491 bytes 183