以鼠標為中心進行縮放,就像使用百度地圖時一樣。這種方式比一般的以圖像中心點為中心進行縮放更加符合人們的思維慣性。
在網上找了沒發現現成的,自己研究了半天,繞來繞去,頭暈眼花的。后來得到群友的幫助才解決了這個問題。
下面給出由網友霸天虎兄弟提供的方法改寫出來的代碼:
procedure TForm1.Zoom(I: Single);
var
NewW, NewH: Integer;
NewX, NewY, SX, SY: Integer;
A, B: Double;
begin
FScale := FScale + Round(FScale * I);
NewW := Trunc(ImgW * (FScale / 1000));
NewH := Trunc(ImgH * (FScale / 1000));
SX := Image1.Left;
SY := Image1.Top;
if (NewW < ClientWidth) and (NewH < ClientHeight) then begin
// 圖像小於窗口時,居中顯示
NewX := (ClientWidth - NewW) shr 1;
NewY := (ClientHeight - NewH) shr 1;
end else begin
// 窗口顯示不下時
//NewX := SX;
//NewY := SY;
GetCursorPos(Mouse);
Mouse := ScreenToClient(Mouse);
//Mouse := Image1.ClientToParent(Mouse);
A := (Mouse.X - SX) / Image1.Width;
B := (Mouse.Y - SY) / Image1.Height;
NewX := SX - Round((NewW - Image1.Width) * A);
NewY := SY - Round((NewH - Image1.Height) * B);
end;
Image1.SetBounds(NewX, NewY, NewW, NewH);
end;
從上面的代碼中可以看到,首先取得鼠標在圖像顯示客戶區的坐標,然后:
鼠標在縮放前的相對位置 X =(鼠標坐標.X - 圖像縮放前坐標.Left) / 圖像寬度;
鼠標在縮放前的相對位置 Y =(鼠標坐標.Y - 圖像縮放前坐標.Top) / 圖像高度;
得到鼠標在縮放前的相對位置后,再用縮放前的坐標 - 乘以縮放后圖像大小變化的差值(比如原來大小為A, 新大小為B,差值就是 B - A)。
完整demo下載: http://pan.baidu.com/s/1eQovAsa
http://www.cnblogs.com/yangyxd/articles/3984919.html

