Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problemas Con El Gdi De Win

Iniciado por _Grey, 05 de Mayo de 2005, 11:06:05 PM

« anterior - próximo »

_Grey

 Estoy con una clase que me empaqueta todo lo que es una imagen "en si" tratando esta de forma interna el tema de los HDC, mascaras y demas.

La cuestion es que tengo algunas funciones para copiar fragmentos de imagen, normal, con zoom, incluso rotacion, con y sin mascara. Para eso utilizo la funcion PlgBlt con la que puedes hacer todo esto, el problema es que e añadido la posibilidad de invertir la imagen; hacer un efecto espejo en Y o X, pero me encuentro que si bien lo hace correctamente con el el color de la imagen y utilizo su mascara para agregar trasparencias me encuentro con que la aplicacion de la mascara falla, como si se invirtiera solo el bitmap de color. En el caso de la rotacion parece funcionar bien pero cuando el giro es de 180º la mascara se aplica "normal" como si solo girara la parte de color.

Esto es normal ??? se trata de algun bug?? La funcion PlgBlt() me retorna 1, osea que va bien, pero GetDeviceCaps(XXX,RC_BITBLT) un 0, no la puedo usar?? entonces por que funciona normalmente bien??

Tengo la posibilidad de hacerlo por soft, pero claro, pretendia pasar por el GDI siempre que fuera posible, alguien me ilustra?!

Garcias.

[EDIT]
Me olvidaba de algo , la funcion de copia con mascara es esta;

// copia un fragmento de imagen de otro objeto Image
// Objeto Image del que copiar, (x,y) a donde se copia
// (x,y) de donde se copia (width,heght) cuanto se copia
bool Image::CopyColorKey(int xd,int yd,const Image &In,int x,int y,int width,int height,
     int xc,int yc,bool flipx,bool flipy){

// Si imagen bloqueada retorna false, y no continua
if(m_bImageBlock) return false;

// Coordenadas segun el centro de la imagen
xd-=xc;
yd-=yc;

// Corrige coordenadas si invierte la imagen en X o Y
if(flipx) xd--;
if(flipy) yd--;

//int ret=BitBlt(m_hDC,xd,yd,width,height,In.m_hDC,x,y,SRCINVERT);

// int ret=BitBlt(m_hDC,xd,yd,width,height,In.m_hDCMask,x,y,SRCAND);
// ret+=BitBlt(m_hDC,xd,yd,width,height,In.m_hDC,x,y,SRCPAINT);
// Rota una de las esquinas del paralelograma
POINT points[3];

//xd=flipx?xd-1:xd;
//yd=flipy?yd-1:yd;

points[0].x = flipx?xd+width:xd;
points[0].y = flipy?yd+height:yd;

// Rota otra de las esquinas del paralelograma
points[1].x = flipx?xd:xd+width;
points[1].y = flipy?yd+height:yd;

// Rota la esquina restante del paralelograma
points[2].x = flipx?xd+width:xd;
points[2].y = flipy?yd:yd+height;

// Copia la imagen en el DC de la ventana
int ret=PlgBlt(m_hDC,points,In.m_hDC,x,y,width,height,In.m_hBMMask,x,y);

return ret?true:false;
}

Juan Mellado

Para comprobar si RC_BITBLT está soportado: primero tienes que preguntar por RASTERCAPS, y luego ver si el bit correspondiente a RC_BITBLT está activo:


   int rastercaps = GetDeviceCaps(hDC, RASTERCAPS);

   if ( (rastercaps & RC_BITBLT) == 0){

        //No soportado

       }


Lo del no giro de 180 grados de la máscara: ni idea, lo siento.

Saludos

_Grey

 Gracias por el toque! ahora, haciendolo la consulta bien da 1, true, asi que deberia poder hacerlo.

Alguien sabe el por que de estos fallos?!

Gracias.

zupervaca

 yo no te se decir el problema que tienes, pero te puedo dar una pequeña solucion para descubir el problema, haz un exe con algo muy simple y ponlo aqui para que lo bajemos y mirar si a todos nos pasa

saludos

_Grey

 Parece que la cosa esta en que PlgBlt() es para las versiones NT, y no las de casa.

Alguien sabe si es posible un efecto espejo y de rotacion con las funciones del GDI?!, e trapicheado poniendo tamaños en negativo con bitblt() pero me da que no sera tan facil....<_<

Saludos.

zupervaca

 poniendo negativos tendria que funcionarte, por lo menos en Y yo lo he hecho muchas veces, la funcion que usaba para pintar era la bitblt

saludos

_Grey

 He probado un poquito; parece que con StretchBlt() si puedo hacer el efecto pero no con bitblt().

Seguro que lo consigues con bitblt()!?

En fin, gracias, con esto puedo ir avanzando.

zupervaca

 yo creo recordar que si, pero vete tu a saber, hace mucho que no uso el gdi de windows osea que lo mas seguro este equivocado y solo se pueda con strech






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.