【问题标题】:Dragging Objects in C#在 C# 中拖动对象
【发布时间】:2019-06-01 09:24:37
【问题描述】:

我正在尝试垂直拖动乐谱,上下拖动乐谱。然而,与其一直拖拽,我希望只允许将音符拖到特定的间隔(仅特定的 y 坐标)。例如,在垂直线上,可以将音符拖到坐标 (0,0)、(0,5) 或 (0,10) 上。

下面是我的相关代码:

private Point MouseDownLocation;

private void Note_MouseDown(object sender, MouseEventArgs e)
    {
            foreach (MusicNote mn in panel2.Controls.OfType<MusicNote>())
            {
                if (sender == mn)
                {
                if (e.Button == MouseButtons.Left)
                {
                    MouseDownLocation = e.Location;

                }
            }
            }
    }


 private void Note_MouseMove(object sender, MouseEventArgs e)
    {
        foreach(MusicNote mn in panel2.Controls.OfType<MusicNote>())
        {
            if (sender == mn)
            {
                if (e.Button == MouseButtons.Left)
                {
                    mn.Top = e.Y + mn.Top - MouseDownLocation.Y;
                }
            }
        }
    }

感谢任何帮助。谢谢!

【问题讨论】:

  • 你可以使用这个伟大的nuget package,它将为你完成艰苦的工作
  • @styx 不幸的是这是一个大学项目,所以我需要编写所有代码。

标签: c# forms drag-and-drop picturebox drag


【解决方案1】:

基本上,你需要检查你是向上拖动还是向下拖动 您应该检查 MouseDown.X 并将其与 MouseUp.X(或 Y,如果您也想检查垂直方向)进行比较。重要的是要注意 (0, 0) 是屏幕的左上角。所以你需要比较鼠标按下事件和鼠标抬起事件的 X 位置。

这是一个示例,其中一个标签以 10 的步长上下移动

private void label1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {

                if (label1.Location.Y > 0 && label1.Location.Y < panel1.Size.Height) // not the most accurate way, but you get the idea
                {
                    mPointDown = new Point(e.X, e.Y);
                }


            }
        }

        private void label1_MouseUp(object sender, MouseEventArgs e)
        {
            bool movedUp, movedDown;

            if (e.Y == mPointDown.Y)
            {
                movedUp = movedDown = false;
            }
            else
            {
                movedUp = e.Y < mPointDown.Y;
                movedDown = !movedUp;
            }
            if (movedDown)
            {
                label1.Location = new Point(label1.Location.X, label1.Location.Y + 10);
            }
            else if (movedUp)
            {
                label1.Location = new Point(label1.Location.X, label1.Location.Y - 10);
            }
        }

        private void label1_MouseMove(object sender, MouseEventArgs e)
        {
            mouseDownPoint = e.Location;
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    相关资源
    最近更新 更多