[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