[C con Clase] Recortar una imagen en WinApi

Salvador Pozo salvador en conclase.net
Lun Dic 4 19:44:12 CET 2006


El pasado 2006-12-04 12:06:43, Abel escribió:
 
A> Hola Salvador,

Hola:

A> ... eso de almacenar una Región en un array todavía no lo estoy entendiendo bien; ya que en el ejemplo de capítulo 25, no se guardan las regiones, sinó las formas que van a adquirir las regiones. 

Bueno, a mi modo de ver, da lo mismo guardar un dato que guardar una forma de calcular ese dato. En este caso, considero que es equivalente almacenar una región o almacenar un camino que puede generar esa región.

Una región es un objeto GDI, que sólo tiene una representación interna en el API, y que difícilmente se podrá almacenar o recuperar. Sin embargo, un camino es un conjunto de números, y estos son mucho más sencillos de almacenar y manipular.

A> Hace rato me equivoqué en preguntar, lo que quiero hacer es una herencia de la Clase HBITMAP, para indicarle a mi Variable (por decir MiHBITMAP MiMap) que guarde la Foto.bmp a partir de las coordenadas "x,y". De esa forma mi Pincel tambien tomaría esos valores y solo necesitaría colocar las Regiones donde yo quiera pintándolas con MiMap correspondiente.

A lo mejor nos entendemos mejor si transcribes parte del código que usas.

HBITMAP tampoco en una clase (de hecho, en el API de Windows no hay clases en el sentido de POO del término, a lo sumo podemos hablar de clases de ventanas, pero eso es otra cosa).

HBITMAP es un manipulador, y un manipulador no es otra cosa que un número que se usa en el API para referenciar a un objeto, en este caso, un objeto del GDI que contiene un mapa de bits.

Quizás, al hablar de objetos estamos dando una idea equivocada. No se trata de objetos en el sentido de que son instancias de una clase de C++. Son objetos en el sentido de que tiene propiedades comunes con otros objetos análogos.

No me he planteado resolver el problema que nos ocupa personalmente, de modo que no sé exactamente qué camino has tomado ni que consecuencias y problemas se pueden plantear.

En mi primera respuesta sugerí usar la función BitBlt para hacer una copia de la región que nos interesa del mapa de bits que contiene la imagen completa.

Esta función no tiene porque usar un manipulador de DC de pantalla, puede usar un DC de memoria, y por lo tanto, es sencillo obtener mapas de bits de zonas determinadas de un mapa de bits mayor.

Esta técnica se usa, por ejemplo, cuando se almacena en un único mapa de bits todos los gráficos de una barra de herramientas, y permite extraer sólo el correspondiente a una de esas herramientas.

Es lo que se usa, por ejemplo, en el programa de la serpiente con el contador o con los gráficos de la propia serpiente.

A>   Talvez no me explico bien, el problema que ahora tengo es cuando creo una región por decir en las coordenadas 100,100 y le digo que me pinte con la foto que cargué, este no me pinta con la foto a partir de las coordenadas 0,0 sinó tambien busca las coordenadas de la Foto 100,100 y a partir de ahí me pinta.
A>   Naturalmente que almacenando cada Región con su contenido en un array este problema estaría solucionado, pero quería ver esa otra posibilidad, aparte de que todavía no sé cómo se almacenan las Regiones y su contenido en un Array.

No sé si termino de comprender cuando hablas del "contenido" de las regiones. La idea es minimizar recursos. Si se puede almacenar sólo la región, o incluso sólo los datos necesarios para generar la región y a partir de ahí obtener el mapa de bits de la ficha, no considero necesario ni conveniente almacenar los datos correspondientes al mapa de bits.

Existe una norma básica en los programas: "si se puede calcular, no lo guardes".

Esto suele ser cierto en casi todos los casos (salvo cuando las optimizaciones aconsejen lo contrario), y evita muchos errores.

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


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