我有一个应用程序,我将Pictureboxes放在Panel上。在我成功实现了Pictureboxes的Drag& Drop之后,我想添加一个Grid选项,以方便地移动Panel上的Pictureboxes。我使用的代码是
private void PB14_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (grid)
{
if (MousePosition.X % 10 == 0)
{
PBList[14].Location = new Point(PList[parent].PointToClient(new Point(MousePosition.X, MousePosition.Y)).X, PBList[14].Location.Y);
}
if (MousePosition.Y % 10 == 0)
{
PBList[14].Location = new Point(PBList[14].Location.X, PList[parent].PointToClient(new Point(MousePosition.X, MousePosition.Y)).Y);
}
}
else
{
...
}
}
}
PList是一个面板列表,PList [parent]是图片框(在Pictureboxlist中)PBList [14]所在的父级。
问题在于Picturebox不能轻松移动,有时它根本不会移动。我发现%操作的某些值更好,有些更糟糕,例如,如果我放
if (MousePosition.X % 30 == 0)
在if语句中,它比10差。
我把if()的值放在标签中,我看到它有时会跳过计算,意味着值从9跳到1,跳过像素应该为0而Picturebox没有移动。
你知道为此目的计算鼠标坐标的更好方法吗?
答案 0 :(得分:0)
问题是当鼠标正好位于其中一个网格点上时,您只能移动任何内容。 一种方法是在每一侧允许一个额外的像素:
if ((MousePosition.X+1) % 30 < 3)
{
int newX = MousePosition.X + 1 - ((MousePosition.X+1) % 30);
PBList[14].Location = new Point(PList[parent].PointToClient(new Point(newX, MousePosition.Y)).X, PBList[14].Location.Y);
}
//Same for Y
答案 1 :(得分:0)
您需要确定网格像素与鼠标位置的最近像素。
PBList[14].Location = new Point(PList[parent].PointToClient(new Point(MousePosition.X - (MousePosition.X % 10) + 5, MousePosition.Y - (MousePosition.Y % 10) + 5)).X);
虽然我在这里设置了关于PointToClient所需参数的困惑。
它的主旨是,重新计算每个鼠标移动的位置,无论它是否直接在你的'网格上10s',如果它与上一个不同,则分配位置(为了节省重新绘制的资源)和通过从合作中减去10的剩余部分来找到最接近的“10s网格”位置
答案 2 :(得分:0)
我能够在我的典型拖放实现中添加对齐网格行为。网格基于Control
&#39; Height
和Width
。如果您愿意,可以使用常量替换control.Height
和control.Width
来更改此设置。您可能还希望阻止Control
被拖出屏幕。
private void OnMouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
control.Left = ((e.X + control.Left) / control.Width) * control.Width;
control.Top = ((e.Y + control.Top) / control.Height) * control.Height;
}
}
如果您希望Control
平滑拖动,而只需在释放鼠标按钮时捕捉到网格:
private void OnMouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
control.Left += e.X - offset.X;
control.Top += e.Y - offset.Y;
}
}
private void OnMouseUp(object sender, MouseEventArgs e)
{
control.Left = ((control.Left + control.Width / 2) / control.Width) * control.Width;
control.Top = ((control.Top + control.Height / 2) / control.Height) * control.Height;
}
private void OnMouseDown(object sender, MouseEventArgs e)
{
offset = e.Location;
}