Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Problemas al mover un TImage

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Problemas al mover un TImage Responder citando

Hola a todos:

Voy a intentar describir lo mejor posible una cosa muy rara que me pasa al mover un TImage.

Tengo el siguiente código dentro del OnMouseMove de un TImage:
Código:

if(moverImg)
  {
    x = Img->Left;
    y = Img->Top;

    if( X < ClickPoint.x )
      x -= ClickPoint.x - X;
    else
      x += X - ClickPoint.x;
    if( Y <ClickPoint>Left = x;
    Img->Top = y;
    }

el código funciona muy bién moviendo el TImage, pero su comportamiento depende de si coloco un Appliation->ProcessMessages(); y donde lo coloque.

Caso 1: si no coloco ningún Appliation->ProcessMessages();, al mover la imagen, se mueve como a saltos, lo hace todo muy bién pero no sigue suavemente el movimiento del ratón, es una sensación como si al ordenador le costase moverlo.

Caso 2: coloco un Appliation->ProcessMessages(); justo debajo de "if(moverImg) {", osea al principio del "if". En este caso, la imagen se mueve muy bién y sigue con suavidad el movimiento del ratón sin el más mínimo sobresalto, ahora parece un super ordendor Wink, va perfecto, pero... cuando dejo de mover el ratón (con el botón izquierdo del ratón aún pulsado), sorpresa! la imagen sigue moviendose sola de forma que repite los movimientos que se han realizado con el ratón! es como si hiciese dos veces lo mismo. En cuando suelto el botón del ratón ya para.

Caso 3: coloco un Appliation->ProcessMessages(); justo debajo de Img->Top = y;, es decir, al final del "if" pero dentro del "if", pasa lo mismo que en el caso 1.

Caso 4: coloco un Appliation->ProcessMessages(); justo debajo de "if(moverImg) {", osea al principio del "if" y otro Appliation->ProcessMessages(); justo debajo de Img->Top = y;, es decir, al final del "if" pero dentro del "if". Resultado: pasa lo mismo que en el caso 1.

Bueno, lo que deseo es poder mover la imagen como en el caso 2 pero sin que repita los movimientos.
Alguien sabe como arreglar esto?

Muchas gracias!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Una de las maneras de poder realizar este efecto es usando un "Panel" como contenedor de la imagen. en relativa puedes usar lo siguiente

1.- Inserta un TPanel en el Formulario donde deseas mover la imagen.
2.- Introduce el TImage dentro del TPanel con la propiead Align = alClient del componete TImage para que se ponga en toda el area cliente del TPanel.
3.- Usa en los eventos del MouseDown tanto del TPanel como del TImage el siguiente codigo.

Para el TPanel

Código:
void __fastcall TForm1::Panel1MouseDown(TObject *Sender, TMouseButton Button,
     TShiftState Shift, int X, int Y)
{
   TPanel *MoviendoPanel = dynamic_cast<TPanel*>(Sender);
   ::ReleaseCapture();
   MoviendoPanel->Perform(WM_NCLBUTTONDOWN,HTCAPTION,0);   
}
//---------------------------------------------------------------------------


para el TImage
Código:

void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button,
     TShiftState Shift, int X, int Y)
{
   TPanel *MoviendoPanel = dynamic_cast<TPanel*>(this->Panel1);
   ::ReleaseCapture();
   MoviendoPanel->Perform(WM_NCLBUTTONDOWN,HTCAPTION,0);

}
//---------------------------------------------------------------------------

_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Hola Isa1976.
Deshabilita HTML para que no confunda los "< >" con etiquetas HTML al escribir tus post, tu código está "amputado".

No lo he probado, pero pienso quel hecho de que tu código medio funcione al colocar Appliation->ProcessMessages(); se debe a que das permiso a procesar mensajes... y entre ellos WM_PAINT.

Creo que si añades, en lugar de Appliation->ProcessMessages(), Repaint o Invalidate, conseguirás el efecto de repintado, que creo que es la causa de los saltitos...

Repito no lo he probado, pero puede ser una idea sencilla de implementar en tu código sin apenas modificarlo.

Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Ya está arreglado!
Gracias a vosotros claro.

He utilizado el médoto de escafandra por que es el que más rapido podía implementar ya que solo he tenido que añadir Img->Repaint(); al final del código va como la seda.
Muchas gracias Cesar por tu aportación Wink, que seguro que funcionaba de maravilla.

He mirado en la ayuda pero he podido entender la diferencia entre Repaint y Refresh, también esta Update, con todas me funciona muy bién.

Gracias por todo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.