類似地圖的以鼠標為中心縮放圖像


以鼠標為中心進行縮放,就像使用百度地圖時一樣。這種方式比一般的以圖像中心點為中心進行縮放更加符合人們的思維慣性。

在網上找了沒發現現成的,自己研究了半天,繞來繞去,頭暈眼花的。后來得到群友的幫助才解決了這個問題。

下面給出由網友霸天虎兄弟提供的方法改寫出來的代碼:

復制代碼
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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM