在网格上移动Picturebox是不准确的,因为鼠标位置不准确

时间:2013-07-31 12:15:24

标签: c# winforms mouse

我有一个应用程序,我将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没有移动。

你知道为此目的计算鼠标坐标的更好方法吗?

3 个答案:

答案 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; HeightWidth。如果您愿意,可以使用常量替换control.Heightcontrol.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;
    }