Перетаскивание объектов в C # - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь перетащить музыкальные ноты вертикально вверх и вниз по музыкальному посоху. Однако вместо постоянного перетаскивания я бы хотел, чтобы музыкальные ноты можно было перетаскивать только на определенные интервалы (только конкретные координаты 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;
                }
            }
        }
    }

Любая помощь приветствуется. Спасибо!

1 Ответ

0 голосов
/ 07 января 2019

В основном вам нужно проверить, перетаскиваете ли вы вверх или вниз Вы должны проверить 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;
        }
...