Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-10-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Exclamation BitBtl vs Draw

¿Por que los 2 códigos del TTimmer trabajan de diferente forma?

Código Delphi [-]
 
procedure TForm1.FormCreate(Sender: TObject);
begin
   G:= TBitMap.Create;
   G.LoadFromFile(getcurrentdir+'/molecule14.bmp');
   G.TransparentColor:=G.Canvas.Pixels[1,1];
   G.Transparent:= True;
   G.TransparentMode:= tmFixed;
end;

Opción 1 :
Código Delphi [-]
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Canvas.Brush.Color := clBtnFace;
  Canvas.FillRect(Rect(10+i-2, 10, 10+I, 10+G.Height)); //clear old small rect
  Bitblt(Canvas.Handle, 10 + i, 10, G.Width, G.Height, G.Canvas.Handle, 0, 0, SRCCOPY);
  i:=i+2;
end;

Opción 2 :
Código Delphi [-]
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Canvas.Brush.Color := clBtnFace;
  Canvas.FillRect(Rect(10+i-2, 10, 10+I, 10+G.Height)); //clear old small rect
  Canvas.Draw(10+i,10,G);
  i:=i+2;
end;
En un principio cuando no había que transparentar el BitMap cualquier opción valía (BitBtl o Draw) pero cuando intenté transparentar en TForm1.FormCreate, BitBtl no hace nada, y Draw INTENTA transparentar, pero ocurre un efecto especial (adjunto el Archivo) al evento OnMouseMove: al principio transparenta su parte izquierda y luego se completa como era el BitMap originalmente (solo la izquierda) y la derecha está transparentado.

1.- ¿A que se debe todo este efecto con Draw?
2.- ¿Como hacer funcionar el transparente con BitBtl?

Última edición por Deiv fecha: 26-08-2007 a las 00:58:33.
Responder Con Cita
  #2  
Antiguo 23-10-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.293
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Creo que en parte puede ser problema de que el fondo de la imagen no es uniforme.
Prueba con esta imagen y esta línea:

Código Delphi [-]
Bitblt(Canvas.Handle, 10 + i, 10, G.Width, G.Height, G.Canvas.Handle, 0, 0, MERGECOPY);
Archivos Adjuntos
Tipo de Archivo: zip molecule14.zip (10,7 KB, 31 visitas)
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 23-10-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Ok, en este momento no tengo Delphi lo revisaré en casa, pero que hay con:
Cita:
1.- ¿A que se debe todo este efecto con Draw?


en la opción 2?
Responder Con Cita
  #4  
Antiguo 23-10-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Respuesta 1
El efecto se produce porque al dibujar una imagen lo haces sobre la anterior, y las partes transparentes dejan ver los restos de la anterior, de esta manera al ir moviendo la imagen los restos de las imágenes anteriores terminan llenando toda la parte izquierda de la imagen.

Respuesta 2
La función Bitblt es una api que copia un bloque de pixeles de un Device Context a otro, le trae sin cuidado las propiedades del objeto TBitmap. Por eso no hace caso de la propiedad Transparent.

Posible solución:
La solución pasa por usar el método Draw y borrar los restos de la imagen anterior antes de dibujar la actual, además de usar un buffer para evitar el parpadeo. Nos quedaría algo así en el evento del timer:
Código Delphi [-]
procedure TForm1.Timer1Timer(Sender: TObject);
var
  Buffer: TBitmap;
begin
  Canvas.Brush.Color:= clBtnFace;
  Buffer:= TBitmap.Create;
  try
    Buffer.Canvas.Brush.Color:= Canvas.Brush.Color;
    Buffer.Width:= G.Width + 2;
    Buffer.Height:= G.Height + 2;
    Buffer.Canvas.Draw(2,2,G);
    Canvas.Draw(i+10,10,Buffer);
  finally
    Buffer.Free;
  end;
  inc(i,2);
end;
Responder Con Cita
  #5  
Antiguo 23-10-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Wink

He aplicado la nueva imagen de Neftali, su código, y el BitBtl ahora si trabaja bien con el transparente.

Y tal como mencioné un post anterior: Con el Draw (y esta nueva imagen inclusive) no pasa nada, ahora me pareciera que recorriera un "Cometa" al dibujar, inclusive he intentado con DoubleBuffered:=true; y nada

