C# не может перетащить мою кнопку с помощью мыши

StackOverflow https://stackoverflow.com/questions/19826049

Вопрос

Поэтому я немного искал в Google, чтобы найти код для перетаскивания кнопок с помощью мыши. Я нашел много, хотя ни один из них на самом деле не работал для меня.

Так я спрашиваю тебя! :-)

Код, который я пытаюсь работать в своей форме:

bool isDragged = false;
  Point ptOffset;
  private void button1_MouseDown( object sender, MouseEventArgs e )
  {
     if ( e.Button == MouseButtons.Left )
     {
        isDragged = true;
        Point ptStartPosition = button1.PointToScreen(new Point(e.X, e.Y));

        ptOffset = new Point();
        ptOffset.X = button1.Location.X - ptStartPosition.X;
        ptOffset.Y = button1.Location.Y - ptStartPosition.Y;
     }
     else
     {
        isDragged = false;
     }
  }

  private void button1_MouseMove( object sender, MouseEventArgs e )
  {
     if ( isDragged )
     {
        Point newPoint = button1.PointToScreen(new Point(e.X, e.Y));
        newPoint.Offset(ptOffset);
        button1.Location = newPoint;
     }
  }

  private void button1_MouseUp( object sender, MouseEventArgs e )
  {
     isDragged = false;
  }

Я, конечно, изменил PictureBox1 на Button1.

Но я просто не могу заставить это работать.

Кто -нибудь, кто может знать почему?

О, и я хочу использовать это на всех своих кнопках, так что я должен заменить Button1, чтобы заставить его работать на всех кнопках?

-BTW, я использую Visual Studio Express.

Заранее спасибо!

Это было полезно?

Решение

Несмотря на то, что я на самом деле просто копирую вставку, когда дело доходит до форм Windows

Код, который вы опубликовали, на самом деле ничего не сделает сам по себе!

Для работы, события Mousedown () и Mousemove () контроля должны быть подключены к этим методам:

  1. Выберите элемент управления в форме (PictureBox1).
  2. На панели свойств (внизу справа по умолчанию) нажмите значок «Молния болт», чтобы получить список событий для этого элемента управления.
  3. Найди MouseDown ввести и изменить раскрывающийся вправо от него на pictureBox1_MouseDown.
  4. Найди MouseMove ввести и изменить раскрывающийся вправо от него на pictureBox1_MouseMove.

Теперь запустите его и перетащите PictureBox1.

РЕДАКТИРОВАТЬ: Вот как заставить код работать для нескольких элементов управления, как указано в моем комментарии ниже.

    bool isDragged = false;
    Point ptOffset;

    private void button1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            isDragged = true;
            Button btn = (Button)sender;
            ptOffset = new Point(btn.Location.X - Cursor.Position.X, btn.Location.Y - Cursor.Position.Y);
        }
        else
        {
            isDragged = false;
        }
    }

    private void button1_MouseMove(object sender, MouseEventArgs e)
    {
        if (isDragged)
        {
            Point newPoint = Cursor.Position;
            newPoint.Offset(ptOffset);
            Button btn = (Button)sender;
            btn.Location = newPoint;
        }
    }

    private void button1_MouseUp(object sender, MouseEventArgs e)
    {
        isDragged = false;
    }

Другие советы

Хорошо, хорошие новости: надеюсь, у нас будет настольный макет CSI, как только вы закончите.

Не очень хорошие новости: я думаю, что вы пытаетесь сделать неправильно.

Я предполагаю, что вы используете Winforms, но идея должна быть такой же для WPF. Когда вы запускаете свою программу, установлен макет (или динамически, например, он меняется при изменении размера окна или статически, например, когда вы устанавливаете его с абсолютным положением x, y).

Вы хотите сделать: я хочу получить преимущества их создания всего кода котла, но тогда я хочу динамически изменить его во время выполнения ...

Я думаю, вам нужно переосмыслить свой подход и сделать этот шаг за раз (в конце концов, потребовалось годы Microsoft, чтобы довести графический интерфейс туда, где он находится на данный момент ... потребуется некоторое время, чтобы получить крутой футуристический Графический интерфейс вышел).

Сделайте детские шаги, но имейте в виду общую картину:

  • Начните с определения холста.
  • Тогда вы можете положить на нее кнопку.
  • Затем дурак с перемещением этой кнопки на холсте. (Код, который у вас есть в вашем вопросе, должен работать на объект на холсте).

Оттуда продолжайте делать шаги, которые приведут вас к месту назначения ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top