问题描述
我有一个简单的代码块,当您将鼠标悬停时,它会将对象捕捉到最近的30/30网格。
private void pictureBox1_MouseUp(object sender,MouseEventArgs e)
{
int gridCubeWidth = 30;
int gridCubeHeight = 30;
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
double newX = Math.Round(pictureBox1.Left / (double)gridCubeWidth) *
(double)gridCubeWidth;
pictureBox1.Left = (int)newX;
double newY = Math.Round(pictureBox1.Top / (double)gridCubeHeight) *
(double)gridCubeHeight;
pictureBox1.Top = (int)newY;
}
}
这是我设法使它起作用的唯一方法,因为据我所知,pictureBox1.left / top的形式为“ Doubles”,这破坏了我的Math.Round。
我尝试将所有内容更改为Int,并在pictureBox1.Left的前面添加(Int),但这似乎并没有改变。
int newX = Math.Round((int)pictureBox1.Left / gridCubeWidth) * gridCubeWidth;
pictureBox1.Left = newX;
我觉得我正在做的事情有些多余,将所有内容都转换为Doubles,然后再转换为Int,并且实现这一目标的方法要简单得多。
我的主要问题是,为什么(int)pictureBox1.Left
似乎没有将此值转换为Int
解决方法
Left和Top属性是整数。我不明白为什么你需要加倍。看到这里:https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.left?view=netframework-4.8
您应该能够像这样进行四舍五入:int left = (pictureBox1.Left / 30) * 30;