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