Ver Mensaje Individual
  #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
Reputación: 26
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