[C con Clase] Recortar una Imagen con WinApi

Steven R. Davidson vze266ft en verizon.net
Mie Dic 6 10:58:06 CET 2006


Hola Abel,

Ringo wrote:
> Hola Steven,
> gracias por la respuesta y disculpas si es que algunas cosas no las 
> entiendo desde un principio; el problema es que soy principiante en
> WinApi.

No pasa nada; todos hemos sido principiantes una vez.

> La historia de siempre es que en la teoría se entiende todo, pero la 
> práctica muestra otra cosa. Aqui les envío el código que hasta ahora 
> escribí y algo que todavía no entiendo es que en mi Funcion CTrozo(....) 
> el siguiente código me muestra todas mis Regiones:
> 

Veamos el código.

> for(i=0;i<=3;i++)
>     {
>     FrameRgn(hDC, hRegion[i], pincel, 1, 1);
>     }

Esta función pinta el marco (frame, en inglés) de tu región usando el 
pincel dado con un grosor de las dimensiones indicadas. Como usas un 
bucle, pues pintará marcos de las cuatro regiones que previamente 
creaste. Esto, te puede servir para tu juego, al mostrar un borde o 
marco para las piezas del rompecabezas. Sin embargo, lo anterior no te 
sirve para el problema que tienes entre manos: recortar la imagen 
principal para conformar a la figura de tu pieza.

>  
> pero si lo escribo de la siguiente forma:
> for(i=0;i<=3;i++)
>     {
>     GetClipRgn(hDC,hRegion[i]);
>     SelectClipRgn(hDC,hRegion[i]);
>     FrameRgn(hDC, hRegion[i], pincel, 1, 1);
>     BitBlt(hDC, 0, 0, 320, 320, memDC, 0,0, SRCCOPY);
>     }
> solo me muestra una Región.

Esto es porque has invocado 'GetClipRgn()'. Esta función sirve para 
obtener una copia de la región asociada al DC en cuestión. Sin embargo, 
esto no es lo que quieres, ya que tienes varias regiones que previamente 
creaste en 'hRegion'. Por lo tanto, esto supone otro problema: las 
regiones que creaste en 'hRegion' son reemplazadas por la misma región 
en cada iteración.

Lo que debes hacer es lo siguiente:

for( i=0; i<=3; i++ )
{
   SelectClipRgn( hDC, hRegion[i] );
   FrameRgn( hDC, hRegion[i], pincel, 1,1 );  // Enmarcamos la región
   BitBlt( hDC, 0,0, 320,320, memDC, 0,0, SRCCOPY );
}

Ya está. Antes de dibujar algo en 'hDC', establecemos una nueva región 
que se usará para recortar cualesquier operaciones subsiguientes. En 
nuestro caso, sólo hacemos una operación: 'BitBlt()'.


Espero que esto te ayude.

Steven







Más información sobre la lista de distribución Cconclase