27 Objetos básicos del GDI:
El recorte (Clipping)

El recorte nos permite limitar las salidas del GDI a una determinada zona, definida por una región o por un camino.

La región de recorte es uno de los objetos del GDI que podemos seleccionar en un contexto de dispositivo. Del mismo modo que seleccionamos pinceles, brochas, fuentes, etc.

Regiones de recorte y el mensaje WM_PAINT

Algunos contextos de dispositivo tienen una región de recorte por defecto, por ejemplo, si obtenemos un DC mediante la función BeginPaint, el DC tendrá una región de recorte correspondiente a la región invalidada que ha provocado el mensaje WM_PAINT.

Ya hemos usado la función InvalidateRect para forzar la actualización de parte del área de cliente, normalmente usamos un rectángulo nulo, con lo que se actualiza toda la ventana.

En ese caso, la región de recorte del DC será el rectángulo especificado.

También podemos usar la función InvalidateRgn. Tanto en un caso como en el otro, las sucesivas llamadas a estas funciones actualizan la región de recorte, de modo que la función BeginPaint obtiene la región de recorte resultante.

Otras formas en que esa región se actualiza es cuando parte del área de cliente se oculta proque otras ventanas se superponen. Los rectángulos de esas ventanas componen la región de recorte final, que se recibe al procesar el mensaje WM_PAINT.

Si se obtiene un DC mediante CreateDC o GetDC, no tendremos una región de recorte por defecto.

Funciones relacionadas con el recorte

Existen algunas funciones que se pueden aplicar a la región de recorte asociada a un DC sin necesidad de tener un manipulador de región, directamente sobre el DC:

PtVisible Nos sirve para determinar si un punto está dentro de los límites de la región asociada a un DC.
RectVisible Nos permite determinar si una parte de un rectángulo será visible en en DC.
OffsetClipRgn Para mover la región de recorte en el desplazamiento que queramos.
ExcludeClipRect Elimina un área rectángular de la región de recorte actual.
IntersectClipRect Limita la región de recorte actual a su intersección con un rectángulo dado.

Seleccionar regiones de recorte

Además de las funciones que hemos visto: InvalidateRect e InvalidateRgn, podemos crear una región de recorte directamente a partir de una región.

Como vimos en el capítulo 25, existen funciones que se aplican directamente sobre regiones. Podemos aplicar estas funciones a la región de recorte si previamente obtenemos esa región mediante GetClipRgn, y una vez modificada, volvemos a aplicar la región de recorte mediante SelectClipRgn.

Si usamos un manipulador de región NULL, crearemos una región de recorte nula.

En el ejemplo de este capítulo, cada vez que se debe dibujar el área de cliente, el contenido es diferente, (se trata de líneas paralelas, cada vez más juntas, y alternativamente verticales y horizontales, y en colores rojo y azul). De este modo podemos ver claramente la región de recorte, ya que únicamente esa región se trazará cada vez.

Hemos puesto una opción para crear una zona de recorte rectángular, que obtenermos usando la función InvalidateRect, y otra para una zona elíptica, que obtenemos usando InvalidateRgn con una región que hemos creado mediante CreateEllipticRgn.

Un detalle importante es que la región de recorte se va construyendo a medida que se invalidan las distintas zonas, y sólo cuando el sistema "decide" procesar el mensaje WM_PAINT se actualiza la región de recorte tal como existe en ese momento.

La decisión de procesar el mensaje WM_PAINT depende de la carga de trabajo del sistema, y del modo en que se procesan las distintas órdenes de invalidar, de modo que siempre tiene algo de aleatorio.

También podemos experimentar lo que pasa si partes de la ventana de cliente se tapan por otras ventanas. Veremos que se crea una región con todas las zonas del área de cliente que se han tapado, y que al pasar a primer plano, sólo esas zonas se actualizan.

Caminos de recorte

Además de regiones, podemos usar caminos para definir áreas de recorte. Los caminos nos proporcionan algo más de flexibilidad, ya que podemos usar curvas Bézier para definir sus figuras.

Normalmente usaremos caminos para definir áreas de recorte con el objetivo de crear efectos especiales, como hicimos en el ejemplo del capítulo anterior, creando un camino a partir de un texto, y dibujando puntos aleatoriamente dentro de ese camino.

En el ejemplo de este capítulo usamos un camino de recorte, y también una región para crear efectos con puntos o líneas que se adaptan a ciertas figuras.

Se usa la función SelectClipPath para crear un área de recorte a partir de un camino, y la función SelectClipRgn para hacerlo a partir de una región.

Ejemplo 27

Nombre Fichero Fecha Tamaño Contador Descarga
Ejemplo 27 win027.zip 2004-06-06 3347 bytes 572