Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Trucos (https://www.clubdelphi.com/foros/forumdisplay.php?f=52)
-   -   Mover una imagen con el ratón (https://www.clubdelphi.com/foros/showthread.php?t=80638)

dec 30-06-2006 23:27:26

Mover una imagen con el ratón
 
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.

Código Delphi [-]
  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?


La franja horaria es GMT +2. Ahora son las 11:07:10.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi