C# 在picturebox缩放中重新定位矩形

C# 在picturebox缩放中重新定位矩形,c#,visual-studio,image-resizing,rectangles,C#,Visual Studio,Image Resizing,Rectangles,我在一个面板内有一个pictureBox,可以在鼠标滚轮事件中放大和缩小pictureBox。我现在面临的问题是,当我放大和缩小时,我无法根据新的pictureBox大小设置矩形的位置,正如我们在图片中看到的-,(由于声誉降低,无法上传更多图片)。现在我可以在puctureBox上绘制多个矩形,这些矩形存储在rectList中,rectList是RectangleList的一个变量,它是一个包含Rectangle的自定义类。 我提到了计算绘制的每个矩形的新位置,但没有成功。请帮助我找到新位置,因

我在一个面板内有一个pictureBox,可以在鼠标滚轮事件中放大和缩小pictureBox。我现在面临的问题是,当我放大和缩小时,我无法根据新的pictureBox大小设置矩形的位置,正如我们在图片中看到的-,(由于声誉降低,无法上传更多图片)。现在我可以在puctureBox上绘制多个矩形,这些矩形存储在rectList中,rectList是RectangleList的一个变量,它是一个包含Rectangle的自定义类。 我提到了计算绘制的每个矩形的新位置,但没有成功。请帮助我找到新位置,因为我无法找到计算新位置的方法

下面是鼠标滚轮事件的代码

private void PictureBox1_MouseWheel(object sender, MouseEventArgs e)
    {
        if (e.Delta != 0)
        {
            if (e.Delta <= 0)
            {
                //set minimum size to zoom
                if (pictureBox1.Width < 350)
                    return;
            }
            else
            {
                //set maximum size to zoom
                if (pictureBox1.Width > 10000)
                    return;
            }

            int[] oldRectX = new int[rectList.Count];
            int[] oldRectY = new int[rectList.Count];
            int oldPictureBoxWidth = pictureBox1.Width;
            int oldPictureBoxHeight = pictureBox1.Height;

            for (int i = 0; i < rectList.Count; i++)
            {
                oldRectX[i] = rectList[i].rectangle.X;
                oldRectY[i] = rectList[i].rectangle.Y;
            }

            pictureBox1.Width += Convert.ToInt32(pictureBox1.Width * e.Delta / 1000);
            pictureBox1.Height += Convert.ToInt32(pictureBox1.Height * e.Delta / 1000);

            for (int i = 0; i < rectList.Count; i++)
            {
                rectList[i].rectangle.Width += Convert.ToInt32(rectList[i].rectangle.Width * e.Delta / 1000);
                rectList[i].rectangle.Height += Convert.ToInt32(rectList[i].rectangle.Height * e.Delta / 1000);

                rectList[i].rectangle.X = Convert.ToInt32(oldRectX[i] * (pictureBox1.Width / oldPictureBoxWidth));
                rectList[i].rectangle.Y = Convert.ToInt32(oldRectY[i] * (pictureBox1.Height / oldPictureBoxHeight));
                rectList[i].SetNewLocationOfSubRectList();
            }
            pictureBox1.Location = new Point((pictureBox1.Parent.ClientSize.Width / 2) - (pictureBox1.Width / 2), (pictureBox1.Parent.ClientSize.Height / 2) - (pictureBox1.Height / 2)); // Set the pictureBox1 to Center
            if (pictureBox1.Width > panel1.Width || pictureBox1.Height > panel1.Height)
            {
                Cursor = Cursors.Hand;
                mouseModeEnum = MouseMode.PANNING;
            }
            else
            {
                mouseModeEnum = MouseMode.NONE;
                Cursor = Cursors.Default;
            }
            pictureBox1.Invalidate();
        }
    }
private void PictureBox1\u鼠标滚轮(对象发送器,MouseEventArgs e)
{
如果(e.Delta!=0)
{
如果(如Delta 10000)
返回;
}
int[]oldRectX=新int[rectList.Count];
int[]oldRectY=newint[rectList.Count];
int oldPictureBoxWidth=pictureBox1.Width;
int oldPictureBoxHeight=pictureBox1.高度;
for(int i=0;ipanel1.Width | | pictureBox1.Height>panel1.Height)
{
光标=光标。手;
mouseModeEnum=MouseMode.PANNING;
}
其他的
{
mousemodenum=MouseMode.NONE;
游标=游标。默认值;
}
pictureBox1.Invalidate();
}
}
我试着按照它的建议计算位置的百分比,但不是很令人满意,因为当我将百分比转换为位置(从double转换为int)时,它会截断一些十进制值。如果有更好的方法,请告诉我。 我的新代码是

private void PictureBox1_MouseWheel(object sender, MouseEventArgs e)
    {
        if (e.Delta != 0)
        {
            if (e.Delta <= 0)
            {
                //set minimum size to zoom
                if (pictureBox1.Width < 350)
                    return;
            }
            else
            {
                //set maximum size to zoom
                if (pictureBox1.Width > 10000)
                    return;
            }

            double[] xLocPercent = new double[rectList.Count];
            double[] yLocPercent = new double[rectList.Count];
            double Width = pictureBox1.Width;
            double Height = pictureBox1.Height;

            for (int i = 0; i < rectList.Count; i++)
            {
                double X = rectList[i].rectangle.X;
                double Y = rectList[i].rectangle.Y;

                xLocPercent[i] = (X / Width) * 100;
                yLocPercent[i] = (Y / Height) * 100;
            }

            Width = pictureBox1.Width += Convert.ToInt32(pictureBox1.Width * e.Delta / 1000);
            Height = pictureBox1.Height += Convert.ToInt32(pictureBox1.Height * e.Delta / 1000);

            for (int i = 0; i < rectList.Count; i++)
            {
                rectList[i].rectangle.Width += Convert.ToInt32(rectList[i].rectangle.Width * e.Delta / 1000);
                rectList[i].rectangle.Height += Convert.ToInt32(rectList[i].rectangle.Height * e.Delta / 1000);
                rectList[i].rectangle.X = Convert.ToInt32((Width * xLocPercent[i]) / 100);
                rectList[i].rectangle.Y = Convert.ToInt32((Height * yLocPercent[i]) / 100);
                rectList[i].SetNewLocationOfSubRectList();
            }

            pictureBox1.Location = new Point((pictureBox1.Parent.ClientSize.Width / 2) - (pictureBox1.Width / 2), (pictureBox1.Parent.ClientSize.Height / 2) - (pictureBox1.Height / 2));

            if (pictureBox1.Width > panel1.Width || pictureBox1.Height > panel1.Height)
            {
                Cursor = Cursors.Hand;
                mouseModeEnum = MouseMode.PANNING;
            }
            else
            {
                mouseModeEnum = MouseMode.NONE;
                Cursor = Cursors.Default;
            }
            pictureBox1.Invalidate();
        }
    }
private void PictureBox1\u鼠标滚轮(对象发送器,MouseEventArgs e)
{
如果(e.Delta!=0)
{
如果(如Delta 10000)
返回;
}
double[]xLocPercent=新的double[rectList.Count];
double[]yLocPercent=新的double[rectList.Count];
双倍宽度=图片B1.宽度;
双倍高度=pictureBox1.高度;
for(int i=0;ipanel1.Width | | pictureBox1.Height>panel1.Height)
{
光标=光标。手;
mouseModeEnum=MouseMode.PANNING;
}
其他的
{
mousemodenum=MouseMode.NONE;
游标=游标。默认值;
}
pictureBox1.Invalidate();
}
}

对于正在搜索解决方案的任何人,此示例可能会有所帮助。如果C#是我自己做的。