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
FPunto: TPoint;
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
GetCursorPos(FPunto);
Screen.Cursor := crSizeAll;
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
NuevoPunto: TPoint;
begin
if ssLeft in Shift then begin
GetCursorPos(NuevoPunto);
HorzScrollBar.Position := HorzScrollBar.Position + (FPunto.X - NuevoPunto.X);
VertScrollBar.Position := VertScrollBar.Position + (FPunto.Y - NuevoPunto.Y);
FPunto := NuevoPunto;
end;
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Screen.Cursor := crDefault;
end;
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.