Estoy en un Cafe Internet en este momento y voy leyendo el Post de Seoane (no tengo Delphi a mano), me parece algo sólido lo que explica, lo probaré mas un rato, de todas maneras quería que compartieran "mi cometa"... es decir mi aplicación en la cual se ve ese efecto, es interesante, lo pueden observar.
Archivos Adjuntos
Tipo de Archivo: zip RecorridoCometa.zip (18,5 KB, 40 visitas)
Responder Con Cita
  #6  
Antiguo 24-10-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Adjunto en este post para los que no tienen Delphi a mano un archivo BMP capturado de mi aplicación cuando se mueve "mi cometa"

Cita:
Respuesta 2
La función Bitblt es una api que copia un bloque de pixeles de un Device Context a otro, le trae sin cuidado las propiedades del objeto TBitmap. Por eso no hace caso de la propiedad Transparent.
Ahora que leo con mayor atención, entonces? ¿Como el código de Néftali hace funcionar el transparente en el BitBtl?


Código Delphi [-]
Bitblt(Canvas.Handle, 10 + i, 10, G.Width, G.Height, G.Canvas.Handle, 0, 0, MERGECOPY);

Como dije anteriormente trabaja el BitBtl y transparenta.

¿Como explicar eso???

Última edición por Deiv fecha: 26-08-2007 a las 00:55:58.
Responder Con Cita
  #7  
Antiguo 24-10-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por Deiv

Como dije anteriormente trabaja el BitBtl y transparenta.

¿Como explicar eso???
No querido Deiv, no transparenta. Y si crees que transparenta deberías comprarte un monitor nuevo Lo que hace Bitbtl con la opción MERGECOPY es combinar pixel a pixel con el fondo utilizando la operación booleana AND, como el fondo de la imagen que te paso Neftali es de color blanco al realizar la operación AND el color resultante es el del fondo del formulario (a AND 1 = a), pero si te fijas el resto de colores de la imagen se ven también alterados. De hecho aunque la propiedad Transparent estuviese a FALSE, se obtendría el mismo resultado, porque como ya dije antes, aunque no me creyeras ,al bitbtl le trae sin cuidado.
Responder Con Cita
  #8  
Antiguo 25-10-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.293
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Como bien te han dicho el código que te pasé no transparenta, simplemente que usando el color adecuado, evita los problemas.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #9  
Antiguo 27-10-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Smile

Gracias muchachos, aunque no crean de tiempo sali de duda (casi un año) cuando en un hilo pregunté de otra forma: Evitar parpadeo de imagen Aquí ahora está mas claro, gracias a los Genios como Uds. los novatos salimos de dudas.
Responder Con Cita
  #10  
Antiguo 23-01-2007
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Wink

Hola amigos!

Con motivos de dar estética a mi Aplicación en cuanto a seleccionar una opción, necesito mostrar unas 15 imágenes en un Área de mi Form (superior) en constante movimiento de derecha a izquierda y viceversa, las imágenes tendrán un único tamaño de 100 x 150 pixels, dicha Área tendrá la dimensión de 600 x 200 pixels (donde quepan 5 imágenes separadas). Definiendo que el área será dividida por el medio (300 pixels) de un "Contenedor" deseo al evento OnMouseMove que si el puntero del Mouse se encuentra en la izquierda de este "contenedor" las imágenes deben moverse en sentido contrario (a la derecha), que si el puntero del Mouse se encuentra en la derecha las imágenes deben moverse a la izquierda, y finalmente que si el puntero del Mouse sale del área contenedora las imágenes deben dejar de moverse.

Mis preguntas:
- ¿Cuál "contenedor" (Área) para las imágenes sugieren?: TForm, TPanel, TPaintBox? otro?
- ¿Cómo mostrar las imágenes en ese "contenedor"?: Por código con TImageList, en varias TImage? otro?

En este hilo me enseñaron a mover UNA imagen, lo que no me doy cuenta es como cargar ahora VARIAS imágenes y lograr ese mismo efecto.
Gracias anticipadas.
Responder Con Cita
  #11  
Antiguo 29-01-2007
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Unhappy

Hola amigos,
¿No me encuentran alguna sugerencia? no me doy cuenta cómo cargar varias imágenes, con una era fácil como dije, pero con varias??
Deiv
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 01:23:55.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi