• Domingo 22 de Diciembre de 2024, 13:26

Autor Tema:  Mover De Un Bmp Horizontalmente Sin Parpadeos  (Leído 3451 veces)

Deiv

  • Miembro activo
  • **
  • Mensajes: 67
  • Nacionalidad: bo
    • Ver Perfil
Mover De Un Bmp Horizontalmente Sin Parpadeos
« en: Martes 24 de Enero de 2006, 16:11 »
0
Deseo hacer mover una imagen de izquierda a derecha o viceversa, inicialmente intenté con un TImage, luego con un TBitMap como muestro abajo al evento de un Button OnMouseMove, el primero me parpadea la imagen, el segundo no borra el BitMap.
Código: Text
  1.  
  2. type
  3.    TForm1 = class(TForm)
  4.    Button1: TButton;
  5.    Image1: TImage;
  6.    Timer1: TTimer;
  7.    procedure Button1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  8.    procedure Timer1Timer(Sender: TObject);
  9.    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  10. end;
  11.  
  12. var
  13.   Form1: TForm1;
  14.  
  15. implementation
  16.  
  17. {$R *.dfm}
  18.  
  19. procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  20.   begin
  21.      Timer1.Enabled:=true;
  22.   end;
  23.  
  24. procedure TForm1.Timer1Timer(Sender: TObject);
  25.   begin
  26.      Image1.Left:=Image1.Left + 4;
  27.      if Image1.Left+Image1.width >= Form1.width then
  28.      Timer1.Enabled:=false;
  29.   end;
  30.  
  31. procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  32.   begin
  33.      Timer1.Enabled:=false;
  34.   end;
  35.  
  36. end.
  37.  


LUEGO ME RECOMENDARON UTILIZAR UN TBitMap, PARA EVITAR EL PARPADEO Y ASÍ LO HICE, PERO AQUÍ TENGO EL PROBLEMA DE QUE CONSTANTEMENTE ME REDIBUJA, NO PUEDO HACER QUE UN RATO DIBUJE y luego se Borre (MOVERSE)
Código: Text
  1.  
  2. var
  3.   Form1: TForm1;
  4.   i:integer=0;
  5. implementation
  6.  
  7. {$R *.dfm}
  8.  
  9. procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  10. begin
  11.    G:= TBitMap.Create;
  12.    G.LoadFromFile('E:\molecule14.bmp');
  13.    Timer1.Enabled:=true;
  14. end;
  15.  
  16. procedure TForm1.Timer1Timer(Sender: TObject);
  17. begin
  18.    Canvas.Draw(10+i,10,G);
  19.    i:=i+2;
  20. end;
  21.  
  22. procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  23.   Y: Integer);
  24. begin
  25.    Timer1.Enabled:=false;
  26.    i:=0;
  27. end;
  28.  
  29. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  30. begin
  31.    G.Free;
  32. end;
  33.  
  34. end.
  35.  

¿Como lo soluciono?

Saludos

bartolomeo

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: Mover De Un Bmp Horizontalmente Sin Parpadeos
« Respuesta #1 en: Jueves 26 de Enero de 2006, 19:20 »
0
Y ahas mirado la forma de hacer los intervalos de tiempo aun mas pequeños ?  :blink:

[size=109]Por que Rolo soy yo¡¡¡¡¡[/size]

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Mover De Un Bmp Horizontalmente Sin Parpadeos
« Respuesta #2 en: Jueves 26 de Enero de 2006, 20:49 »
0
Código: Text
  1.  
  2. procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  3. begin
  4.   G:= TBitMap.Create;
  5.   G.LoadFromFile('E:\molecule14.bmp');
  6.   Timer1.Enabled:=true;
  7. end;
  8.  
  9.  

No pues asi no  :blink:  :blink:  :blink:  :blink:  :blink:

Crea el bitmap al crear tu form, destruyelo al destruir el form.

Para mejor control utiliza un Tpaintbox para definir el area grafica dinamica de tu form. Luego en su evento on paint pintas el tbitmap, solo la parte que necesita ser pintada, informacion que te da el clip (OJO que no modificas tu Tbitmap al responder a este evento). Mejor si haces eso con un bitblt() directamente y no con el lento draw. En el evento ontimer preparas la imagen en tu Tbitmap e inmediatamente invalidas el control Tpaintbox o lo refrescas para que llame a su paint y este a la vez al evento on paint.

Deiv

  • Miembro activo
  • **
  • Mensajes: 67
  • Nacionalidad: bo
    • Ver Perfil
Re: Mover De Un Bmp Horizontalmente Sin Parpadeos
« Respuesta #3 en: Domingo 29 de Enero de 2006, 16:23 »
0
Mi poca experiencia en gráficos no me permite entender tu explicación Amilius, he implementado el PaintBox para definir el área de movimiento de mi BMP, pero no entiendo como hacerlo mover (como invalidar el TPaintBox, como dices), en el siguiente código me sigue redibujando una y otra vez sobrepintándose:
Código: Text
  1.  
  2. type
  3.   TForm1 = class(TForm)
  4.     PaintBox1: TPaintBox;
  5.     BitBtn1: TBitBtn;
  6.     Timer1: TTimer;
  7.     procedure BitBtn1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  8.     procedure FormCreate(Sender: TObject);
  9.     procedure Timer1Timer(Sender: TObject);
  10.     procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  11.     procedure FormDestroy(Sender: TObject);
  12.  
  13. var
  14.   Form1: TForm1;
  15.   G:TBitMap;
  16.   i:integer=0;
  17.  
  18. implementation
  19.  
  20. {$R *.dfm}
  21.  
  22. procedure TForm1.BitBtn1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  23. begin
  24.    Timer1.Enabled:=true;
  25. end;
  26.  
  27. procedure TForm1.FormCreate(Sender: TObject);
  28. begin
  29.   G:= TBitMap.Create;
  30.   G.LoadFromFile('E:\molecule14.bmp');
  31. end;
  32.  
  33. procedure TForm1.Timer1Timer(Sender: TObject);
  34. begin
  35.   PaintBox1.Canvas.Draw(10+i,10,G);
  36.   i:=i+2;
  37. end;
  38.  
  39. procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  40. begin
  41.   Timer1.Enabled:=false;
  42.   i:=0;
  43. end;
  44.  
  45. procedure TForm1.FormDestroy(Sender: TObject);
  46. begin
  47.   G.Free;
  48. end;
  49.  
  50. end.
  51.  
Agradeceré una vez mas su orientación.
Saludos

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Mover De Un Bmp Horizontalmente Sin Parpadeos
« Respuesta #4 en: Martes 7 de Febrero de 2006, 21:43 »
0
Aqui:

PaintBox1.Canvas.Draw(10+i,10,G);

Estas pintando directamente sobre el paintbox. Es mejor pintar primero sobre OTRO bitmap, como "SuperficieDeRender" que hace de buffer y luego pasar el resultado final al paintbox cuando sea necesario, algo como:

PaintBox1.Canvas.Draw(0,0,SuperficieDeRender);

Esto ultimo en el evento onpaint del PaintBox.

De esta forma evitas parpadeo al evitar trabajar sobre la memoria de video que tenga asignado el paintbox.

Para invalidar y forzar que sea pintado usas .invalidate(); o bien puedes llamar a .repaint().