0

我有一个应用程序,我将图片框放在面板上。在我为图片框成功实现拖放后,我想添加一个网格选项以方便地在面板上移动图片框。我使用的代码是

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] 是图片框(在图片框列表之外)PBList[14] 所在的父级。

问题是 Picturebox 移动不顺畅,有时它根本不动。我发现 % 操作的一些值更好一些更差,例如,如果我把

if (MousePosition.X % 30 == 0)

在 if 语句中,它比 10 差。

我将 if() 的值放在标签中,我看到它有时会跳过计算,这意味着值从 9 跳到 1,跳过了应该为 0 的像素并且 Picturebox 没有移动。

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

4

3 回答 3

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
于 2013-07-31T12:46:28.027 回答
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 所需的参数感到困惑。

它的要点是,重新计算每次鼠标移动的位置,无论它是否直接在您的“10 秒网格”上,如果它与上一个不同,则分配位置(以节省重新绘制的资源)并找到最近的'grid by 10s' 位置通过从 co-ord 中减去 10 的 co-ords 余数

于 2013-07-31T12:52:27.513 回答
0

我能够将对齐网格行为添加到我的典型拖放实现中。网格基于Control'sHeightWidth. 如果您愿意,可以通过用常量替换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;
    }
于 2013-07-31T14:06:40.020 回答