PDA

Ver la Versión Completa : Mover una imagen con el ratón


dec
30-06-2006, 23:27:26
Aunque el título (y la intención original) del truco trata de cómo mover una imagen con el ratón, al estilo de la herramienta "Hand" del Acrobat Reader, este truco es aplicable a cualquier control con barras de desplazamiento.

Como ejemplo supongamos que tenemos una imagen (TImage) dentro de un Form de tal manera que la imagen es más grande que el área del Form, por lo tanto, éste tiene barras de desplazamiento:

Para conseguir esto, hay que jugar con los eventos OnMouseDown, OnMouseMove y OnMouseUp del siguiente modo:

En primer lugar, necesitamos una variable global para almacenar el punto sobre el que se encuentra el cursor en cada momento.


private
{Variables globales -------------------------------------------------------}
FPunto: TPoint;

// Ahora, los eventos:

{OnMouseDown ------------------------------------------------------------------}
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin

{Tomamos la posición del cursor EN LA PANTALLA para evitar que se produzca un
salto en el primer desplazamiento.}
GetCursorPos(FPunto);

{Ponemos un cursor que indique que se va a mover la imagen.}
Screen.Cursor := crSizeAll;

end;{OnMouseDown}

{OnMouseMove ------------------------------------------------------------------}
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
NuevoPunto: TPoint;
begin

if ssLeft in Shift then begin {Movemos la imagen al pinchar sobre la misma.}

{Tomamos las coordenadas de cada nuevo punto al que se mueve el cursor.}
GetCursorPos(NuevoPunto);

{Provocamos el movimiento utilizando las barras de desplazamiento del form.}
HorzScrollBar.Position := HorzScrollBar.Position + (FPunto.X - NuevoPunto.X);
VertScrollBar.Position := VertScrollBar.Position + (FPunto.Y - NuevoPunto.Y);

{Recordamos la nueva posición del cursor.}
FPunto := NuevoPunto;

end;{if ssLeft in Shift}

end;{OnMouseMove}

{OnMouseUp --------------------------------------------------------------------}
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin

{Dejamos el cursor como estaba}
Screen.Cursor := crDefault;

end;{OnMouseUp}


Si p.ej. la imagen (o lo que queremos desplazar) está en un ScrollBox en lugar de directamente sobre el form, en el OnMouseMove tendremos que referirnos a las barras de desplazamiento del ScrollBox en lugar de a las del form.

NOTA:

Es importante el matiz de que tomamos las coordenadas absolutas del cursor en la pantalla (GetCursorPos) y no las coordenadas del evento OnMouseMove (parámetros X e Y). Si no lo hacemos así, el movimiento se produce de forma irregular y poco "suave". Haced la prueba y vereis.

MAXIUM
18-01-2023, 20:35:22
Hola DEC, como siempre, magnífico aportes.

La consulta es, ¿se pueden esconder los scrollbar?