2013-11-07 4 views
0

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

Так что я прошу вас! :-)

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

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.

Спасибо заранее!

+1

Вы пытаетесь переместить кнопки в приложении, когда вы нажимаете на них? не будет ли это отрицать смысл наличия кнопок, так как они просто перемещаются ...? – Noctis

+0

Ох. Вы знаете, например, iphone, где приложения можно щелкнуть как кнопки, но если вы держите экран, вы можете редактировать, где хотите, чтобы приложения были. Я вроде как создаю что-то, где вы можете перемещать контент. :) – mads232

+0

вы ориентируетесь на телефон? окна? WinForms? МОФ? – Noctis

ответ

1

, даже если я действительно просто скопировать склеивание, когда дело доходит до окон формы

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

на работу, MouseDown() и MouseMove() события управления должны быть подключены к тем методам:

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

Теперь запустите его и перетащите pictureBox1 вокруг.

EDIT: Вот как сделать код для нескольких элементов управления, как указано в моем комментарии ниже.

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; 
    } 
+0

Черт, я глуп. Прошу прощения за твои значки :) Большое спасибо! Вы получите принятый ответ здесь;) Вы решили для меня большую проблему! – mads232

+0

Вы не глупы ... вы учитесь; и это не неудобство. Некоторые обработчики событий действительно работают без необходимости подключения. Эти методы будут иметь 'override' в начале их, и имена обычно начинаются с« Вкл. », Например« OnClick ». Вы поймете разницу ... продолжайте программирование! –

+0

На стороне примечания некоторые языки фактически автоматически связывают метод с конкретным событием, основанным исключительно на соглашении об именах. Собственное наследие VB6 от Microsoft работает таким же образом, как и код в приложениях VBA для MS Office. –

1

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

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

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

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

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

шаги Возьмите ребенка, но имейте в виду общую картину:

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

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

+0

Большое вам спасибо! Немного изменение статуса: -Still не сделал какой-либо перетащить/падение мыши вещь -У создан как рабочий стол с помощью FlowLayoutPanel -Добавлена ​​NewFormIcon как на рабочем столе, и при нажатии на нее, он открывает форма 2 в форме1 (MdiContainer) -Fullscreen mode -Выполнить заявку (Ofcourse) Но не ждите от меня этого! ;) Я сосать на него в значительной степени. – mads232

+0

Все начинаются тяжело ... если вам это нравится, продолжайте делать это ... это станет проще ... :) – Noctis

Смежные вопросы