在当前鼠标位置缩放/拉伸图片框

本文关键字:缩放 鼠标 位置 | 更新日期: 2023-09-27 18:34:22

问:如何在图片框上实现当前鼠标位置的缩放,例如在 Google 地图中缩放?

我正在设计一个简单的GIS/地图引擎作为我的论文工作。应用程序的设计方式是将地图加载到略微修改的选项卡控件的选项卡中。

地图是标准的JPEG或PNG格式的数字图像,其中大多数具有非常高的分辨率(2000x2000px及以上(。

它们加载在作为选项卡页的子控件添加的图片框中。我已经实现了一个简单的缩放方法作为按钮单击事件,该事件仅缩放到图像/图片框的中心。

我想做的是实现鼠标滚轮事件的缩放,使图片在图片框内的当前鼠标位置上缩放。

放大代码目前如下所示:

            timesZoomed += 1;
            zoomRatio += 0.1f;
            pbxMapa.Width = pbxMapa.Width * zoomRatio;
            pbxMapa.Height = pbxMapa.Height * zoomRatio;
            pbxMapa.Location = new Point((this.Width / 2) - (pbxMapa.Width / 2), this.Height / 2) - (pbxMapa.Height / 2));
  • 默认的"缩放比率"值为 1,并且正在增加到 0.6f。
  • 参数"timesZoomed"默认值为0,最高可达6。
  • "pbxMapa"是包含地图加载图像的图片框。图片框的"图像大小模式"道具设置为"缩放",但图片框的大小设置为加载的地图图像的完整大小。

另外,我正在试验这个简单的缩放代码。该计算有些有效,但是当以更大的比率缩放/乘法时,它仍然有相当大的偏移量:

                pbxMapa.Location = new Point(pbxMapa.Location.X + (int)((pbxMapa.Location.X * zoomRatio - mouseXPbx) / 8), pbxMapa.Location.Y + (int)((pbxMapa.Location.Y * zoomRatio - mouseYPbx) / 8));
    ">
  • mouseXPbx"和"mouseYPbx"变量表示"pbxMapa"内部的当前鼠标位置。我除以 8 以最小化定位中的偏移。

任何帮助和建议不胜感激,提前感谢。

在当前鼠标位置缩放/拉伸图片框

下面的代码缩放并拉伸了当前鼠标位置上的图片框

pictureBox1.Width = (int)(pictureBox1.Width * zoomratio );
pictureBox1.Height = (int)(pictureBox1.Height * zoomratio );                
pictureBox1.Top = (int)(e.Y - zoomratio * (e.Y - pictureBox1.Top));
pictureBox1.Left = (int)(e.X - zoomratio * (e.X - pictureBox1.Left));

我设法调整了这行代码中位置的计算。它工作正常,它正在按照我需要的方式缩放。

pbxMapa.Location = new Point(pbxMapa.Location.X + (int)(((pbxMapa.Location.X - mouseXPbx) / 10) * zoomRatio), pbxMapa.Location.Y + (int)(((pbxMapa.Location.Y - mouseYPbx) / 10) * zoomRatio));