当窗体调整大小时,在地图上调整图片框的大小

本文关键字:调整 窗体 小时 地图 | 更新日期: 2023-09-27 18:17:40

你好,我正在创建一个地图,它显示了到学校不同班级的路线

https://i.stack.imgur.com/3SnUc.png

它看起来像这样,有一个大的图片框包含整个地图,并停靠到窗体上,然后有很多带有红点的图片框,这是位置和隐藏,直到一个特定的位置被选中,然后正确的一个将显示并告诉房间在哪里。

现在我的问题是,我想有能力调整大小的形式,仍然有红点在地图上的正确位置在完全相同的地方,只是一个更大的尺寸和更小的。因为如果我现在改变大小它会这样做

https://i.stack.imgur.com/CKKdo.png

当程序运行时,它做同样的事情,我不知道如何使它,所以当窗体调整大小时,图片框会调整大小,并在地图上占据相同的位置。

我希望有人能理解这个问题并愿意帮忙。

当窗体调整大小时,在地图上调整图片框的大小

要做到这一点,你需要重新计算点图片框相对于地图图片框大小的位置。

作为起点,你需要你的点图片框的旧的x和y的位置,以及你的地图图片框的高度和宽度,因为他们在调整大小生效之前。

调整大小后,你应该有新的宽度和高度的地图图片框。

从这里你可以计算缩放比例,你需要计算点图片框的新位置。

大致如下:

newDotXPosition = oldDotXPosition * (newMapWidth / oldMapWidth)
newDotYPosition = oldDotYPosition * (newMapHeigth / oldMapHeight)

点状图片框的大小可以相应地处理。

这是我的工作代码,我提取了相关部分:

private int oldXPosition;
private int oldYPosition;
private double oldMapWidth;
private double oldMapHeight;
public Form1()
{
  //stuff, etc
  oldXPosition = pictureBox2.Location.X;
  oldYPosition = pictureBox2.Location.Y;
  oldMapWidth= Width;
  oldMapHeight = Height;
}
private void Form1_Resize(object sender, EventArgs e)
{
  int newXPosition = (int)(oldXPosition * (Width / oldMapWidth));
  int newYPosition = (int)(oldYPosition * (Height / oldMapHeight));
  pictureBox1.Location = new Point(newXPosition, newYPosition);
}

就是这样。仅此而已。我将oldMapWidth/Height设置为double,以避免整数分割。