 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Isa1976 Lt Cmdr


Registrado: 23 Nov 2005Mensajes: 104
|
Publicado: Jue 06 Nov, 2008 10:07 pm Asunto: Problemas al mover un TImage |
|
|
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 , 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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 07 Nov, 2008 4:30 am Asunto: |
|
|
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);
}
//--------------------------------------------------------------------------- |
_________________
 |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Vie 07 Nov, 2008 8:32 am Asunto: |
|
|
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 |
|
 |
Isa1976 Lt Cmdr


Registrado: 23 Nov 2005Mensajes: 104
|
Publicado: Vie 07 Nov, 2008 5:49 pm Asunto: |
|
|
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 , 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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|