30 Objetos básicos de usuario:
El Caret

Los carets son las marcas intermitentes que nos indican dónde se insertará el texto o los graficos cuando un usuario los introduzca. Normalmente son pequeñas líneas verticales u horizontales, aunque pueden ser rectángulos de distintos tonos o incluso mapas de bits.

Ya sabemos que sólo una ventana puede tener el foco en un determinado momento, de modo que sólo puede mostrarse un caret en un momento determinado, precisamente en la ventana que tiene el foco.

Veremos en este capítulo como crear, modificar, ocultar o mostrar carets.

Recibir y perder el foco

El caret es un recurso compartido, es decir, sólo existe un caret en todo el sistema. Esto implica que debemos tener en cuenta algunos aspectos importantes. Por ejemplo, si nuestra aplicación usa un caret, debe crearlo cada vez que recibe el foco y destruirlo cuando lo pierde, de modo que la nueva aplicación que recibe el foco pueda crear el suyo.

Es importante por lo tanto, saber cuándo nuestra aplicación recibe o pierde el foco, para ello disponemos de dos mensajes muy útiles: WM_SETFOCUS se recibe justo cuando la aplicación recibe el foco, y WM_KILLFOCUS se recibe justo antes de perderlo.

Las aplicaciones que trabajen con carets deben procesar estos dos mensajes. Cuando se recibe WM_SETFOCUS se crea y muestra el caret y cuando se recibe WM_KILLFOCUS se destruye.

Crear y destruir carets

Para crear un caret usaremos la función CreateCaret, que puede crear cualquiera de los carets posibles: verticales, horizontales, sólidos, grises y de mapas de bits.

Esta función precisa de cuatro parámetros. El primero es el manipulador de ventana para la que creamos el caret. El segundo es un manipulador de mapa de bits, si es NULL se creará un caret sólido, si es 1 el caret será gris (trama de puntos), o puede ser un mapa de bits que se usará como figura del caret. El tercer parámetro es la anchura, en unidades lógicas, y el cuarto la altura.

Hay que tener en cuenta que las transformaciones y mapeos afectan al tamaño del caret.

Por ejemplo, para crear un caret vertical:

        case WM_SETFOCUS:
           CreateCaret(hwnd, (HBITMAP)NULL, 0, 20);

Por ejemplo, para crear un caret a partir de un mapa de bits:

        case WM_SETFOCUS:
           CreateCaret(hwnd, hBitmap, 0, 0);

Para destruirlo, cuando perdemos el foco usaremos la función DestroyCaret:

        case WM_SETFOCUS:
           DestroyCaret();
           break;

Mostrar y ocultar carets

Crear un caret no lo muestra automáticamente, es necesario mostrarlo explícitamente mediante la función ShowCaret. Esto completa la respuesta al mensaje de activación del foco:

        case WM_SETFOCUS:
           CreateCaret(hwnd, (HBITMAP)NULL, 0, 20);
           ShowCaret(hwnd);
           break;

Por otra parte, a veces es necesario ocultar el caret, en particular, cuando se actualiza la pantalla, de modo que no interfiera con el contenido de la ventana. Para ocultar el caret se usa la función HideCaret.

Procesar mensajes WM_PAINT

Si no tenemos la precaución de ocultar el caret durante la actualización de la ventana, éste puede interferir con el nuevo contenido, de modo que se corrompa parte del contenido. Cuando nuestra aplicación trabaje con carets y procesemos el mensaje WM_PAINT, debemos ocultar el caret mientras duran la operaciones de actualización:

        case WM_PAINT:
           HideCaret(hwnd);
           hdc = BeginPaint(hwnd, &ps);
           ActualizarPantalla(hdc);
           EndPaint(hwnd, &ps);
           ShowCaret(hwnd);
           break;

Cambiar posición de un caret

Otro parámetro importante con respecto a los carets es su posición en pantalla, ya que se usa para indicar el punto de inserción de texto o de gráficos, normalmente la posición se modificará con mucha frecuencia.

Para cambiar la posición del caret se usa la función SetCaretPos, si necesitamos obtener la posición actual, podemos usar GetCaretPos. La posición del caret se puede modificar aunque el caret esté oculto.

           SetCaretPos(120,120);

Cambiar velocidad de parpadeo de un caret

El caret tiene otra propiedad importante: el parpadeo. La velocidad del parpadeo se puede modificar usando el Panel de Control, pero el API también proporciona una función para modificar esa velocidad, aunque es nuestra responsabilidad que ese cambio sea a petición del usuario, ya que al tratarse de un recurso compartido, todas las aplicaciones pueden verse afectadas por este cambio.

Para asignar un nuevo valor al parpadeo se usa la función SetCaretBlinkTime y para obtener la velocidad actual, GetCaretBlinkTime

           ActualBlink = GetCaretBlinkTime();
           SetCaretBlinkTime(50);

Ejemplo 31

Nombre Fichero Fecha Tamaño Contador Descarga
Ejemplo 31 win031.zip 2004-06-18 27589 bytes 212