• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

【Delphi】类似地图的以鼠标为中心缩放图像

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

以鼠标为中心进行缩放,就像使用百度地图时一样。这种方式比一般的以图像中心点为中心进行缩放更加符合人们的思维惯性。

在网上找了没发现现成的,自己研究了半天,绕来绕去,头晕眼花的。后来得到群友的帮助才解决了这个问题。

下面给出由网友霸天虎兄弟提供的方法改写出来的代码:

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

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
【源码】从 GUIDE 到 App Designer 的MATLAB迁移转换工具发布时间:2022-07-18
下一篇:
【转】Matlab中特殊符号的写法发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap